diff --git a/OngekiFumenEditor/App.config b/OngekiFumenEditor/App.config index 8fd90805..b9a1ed79 100644 --- a/OngekiFumenEditor/App.config +++ b/OngekiFumenEditor/App.config @@ -2,6 +2,8 @@ +
+
@@ -11,6 +13,28 @@ + + + True + + + True + + + True + + + + + True + + + True + + + True + + .\Resources\sounds\ diff --git a/OngekiFumenEditor/Modules/AudioPlayerToolViewer/Graphics/WaveformDrawing/DefaultImpls/DefaultWaveformOption.cs b/OngekiFumenEditor/Modules/AudioPlayerToolViewer/Graphics/WaveformDrawing/DefaultImpls/DefaultWaveformOption.cs index 8cc9ba67..2ffcb57d 100644 --- a/OngekiFumenEditor/Modules/AudioPlayerToolViewer/Graphics/WaveformDrawing/DefaultImpls/DefaultWaveformOption.cs +++ b/OngekiFumenEditor/Modules/AudioPlayerToolViewer/Graphics/WaveformDrawing/DefaultImpls/DefaultWaveformOption.cs @@ -1,38 +1,77 @@ using OngekiFumenEditor.Base.Attributes; +using OngekiFumenEditor.Properties; using System.Text.Json.Serialization; namespace OngekiFumenEditor.Modules.AudioPlayerToolViewer.Graphics.WaveformDrawing.DefaultImpls { - public class DefaultWaveformOption : WaveformDrawingOptionBase - { - private bool showTimingLine = true; - [ObjectPropertyBrowserShow] - [JsonInclude] - [ObjectPropertyBrowserAlias(nameof(ShowTimingLine))] - public bool ShowTimingLine - { - get => showTimingLine; - set => Set(ref showTimingLine, value); - } - - private bool showObjectPlaceLine = true; - [ObjectPropertyBrowserShow] - [JsonInclude] - [ObjectPropertyBrowserAlias(nameof(ShowObjectPlaceLine))] - public bool ShowObjectPlaceLine - { - get => showObjectPlaceLine; - set => Set(ref showObjectPlaceLine, value); - } - - private bool showWaveform = true; + public class DefaultWaveformOption : WaveformDrawingOptionBase + { + private bool showTimingLine; + [ObjectPropertyBrowserShow] + [ObjectPropertyBrowserAlias(nameof(ShowTimingLine))] + public bool ShowTimingLine + { + get => showTimingLine; + set + { + Set(ref showTimingLine, value); + DefaultWaveformSettings.Default.ShowTimingLine = value; + } + } + + private bool showObjectPlaceLine; + [ObjectPropertyBrowserShow] + [ObjectPropertyBrowserAlias(nameof(ShowObjectPlaceLine))] + public bool ShowObjectPlaceLine + { + get => showObjectPlaceLine; + set + { + Set(ref showObjectPlaceLine, value); + DefaultWaveformSettings.Default.ShowObjectPlaceLine = value; + } + } + + private bool showWaveform; [ObjectPropertyBrowserShow] - [JsonInclude] [ObjectPropertyBrowserAlias(nameof(ShowWaveform))] public bool ShowWaveform { get => showWaveform; - set => Set(ref showWaveform, value); + set + { + Set(ref showWaveform, value); + DefaultWaveformSettings.Default.ShowWaveform = value; + } + } + + public DefaultWaveformOption() + { + SyncFromSettings(); + } + + private void SyncFromSettings() + { + ShowWaveform = DefaultWaveformSettings.Default.ShowWaveform; + ShowObjectPlaceLine = DefaultWaveformSettings.Default.ShowObjectPlaceLine; + ShowTimingLine = DefaultWaveformSettings.Default.ShowTimingLine; + } + + public override void Reload() + { + DefaultWaveformSettings.Default.Reload(); + SyncFromSettings(); + } + + public override void Reset() + { + DefaultWaveformSettings.Default.Reset(); + SyncFromSettings(); + } + + public override void Save() + { + DefaultWaveformSettings.Default.Save(); } } } diff --git a/OngekiFumenEditor/Modules/AudioPlayerToolViewer/Graphics/WaveformDrawing/DefaultImpls/WaveformDrawingOptionBase.cs b/OngekiFumenEditor/Modules/AudioPlayerToolViewer/Graphics/WaveformDrawing/DefaultImpls/WaveformDrawingOptionBase.cs index 8b97dc05..d3847831 100644 --- a/OngekiFumenEditor/Modules/AudioPlayerToolViewer/Graphics/WaveformDrawing/DefaultImpls/WaveformDrawingOptionBase.cs +++ b/OngekiFumenEditor/Modules/AudioPlayerToolViewer/Graphics/WaveformDrawing/DefaultImpls/WaveformDrawingOptionBase.cs @@ -4,7 +4,7 @@ namespace OngekiFumenEditor.Modules.AudioPlayerToolViewer.Graphics.WaveformDrawing.DefaultImpls { - public class WaveformDrawingOptionBase : PropertyChangedBase, IWaveformDrawingOption + public abstract class WaveformDrawingOptionBase : PropertyChangedBase, IWaveformDrawingOption { [ObjectPropertyBrowserHide] public override bool IsNotifying @@ -14,5 +14,9 @@ public override bool IsNotifying [MethodImpl(MethodImplOptions.AggressiveInlining)] set => base.IsNotifying = value; } - } + + public abstract void Reload(); + public abstract void Reset(); + public abstract void Save(); + } } diff --git a/OngekiFumenEditor/Modules/AudioPlayerToolViewer/Graphics/WaveformDrawing/IWaveformDrawing.cs b/OngekiFumenEditor/Modules/AudioPlayerToolViewer/Graphics/WaveformDrawing/IWaveformDrawing.cs index 1c88662b..979a328c 100644 --- a/OngekiFumenEditor/Modules/AudioPlayerToolViewer/Graphics/WaveformDrawing/IWaveformDrawing.cs +++ b/OngekiFumenEditor/Modules/AudioPlayerToolViewer/Graphics/WaveformDrawing/IWaveformDrawing.cs @@ -3,9 +3,9 @@ namespace OngekiFumenEditor.Modules.AudioPlayerToolViewer.Graphics.WaveformDrawing { - public interface IWaveformDrawing : IDrawing - { - IWaveformDrawingOption Options { get; } - void Draw(IWaveformDrawingContext target, PeakPointCollection samplePeak); - } + public interface IWaveformDrawing : IDrawing + { + IWaveformDrawingOption Options { get; } + void Draw(IWaveformDrawingContext target, PeakPointCollection samplePeak); + } } diff --git a/OngekiFumenEditor/Modules/AudioPlayerToolViewer/Graphics/WaveformDrawing/IWaveformDrawingOption.cs b/OngekiFumenEditor/Modules/AudioPlayerToolViewer/Graphics/WaveformDrawing/IWaveformDrawingOption.cs index 433d9a17..c551475f 100644 --- a/OngekiFumenEditor/Modules/AudioPlayerToolViewer/Graphics/WaveformDrawing/IWaveformDrawingOption.cs +++ b/OngekiFumenEditor/Modules/AudioPlayerToolViewer/Graphics/WaveformDrawing/IWaveformDrawingOption.cs @@ -4,5 +4,8 @@ namespace OngekiFumenEditor.Modules.AudioPlayerToolViewer.Graphics.WaveformDrawi { public interface IWaveformDrawingOption : INotifyPropertyChanged { + void Reset(); + void Reload(); + void Save(); } } diff --git a/OngekiFumenEditor/Modules/AudioPlayerToolViewer/ViewModels/AudioPlayerToolViewerViewModel.WaveformDrawing.cs b/OngekiFumenEditor/Modules/AudioPlayerToolViewer/ViewModels/AudioPlayerToolViewerViewModel.WaveformDrawing.cs index a26acd17..0add59c7 100644 --- a/OngekiFumenEditor/Modules/AudioPlayerToolViewer/ViewModels/AudioPlayerToolViewerViewModel.WaveformDrawing.cs +++ b/OngekiFumenEditor/Modules/AudioPlayerToolViewer/ViewModels/AudioPlayerToolViewerViewModel.WaveformDrawing.cs @@ -238,6 +238,16 @@ private void CleanWaveform() usingPeakData = null; } + public void OnWaveformOptionReset() + { + WaveformDrawing?.Options?.Reset(); + } + + public void OnWaveformOptionSave() + { + WaveformDrawing?.Options?.Save(); + } + public void Render(TimeSpan ts) { #if DEBUG diff --git a/OngekiFumenEditor/Modules/AudioPlayerToolViewer/ViewModels/AudioPlayerToolViewerViewModel.cs b/OngekiFumenEditor/Modules/AudioPlayerToolViewer/ViewModels/AudioPlayerToolViewerViewModel.cs index 1e9ba646..7df4d38a 100644 --- a/OngekiFumenEditor/Modules/AudioPlayerToolViewer/ViewModels/AudioPlayerToolViewerViewModel.cs +++ b/OngekiFumenEditor/Modules/AudioPlayerToolViewer/ViewModels/AudioPlayerToolViewerViewModel.cs @@ -19,243 +19,243 @@ namespace OngekiFumenEditor.Modules.AudioPlayerToolViewer.ViewModels { - [Export(typeof(IAudioPlayerToolViewer))] - public partial class AudioPlayerToolViewerViewModel : Tool, IAudioPlayerToolViewer, IDisposable - { - public override PaneLocation PreferredLocation => PaneLocation.Bottom; + [Export(typeof(IAudioPlayerToolViewer))] + public partial class AudioPlayerToolViewerViewModel : Tool, IAudioPlayerToolViewer, IDisposable + { + public override PaneLocation PreferredLocation => PaneLocation.Bottom; - private float sliderDraggingValue = 0; - private bool isSliderDragging = false; - public float SliderValue - { - get - { - var time = isSliderDragging ? - sliderDraggingValue : - (float)(AudioPlayer?.CurrentTime.TotalMilliseconds ?? 0); - return time; - } - set - { - if (isSliderDragging) - sliderDraggingValue = value; - NotifyOfPropertyChange(() => SliderValue); - } - } + private float sliderDraggingValue = 0; + private bool isSliderDragging = false; + public float SliderValue + { + get + { + var time = isSliderDragging ? + sliderDraggingValue : + (float)(AudioPlayer?.CurrentTime.TotalMilliseconds ?? 0); + return time; + } + set + { + if (isSliderDragging) + sliderDraggingValue = value; + NotifyOfPropertyChange(() => SliderValue); + } + } - private FumenVisualEditorViewModel editor = default; - public FumenVisualEditorViewModel Editor - { - get - { - return editor; - } - set - { - Set(ref editor, value); - FumenSoundPlayer?.Clean(); - AudioPlayer = Editor?.AudioPlayer; - } - } + private FumenVisualEditorViewModel editor = default; + public FumenVisualEditorViewModel Editor + { + get + { + return editor; + } + set + { + Set(ref editor, value); + FumenSoundPlayer?.Clean(); + AudioPlayer = Editor?.AudioPlayer; + } + } - private IAudioPlayer audioPlayer; - public IAudioPlayer AudioPlayer - { - get => audioPlayer; - private set - { - if (audioPlayer is not null) - audioPlayer.OnPlaybackFinished -= OnPlaybackFinished; - Set(ref audioPlayer, value); - if (audioPlayer is not null) - audioPlayer.OnPlaybackFinished += OnPlaybackFinished; + private IAudioPlayer audioPlayer; + public IAudioPlayer AudioPlayer + { + get => audioPlayer; + private set + { + if (audioPlayer is not null) + audioPlayer.OnPlaybackFinished -= OnPlaybackFinished; + Set(ref audioPlayer, value); + if (audioPlayer is not null) + audioPlayer.OnPlaybackFinished += OnPlaybackFinished; - PrepareWaveform(AudioPlayer); - NotifyOfPropertyChange(() => IsAudioButtonEnabled); - } - } + PrepareWaveform(AudioPlayer); + NotifyOfPropertyChange(() => IsAudioButtonEnabled); + } + } - private void OnPlaybackFinished() - { - Dispatcher.CurrentDispatcher.Invoke(() => - { - Log.LogInfo($"OnPlaybackFinished()~~"); - OnStopButtonClicked(); - if (AudioPlayer is not null) - { - var audioTime = AudioPlayer.Duration - TimeSpan.FromSeconds(1); - Editor.ScrollTo(audioTime); - } - }); - } + private void OnPlaybackFinished() + { + Dispatcher.CurrentDispatcher.Invoke(() => + { + Log.LogInfo($"OnPlaybackFinished()~~"); + OnStopButtonClicked(); + if (AudioPlayer is not null) + { + var audioTime = AudioPlayer.Duration - TimeSpan.FromSeconds(1); + Editor.ScrollTo(audioTime); + } + }); + } - private IFumenSoundPlayer fumenSoundPlayer = default; - public IFumenSoundPlayer FumenSoundPlayer - { - get => fumenSoundPlayer; - set - { - Set(ref fumenSoundPlayer, value); + private IFumenSoundPlayer fumenSoundPlayer = default; + public IFumenSoundPlayer FumenSoundPlayer + { + get => fumenSoundPlayer; + set + { + Set(ref fumenSoundPlayer, value); - //init SoundControls - var soundControl = FumenSoundPlayer.SoundControl; - var length = Enum.GetValues().Length; - for (int i = 0; i < length; i++) - SoundControls[i] = soundControl.HasFlag((SoundControl)(1 << i)); - NotifyOfPropertyChange(() => SoundControls); + //init SoundControls + var soundControl = FumenSoundPlayer.SoundControl; + var length = Enum.GetValues().Length; + for (int i = 0; i < length; i++) + SoundControls[i] = soundControl.HasFlag((SoundControl)(1 << i)); + NotifyOfPropertyChange(() => SoundControls); - //init SoundVolumes - var sounds = Enum.GetValues(); - SoundVolumes = sounds.Select(x => new SoundVolumeProxy(value, x)).Where(x => x.IsValid).ToArray(); - NotifyOfPropertyChange(() => SoundVolumes); - } - } + //init SoundVolumes + var sounds = Enum.GetValues(); + SoundVolumes = sounds.Select(x => new SoundVolumeProxy(value, x)).Where(x => x.IsValid).ToArray(); + NotifyOfPropertyChange(() => SoundVolumes); + } + } - public bool[] SoundControls { get; set; } = new bool[Enum.GetValues().Length]; + public bool[] SoundControls { get; set; } = new bool[Enum.GetValues().Length]; - public SoundVolumeProxy[] SoundVolumes { get; set; } = new SoundVolumeProxy[0]; + public SoundVolumeProxy[] SoundVolumes { get; set; } = new SoundVolumeProxy[0]; - public float SoundVolume - { - get => IoC.Get().SoundVolume; - set - { - IoC.Get().SoundVolume = value; - NotifyOfPropertyChange(() => SoundVolume); - } - } + public float SoundVolume + { + get => IoC.Get().SoundVolume; + set + { + IoC.Get().SoundVolume = value; + NotifyOfPropertyChange(() => SoundVolume); + } + } - public bool IsAudioButtonEnabled => AudioPlayer is not null; + public bool IsAudioButtonEnabled => AudioPlayer is not null; - public AudioPlayerToolViewerViewModel() - { - DisplayName = Resources.AudioPlayerToolViewer; - FumenSoundPlayer = IoC.Get(); - IoC.Get().OnActivateEditorChanged += OnActivateEditorChanged; - Editor = IoC.Get().CurrentActivatedEditor; + public AudioPlayerToolViewerViewModel() + { + DisplayName = Resources.AudioPlayerToolViewer; + FumenSoundPlayer = IoC.Get(); + IoC.Get().OnActivateEditorChanged += OnActivateEditorChanged; + Editor = IoC.Get().CurrentActivatedEditor; UpdateActualRenderInterval(); CompositionTarget.Rendering += CompositionTarget_Rendering; } - private void OnActivateEditorChanged(FumenVisualEditorViewModel @new, FumenVisualEditorViewModel old) - { - Editor = @new; - this.RegisterOrUnregisterPropertyChangeEvent(old, @new, OnEditorPropertyChanged); - } + private void OnActivateEditorChanged(FumenVisualEditorViewModel @new, FumenVisualEditorViewModel old) + { + Editor = @new; + this.RegisterOrUnregisterPropertyChangeEvent(old, @new, OnEditorPropertyChanged); + } - private void OnEditorPropertyChanged(object sender, PropertyChangedEventArgs e) - { - switch (e.PropertyName) - { - case nameof(FumenVisualEditorViewModel.EditorProjectData): - Editor = Editor; - break; - case nameof(FumenVisualEditorViewModel.AudioPlayer): - AudioPlayer = Editor?.AudioPlayer; - break; - default: - break; - } - } + private void OnEditorPropertyChanged(object sender, PropertyChangedEventArgs e) + { + switch (e.PropertyName) + { + case nameof(FumenVisualEditorViewModel.EditorProjectData): + Editor = Editor; + break; + case nameof(FumenVisualEditorViewModel.AudioPlayer): + AudioPlayer = Editor?.AudioPlayer; + break; + default: + break; + } + } - private void CompositionTarget_Rendering(object sender, EventArgs e) - { - if (AudioPlayer is null) - return; - if (!AudioPlayer.IsPlaying) - return; - Process(AudioPlayer.CurrentTime); - } + private void CompositionTarget_Rendering(object sender, EventArgs e) + { + if (AudioPlayer is null) + return; + if (!AudioPlayer.IsPlaying) + return; + Process(AudioPlayer.CurrentTime); + } - private void Process(TimeSpan time) - { - if (Editor is null) - return; - NotifyOfPropertyChange(() => SliderValue); - var tGrid = TGridCalculator.ConvertAudioTimeToTGrid(time, Editor); - Editor.ScrollTo(tGrid); - } + private void Process(TimeSpan time) + { + if (Editor is null) + return; + NotifyOfPropertyChange(() => SliderValue); + var tGrid = TGridCalculator.ConvertAudioTimeToTGrid(time, Editor); + Editor.ScrollTo(tGrid); + } - public void OnStopButtonClicked() - { - //Editor.UnlockAllUserInteraction(); - FumenSoundPlayer?.Stop(); - AudioPlayer?.Stop(); - } + public void OnStopButtonClicked() + { + //Editor.UnlockAllUserInteraction(); + FumenSoundPlayer?.Stop(); + AudioPlayer?.Stop(); + } - public void OnSliderValueStartChanged() - { - sliderDraggingValue = SliderValue; - isSliderDragging = true; - Log.LogDebug($"Begin drag, from : {SliderValue}"); - } + public void OnSliderValueStartChanged() + { + sliderDraggingValue = SliderValue; + isSliderDragging = true; + Log.LogDebug($"Begin drag, from : {SliderValue}"); + } - public async void RequestPlayOrPause() - { - if (AudioPlayer is null) - { - Log.LogWarn($"音频未加载!"); - return; - } - if (!AudioPlayer.IsAvaliable) - { - Log.LogWarn($"音频还没准备好!"); - return; - } - if (AudioPlayer.IsPlaying) - { - OnStopButtonClicked(); - } - else - { - await FumenSoundPlayer.Prepare(Editor, AudioPlayer); - var tgrid = Editor.GetCurrentTGrid(); - var seekTo = TGridCalculator.ConvertTGridToAudioTime(tgrid, Editor); - Log.LogDebug($"seek to {tgrid}({seekTo})"); - AudioPlayer.Seek(seekTo, false); - FumenSoundPlayer.Seek(seekTo, false); - } - } + public async void RequestPlayOrPause() + { + if (AudioPlayer is null) + { + Log.LogWarn($"音频未加载!"); + return; + } + if (!AudioPlayer.IsAvaliable) + { + Log.LogWarn($"音频还没准备好!"); + return; + } + if (AudioPlayer.IsPlaying) + { + OnStopButtonClicked(); + } + else + { + await FumenSoundPlayer.Prepare(Editor, AudioPlayer); + var tgrid = Editor.GetCurrentTGrid(); + var seekTo = TGridCalculator.ConvertTGridToAudioTime(tgrid, Editor); + Log.LogDebug($"seek to {tgrid}({seekTo})"); + AudioPlayer.Seek(seekTo, false); + FumenSoundPlayer.Seek(seekTo, false); + } + } - public void OnSoundControlSwitchChanged(FrameworkElement sender) - { - var sc = 0; - var length = Enum.GetValues().Length; - for (int i = 0; i < length; i++) - sc = sc | (SoundControls[i] ? (1 << i) : 0); - if (FumenSoundPlayer is IFumenSoundPlayer player) - player.SoundControl = (SoundControl)sc; + public void OnSoundControlSwitchChanged(FrameworkElement sender) + { + var sc = 0; + var length = Enum.GetValues().Length; + for (int i = 0; i < length; i++) + sc = sc | (SoundControls[i] ? (1 << i) : 0); + if (FumenSoundPlayer is IFumenSoundPlayer player) + player.SoundControl = (SoundControl)sc; - //Log.LogDebug($"Apply sound control:{(SoundControl)sc}"); - NotifyOfPropertyChange(() => SoundControls); - } + //Log.LogDebug($"Apply sound control:{(SoundControl)sc}"); + NotifyOfPropertyChange(() => SoundControls); + } - public async void OnReloadSoundFiles() - { - if (AudioPlayer is null || FumenSoundPlayer is null) - { - MessageBox.Show(Resources.WaitForAudioAndFumenLoaded); - return; - } + public async void OnReloadSoundFiles() + { + if (AudioPlayer is null || FumenSoundPlayer is null) + { + MessageBox.Show(Resources.WaitForAudioAndFumenLoaded); + return; + } - if (AudioPlayer.IsPlaying) - { - MessageBox.Show(Resources.PauseAudioAndFumen); - return; - } + if (AudioPlayer.IsPlaying) + { + MessageBox.Show(Resources.PauseAudioAndFumen); + return; + } - var result = await FumenSoundPlayer.ReloadSoundFiles(); + var result = await FumenSoundPlayer.ReloadSoundFiles(); - if (result) - { - MessageBox.Show(Resources.SoundLoaded); - } - } + if (result) + { + MessageBox.Show(Resources.SoundLoaded); + } + } - public void Dispose() - { - CompositionTarget.Rendering -= CompositionTarget_Rendering; - } - } + public void Dispose() + { + CompositionTarget.Rendering -= CompositionTarget_Rendering; + } + } } diff --git a/OngekiFumenEditor/Modules/AudioPlayerToolViewer/Views/AudioPlayerToolViewerView.xaml b/OngekiFumenEditor/Modules/AudioPlayerToolViewer/Views/AudioPlayerToolViewerView.xaml index 15bfc9e6..4d0deae2 100644 --- a/OngekiFumenEditor/Modules/AudioPlayerToolViewer/Views/AudioPlayerToolViewerView.xaml +++ b/OngekiFumenEditor/Modules/AudioPlayerToolViewer/Views/AudioPlayerToolViewerView.xaml @@ -104,9 +104,28 @@ Step="0.01" /> - - - + + + + + + + + + + + + + diff --git a/OngekiFumenEditor/OngekiFumenEditor.csproj b/OngekiFumenEditor/OngekiFumenEditor.csproj index 617446d1..bb366296 100644 --- a/OngekiFumenEditor/OngekiFumenEditor.csproj +++ b/OngekiFumenEditor/OngekiFumenEditor.csproj @@ -342,6 +342,11 @@ Code + + True + DefaultWaveformSettings.settings + True + True OptionGeneratorToolsSetting.settings @@ -407,6 +412,10 @@ + + DefaultWaveformSettings.Designer.cs + PublicSettingsSingleFileGenerator + AudioPlayerToolViewerSetting.Designer.cs PublicSettingsSingleFileGenerator diff --git a/OngekiFumenEditor/Properties/DefaultWaveformSettings.Designer.cs b/OngekiFumenEditor/Properties/DefaultWaveformSettings.Designer.cs new file mode 100644 index 00000000..dab81ee3 --- /dev/null +++ b/OngekiFumenEditor/Properties/DefaultWaveformSettings.Designer.cs @@ -0,0 +1,62 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace OngekiFumenEditor.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.11.0.0")] + public sealed partial class DefaultWaveformSettings : global::System.Configuration.ApplicationSettingsBase { + + private static DefaultWaveformSettings defaultInstance = ((DefaultWaveformSettings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new DefaultWaveformSettings()))); + + public static DefaultWaveformSettings Default { + get { + return defaultInstance; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool ShowObjectPlaceLine { + get { + return ((bool)(this["ShowObjectPlaceLine"])); + } + set { + this["ShowObjectPlaceLine"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool ShowWaveform { + get { + return ((bool)(this["ShowWaveform"])); + } + set { + this["ShowWaveform"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool ShowTimingLine { + get { + return ((bool)(this["ShowTimingLine"])); + } + set { + this["ShowTimingLine"] = value; + } + } + } +} diff --git a/OngekiFumenEditor/Properties/DefaultWaveformSettings.settings b/OngekiFumenEditor/Properties/DefaultWaveformSettings.settings new file mode 100644 index 00000000..198a6f1a --- /dev/null +++ b/OngekiFumenEditor/Properties/DefaultWaveformSettings.settings @@ -0,0 +1,15 @@ + + + + + + True + + + True + + + True + + + \ No newline at end of file diff --git a/OngekiFumenEditor/Properties/Resources.Designer.cs b/OngekiFumenEditor/Properties/Resources.Designer.cs index 35ba6cbc..b30244a6 100644 --- a/OngekiFumenEditor/Properties/Resources.Designer.cs +++ b/OngekiFumenEditor/Properties/Resources.Designer.cs @@ -1,4 +1,4 @@ -//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ // // 此代码由工具生成。 // 运行时版本:4.0.30319.42000 @@ -3813,6 +3813,15 @@ public static string SampleRates { } } + /// + /// 查找类似 Save 的本地化字符串。 + /// + public static string Save { + get { + return ResourceManager.GetString("Save", resourceCulture); + } + } + /// /// 查找类似 Maximum save of 的本地化字符串。 /// diff --git a/OngekiFumenEditor/Properties/Resources.ja.resx b/OngekiFumenEditor/Properties/Resources.ja.resx index 8b4b5f31..52823b4a 100644 --- a/OngekiFumenEditor/Properties/Resources.ja.resx +++ b/OngekiFumenEditor/Properties/Resources.ja.resx @@ -1576,4 +1576,7 @@ (無制限) + + 保存 + \ No newline at end of file diff --git a/OngekiFumenEditor/Properties/Resources.resx b/OngekiFumenEditor/Properties/Resources.resx index 27829892..06078585 100644 --- a/OngekiFumenEditor/Properties/Resources.resx +++ b/OngekiFumenEditor/Properties/Resources.resx @@ -1662,4 +1662,7 @@ absolute path of the file to read (*.nyageki) + + Save + \ No newline at end of file diff --git a/OngekiFumenEditor/Properties/Resources.zh-Hans.resx b/OngekiFumenEditor/Properties/Resources.zh-Hans.resx index b957d740..d60aa0e7 100644 --- a/OngekiFumenEditor/Properties/Resources.zh-Hans.resx +++ b/OngekiFumenEditor/Properties/Resources.zh-Hans.resx @@ -1662,4 +1662,7 @@ 要生成的谱面文件路径 + + 保存 + \ No newline at end of file diff --git a/OngekiFumenEditor/UI/Controls/ObjectInspector/ObjectInspectorView.xaml b/OngekiFumenEditor/UI/Controls/ObjectInspector/ObjectInspectorView.xaml index d8ef6d81..e63dd33f 100644 --- a/OngekiFumenEditor/UI/Controls/ObjectInspector/ObjectInspectorView.xaml +++ b/OngekiFumenEditor/UI/Controls/ObjectInspector/ObjectInspectorView.xaml @@ -14,7 +14,7 @@ - + diff --git a/OngekiFumenEditor/UI/Controls/ObjectInspector/ObjectInspectorView.xaml.cs b/OngekiFumenEditor/UI/Controls/ObjectInspector/ObjectInspectorView.xaml.cs index a72c485f..1f0f7043 100644 --- a/OngekiFumenEditor/UI/Controls/ObjectInspector/ObjectInspectorView.xaml.cs +++ b/OngekiFumenEditor/UI/Controls/ObjectInspector/ObjectInspectorView.xaml.cs @@ -4,33 +4,44 @@ namespace OngekiFumenEditor.UI.Controls.ObjectInspector { - /// - /// FumenMetaInfoBrowserView.xaml 的交互逻辑 - /// - public partial class ObjectInspectorView : UserControl - { - public object InspectObject - { - get { return GetValue(InspectObjectProperty); } - set { SetValue(InspectObjectProperty, value); } - } + /// + /// FumenMetaInfoBrowserView.xaml 的交互逻辑 + /// + public partial class ObjectInspectorView : UserControl + { + public object InspectObject + { + get { return GetValue(InspectObjectProperty); } + set { SetValue(InspectObjectProperty, value); } + } - // Using a DependencyProperty as the backing store for InspectObject. This enables animation, styling, binding, etc... - public static readonly DependencyProperty InspectObjectProperty = - DependencyProperty.Register("InspectObject", typeof(object), typeof(ObjectInspectorView), new PropertyMetadata(null, (s, e) => - { - if (s is ObjectInspectorView ow && ow.HostContent.DataContext is ObjectInspectorViewModel om) - { - om.InspectObject = e.NewValue; - } - })); + public ItemsPanelTemplate ItemsPanel + { + get { return (ItemsPanelTemplate)GetValue(ItemsPanelProperty); } + set { SetValue(ItemsPanelProperty, value); } + } + public static readonly DependencyProperty InspectObjectProperty = + DependencyProperty.Register("InspectObject", typeof(object), typeof(ObjectInspectorView), new PropertyMetadata(null, (s, e) => + { + if (s is ObjectInspectorView ow && ow.HostContent.DataContext is ObjectInspectorViewModel om) + { + om.InspectObject = e.NewValue; + } + })); - public ObjectInspectorView() - { - InitializeComponent(); + public static readonly DependencyProperty ItemsPanelProperty = + DependencyProperty.Register("ItemsPanel", typeof(ItemsPanelTemplate), typeof(ObjectInspectorView), new PropertyMetadata(null, (s, e) => + { + if (s is ObjectInspectorView ow && e.NewValue is ItemsPanelTemplate newValue) + ow.itemsControl.ItemsPanel = newValue; + })); - HostContent.DataContext = new ObjectInspectorViewModel(); - } - } + public ObjectInspectorView() + { + InitializeComponent(); + + HostContent.DataContext = new ObjectInspectorViewModel(); + } + } }