From c7493372e9a6696f444dbcfc5b2a409ff23f5cc7 Mon Sep 17 00:00:00 2001 From: ww-rm Date: Thu, 4 Sep 2025 19:27:10 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=B8=83=E5=B1=80?= =?UTF-8?q?=E5=AD=98=E5=82=A8=E5=92=8C=E8=BF=98=E5=8E=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SpineViewer/Models/MainWindowLayoutModel.cs | 23 +++++++++ SpineViewer/Views/MainWindow.xaml | 10 ++-- SpineViewer/Views/MainWindow.xaml.cs | 56 +++++++++++++++++++++ 3 files changed, 84 insertions(+), 5 deletions(-) create mode 100644 SpineViewer/Models/MainWindowLayoutModel.cs diff --git a/SpineViewer/Models/MainWindowLayoutModel.cs b/SpineViewer/Models/MainWindowLayoutModel.cs new file mode 100644 index 0000000..b86b9b6 --- /dev/null +++ b/SpineViewer/Models/MainWindowLayoutModel.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; + +namespace SpineViewer.Models +{ + public class MainWindowLayoutModel + { + public double WindowLeft { get; set; } + public double WindowTop { get; set; } + public double WindowWidth { get; set; } + public double WindowHeight { get; set; } + public WindowState WindowState { get; set; } + + public double RootGridCol0Width { get; set; } + public double ModelListRow0Height { get; set; } + public double ExplorerGridRow0Height { get; set; } + public double RightPanelGridRow0Height { get; set; } + } +} diff --git a/SpineViewer/Views/MainWindow.xaml b/SpineViewer/Views/MainWindow.xaml index fc630dd..33d1779 100644 --- a/SpineViewer/Views/MainWindow.xaml +++ b/SpineViewer/Views/MainWindow.xaml @@ -76,7 +76,7 @@ - + @@ -91,7 +91,7 @@ - + @@ -578,7 +578,7 @@ - + @@ -785,14 +785,14 @@ - + - + diff --git a/SpineViewer/Views/MainWindow.xaml.cs b/SpineViewer/Views/MainWindow.xaml.cs index 31e92ce..d9b68a5 100644 --- a/SpineViewer/Views/MainWindow.xaml.cs +++ b/SpineViewer/Views/MainWindow.xaml.cs @@ -3,12 +3,15 @@ using NLog; using NLog.Layouts; using NLog.Targets; using Spine; +using SpineViewer.Models; using SpineViewer.Natives; using SpineViewer.Resources; +using SpineViewer.Utils; using SpineViewer.ViewModels.MainWindow; using System.Collections.Specialized; using System.ComponentModel; using System.Diagnostics; +using System.IO; using System.Text; using System.Windows; using System.Windows.Controls; @@ -26,6 +29,11 @@ namespace SpineViewer.Views; /// public partial class MainWindow : Window { + /// + /// 布局文件保存路径 + /// + public static readonly string LayoutFilePath = Path.Combine(Path.GetDirectoryName(Environment.ProcessPath), "layout.json"); + private static readonly Logger _logger = LogManager.GetCurrentClassLogger(); private ListViewItem? _listViewDragSourceItem = null; private Point _listViewDragSourcePoint; @@ -46,6 +54,8 @@ public partial class MainWindow : Window private void MainWindow_Loaded(object sender, RoutedEventArgs e) { + LoadLayout(); + var vm = _vm.SFMLRendererViewModel; _renderPanel.CanvasMouseWheelScrolled += vm.CanvasMouseWheelScrolled; _renderPanel.CanvasMouseButtonPressed += vm.CanvasMouseButtonPressed; @@ -70,6 +80,8 @@ public partial class MainWindow : Window { var vm = _vm.SFMLRendererViewModel; vm.StopRender(); + + SaveLayout(); } /// @@ -100,6 +112,50 @@ public partial class MainWindow : Window LogManager.ReconfigExistingLoggers(); } + private void LoadLayout() + { + if (JsonHelper.Deserialize(LayoutFilePath, out var m, true)) + { + Left = m.WindowLeft; + Top = m.WindowTop; + Width = m.WindowWidth; + Height = m.WindowHeight; + if (m.WindowState == WindowState.Maximized) + { + WindowState = WindowState.Maximized; + } + else + { + WindowState = WindowState.Normal; + } + + _rootGrid.ColumnDefinitions[0].Width = new(m.RootGridCol0Width); + _modelListGrid.RowDefinitions[0].Height = new(m.ModelListRow0Height); + _explorerGrid.RowDefinitions[0].Height = new(m.ExplorerGridRow0Height); + _rightPanelGrid.RowDefinitions[0].Height = new(m.RightPanelGridRow0Height); + } + + } + + private void SaveLayout() + { + var m = new MainWindowLayoutModel() + { + WindowLeft = Left, + WindowTop = Top, + WindowWidth = Width, + WindowHeight = Height, + WindowState = WindowState, + + RootGridCol0Width = _rootGrid.ColumnDefinitions[0].ActualWidth, + ModelListRow0Height = _modelListGrid.RowDefinitions[0].ActualHeight, + ExplorerGridRow0Height = _explorerGrid.RowDefinitions[0].ActualHeight, + RightPanelGridRow0Height = _rightPanelGrid.RowDefinitions[0].ActualHeight, + }; + + JsonHelper.Serialize(m, LayoutFilePath); + } + #region _spinesListView 事件处理 private void SpinesListView_RequestSelectionChanging(object? sender, NotifyCollectionChangedEventArgs e) From 98930db4b62f8ad31b31230a6f98d6acb706241c Mon Sep 17 00:00:00 2001 From: ww-rm Date: Thu, 4 Sep 2025 20:07:35 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=A2=84=E8=A7=88?= =?UTF-8?q?=E7=94=BB=E9=9D=A2=E9=A6=96=E9=80=89=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SpineViewer/Models/PreferenceModel.cs | 16 ++++++++ SpineViewer/Resources/Strings/en.xaml | 2 + SpineViewer/Resources/Strings/ja.xaml | 2 + SpineViewer/Resources/Strings/zh.xaml | 2 + .../MainWindow/PreferenceViewModel.cs | 38 +++++++++++++++++++ SpineViewer/Views/PreferenceDialog.xaml | 28 ++++++++++++++ 6 files changed, 88 insertions(+) diff --git a/SpineViewer/Models/PreferenceModel.cs b/SpineViewer/Models/PreferenceModel.cs index afe9d3f..4962fd6 100644 --- a/SpineViewer/Models/PreferenceModel.cs +++ b/SpineViewer/Models/PreferenceModel.cs @@ -71,6 +71,22 @@ namespace SpineViewer.Models #endregion + #region 预览画面首选项 + + [ObservableProperty] + private uint _maxFps = 30; + + [ObservableProperty] + private float _speed = 1f; + + [ObservableProperty] + private bool _showAxis = true; + + [ObservableProperty] + private Color _backgroundColor = Color.FromRgb(105, 105, 105); + + #endregion + #region 程序选项 [ObservableProperty] diff --git a/SpineViewer/Resources/Strings/en.xaml b/SpineViewer/Resources/Strings/en.xaml index 4844a81..8ad9ddf 100644 --- a/SpineViewer/Resources/Strings/en.xaml +++ b/SpineViewer/Resources/Strings/en.xaml @@ -229,6 +229,8 @@ Model Loading Options + Preview Options + Application Options Language diff --git a/SpineViewer/Resources/Strings/ja.xaml b/SpineViewer/Resources/Strings/ja.xaml index 946aa8b..0ff33d6 100644 --- a/SpineViewer/Resources/Strings/ja.xaml +++ b/SpineViewer/Resources/Strings/ja.xaml @@ -229,6 +229,8 @@ モデル読み込みオプション + プレビュー画面オプション + アプリケーションプション 言語 diff --git a/SpineViewer/Resources/Strings/zh.xaml b/SpineViewer/Resources/Strings/zh.xaml index 8b78d6e..75eb715 100644 --- a/SpineViewer/Resources/Strings/zh.xaml +++ b/SpineViewer/Resources/Strings/zh.xaml @@ -229,6 +229,8 @@ 模型加载选项 + 预览画面选项 + 应用程序选项 语言 diff --git a/SpineViewer/ViewModels/MainWindow/PreferenceViewModel.cs b/SpineViewer/ViewModels/MainWindow/PreferenceViewModel.cs index 19ce571..9f33cb1 100644 --- a/SpineViewer/ViewModels/MainWindow/PreferenceViewModel.cs +++ b/SpineViewer/ViewModels/MainWindow/PreferenceViewModel.cs @@ -93,6 +93,11 @@ namespace SpineViewer.ViewModels.MainWindow DebugPoints = DebugPoints, DebugClippings = DebugClippings, + MaxFps = MaxFps, + Speed = Speed, + ShowAxis = ShowAxis, + BackgroundColor = BackgroundColor, + RenderSelectedOnly = RenderSelectedOnly, AppLanguage = AppLanguage, }; @@ -117,6 +122,11 @@ namespace SpineViewer.ViewModels.MainWindow DebugPoints = value.DebugPoints; DebugClippings = value.DebugClippings; + MaxFps = value.MaxFps; + Speed = value.Speed; + ShowAxis = value.ShowAxis; + BackgroundColor = value.BackgroundColor; + RenderSelectedOnly = value.RenderSelectedOnly; AppLanguage = value.AppLanguage; } @@ -220,6 +230,34 @@ namespace SpineViewer.ViewModels.MainWindow #endregion + #region 预览画面首选项 + + public uint MaxFps + { + get => _vmMain.SFMLRendererViewModel.MaxFps; + set => SetProperty(_vmMain.SFMLRendererViewModel.MaxFps, value, v => _vmMain.SFMLRendererViewModel.MaxFps = value); + } + + public float Speed + { + get => _vmMain.SFMLRendererViewModel.Speed; + set => SetProperty(_vmMain.SFMLRendererViewModel.Speed, value, v => _vmMain.SFMLRendererViewModel.Speed = value); + } + + public bool ShowAxis + { + get => _vmMain.SFMLRendererViewModel.ShowAxis; + set => SetProperty(_vmMain.SFMLRendererViewModel.ShowAxis, value, v => _vmMain.SFMLRendererViewModel.ShowAxis = value); + } + + public Color BackgroundColor + { + get => _vmMain.SFMLRendererViewModel.BackgroundColor; + set => SetProperty(_vmMain.SFMLRendererViewModel.BackgroundColor, value, v => _vmMain.SFMLRendererViewModel.BackgroundColor = value); + } + + #endregion + #region 程序选项 public static ImmutableArray AppLanguageOptions { get; } = Enum.GetValues().ToImmutableArray(); diff --git a/SpineViewer/Views/PreferenceDialog.xaml b/SpineViewer/Views/PreferenceDialog.xaml index b3c7dfb..2983bfe 100644 --- a/SpineViewer/Views/PreferenceDialog.xaml +++ b/SpineViewer/Views/PreferenceDialog.xaml @@ -134,6 +134,34 @@ + + + + + + + + + + + + + + + + From 6f896bdaad30236c1daa50ee74ff6a7ebe446b1c Mon Sep 17 00:00:00 2001 From: ww-rm Date: Thu, 4 Sep 2025 20:07:54 +0800 Subject: [PATCH 3/4] update changelog --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e38e42..6653007 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # CHANGELOG +## v0.15.13 + +- 增加程序布局自动存储和还原 +- 增加部分预览画面首选项 + ## v0.15.12 - 增加单个模型和单个轨道的时间因子 From 76280754203f4b49ea71b7503ec4c607ec883701 Mon Sep 17 00:00:00 2001 From: ww-rm Date: Thu, 4 Sep 2025 20:08:08 +0800 Subject: [PATCH 4/4] update to v0.15.13 --- Spine/Spine.csproj | 2 +- SpineViewer/SpineViewer.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Spine/Spine.csproj b/Spine/Spine.csproj index 3a680d0..d913e23 100644 --- a/Spine/Spine.csproj +++ b/Spine/Spine.csproj @@ -7,7 +7,7 @@ net8.0-windows $(SolutionDir)out false - 0.15.12 + 0.15.13 diff --git a/SpineViewer/SpineViewer.csproj b/SpineViewer/SpineViewer.csproj index 24d5086..b6b5931 100644 --- a/SpineViewer/SpineViewer.csproj +++ b/SpineViewer/SpineViewer.csproj @@ -7,7 +7,7 @@ net8.0-windows $(SolutionDir)out false - 0.15.12 + 0.15.13 WinExe true