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
- 增加单个模型和单个轨道的时间因子
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/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/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/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
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/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)
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+