diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6653007..9d32ade 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,11 @@
# CHANGELOG
+## v0.15.14
+
+- 将预览画面的首选项移动至上一次状态参数中
+- 增加预览画面像素的自动保存和恢复
+- 增加日志启动时的版本号输出
+
## v0.15.13
- 增加程序布局自动存储和还原
diff --git a/Spine/Spine.csproj b/Spine/Spine.csproj
index d913e23..ad5e8a3 100644
--- a/Spine/Spine.csproj
+++ b/Spine/Spine.csproj
@@ -7,7 +7,7 @@
net8.0-windows
$(SolutionDir)out
false
- 0.15.13
+ 0.15.14
diff --git a/SpineViewer/App.xaml.cs b/SpineViewer/App.xaml.cs
index 9215dda..0184348 100644
--- a/SpineViewer/App.xaml.cs
+++ b/SpineViewer/App.xaml.cs
@@ -23,7 +23,7 @@ namespace SpineViewer
{
InitializeLogConfiguration();
_logger = LogManager.GetCurrentClassLogger();
- _logger.Info("Application Started");
+ _logger.Info("Application Started, v{0}", Version);
AppDomain.CurrentDomain.UnhandledException += (s, e) =>
{
diff --git a/SpineViewer/Models/MainWindowLayoutModel.cs b/SpineViewer/Models/LastStateModel.cs
similarity index 56%
rename from SpineViewer/Models/MainWindowLayoutModel.cs
rename to SpineViewer/Models/LastStateModel.cs
index b86b9b6..c61455f 100644
--- a/SpineViewer/Models/MainWindowLayoutModel.cs
+++ b/SpineViewer/Models/LastStateModel.cs
@@ -4,11 +4,14 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
+using System.Windows.Media;
namespace SpineViewer.Models
{
- public class MainWindowLayoutModel
+ public class LastStateModel
{
+ #region 画面布局状态
+
public double WindowLeft { get; set; }
public double WindowTop { get; set; }
public double WindowWidth { get; set; }
@@ -19,5 +22,19 @@ namespace SpineViewer.Models
public double ModelListRow0Height { get; set; }
public double ExplorerGridRow0Height { get; set; }
public double RightPanelGridRow0Height { get; set; }
+
+ #endregion
+
+ #region 预览画面状态
+
+ public uint ResolutionX { get; set; } = 1500;
+ public uint ResolutionY { get; set; } = 1000;
+ public uint MaxFps { get; set; } = 30;
+ public float Speed { get; set; } = 1f;
+ public bool ShowAxis { get; set; } = true;
+ public Color BackgroundColor { get; set; } = Color.FromRgb(105, 105, 105);
+
+ #endregion
+
}
}
diff --git a/SpineViewer/Models/PreferenceModel.cs b/SpineViewer/Models/PreferenceModel.cs
index 4962fd6..afe9d3f 100644
--- a/SpineViewer/Models/PreferenceModel.cs
+++ b/SpineViewer/Models/PreferenceModel.cs
@@ -71,22 +71,6 @@ 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/SpineViewer.csproj b/SpineViewer/SpineViewer.csproj
index b6b5931..8f147f3 100644
--- a/SpineViewer/SpineViewer.csproj
+++ b/SpineViewer/SpineViewer.csproj
@@ -7,7 +7,7 @@
net8.0-windows
$(SolutionDir)out
false
- 0.15.13
+ 0.15.14
WinExe
true
diff --git a/SpineViewer/ViewModels/MainWindow/PreferenceViewModel.cs b/SpineViewer/ViewModels/MainWindow/PreferenceViewModel.cs
index 9f33cb1..19ce571 100644
--- a/SpineViewer/ViewModels/MainWindow/PreferenceViewModel.cs
+++ b/SpineViewer/ViewModels/MainWindow/PreferenceViewModel.cs
@@ -93,11 +93,6 @@ namespace SpineViewer.ViewModels.MainWindow
DebugPoints = DebugPoints,
DebugClippings = DebugClippings,
- MaxFps = MaxFps,
- Speed = Speed,
- ShowAxis = ShowAxis,
- BackgroundColor = BackgroundColor,
-
RenderSelectedOnly = RenderSelectedOnly,
AppLanguage = AppLanguage,
};
@@ -122,11 +117,6 @@ 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;
}
@@ -230,34 +220,6 @@ 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/ViewModels/MainWindow/SFMLRendererViewModel.cs b/SpineViewer/ViewModels/MainWindow/SFMLRendererViewModel.cs
index 1b2d58a..348c80e 100644
--- a/SpineViewer/ViewModels/MainWindow/SFMLRendererViewModel.cs
+++ b/SpineViewer/ViewModels/MainWindow/SFMLRendererViewModel.cs
@@ -86,6 +86,14 @@ namespace SpineViewer.ViewModels.MainWindow
///
public event NotifyCollectionChangedEventHandler? RequestSelectionChanging;
+ public void SetResolution(uint x, uint y)
+ {
+ var lastRes = _renderer.Resolution;
+ _renderer.Resolution = new(x, y);
+ if (lastRes.X != x) OnPropertyChanged(nameof(ResolutionX));
+ if (lastRes.Y != y) OnPropertyChanged(nameof(ResolutionY));
+ }
+
public uint ResolutionX
{
get => _renderer.Resolution.X;
@@ -455,8 +463,7 @@ namespace SpineViewer.ViewModels.MainWindow
}
set
{
- ResolutionX = value.ResolutionX;
- ResolutionY = value.ResolutionY;
+ SetResolution(value.ResolutionX, value.ResolutionY);
CenterX = value.CenterX;
CenterY = value.CenterY;
Zoom = value.Zoom;
diff --git a/SpineViewer/Views/MainWindow.xaml.cs b/SpineViewer/Views/MainWindow.xaml.cs
index d9b68a5..85bfa9c 100644
--- a/SpineViewer/Views/MainWindow.xaml.cs
+++ b/SpineViewer/Views/MainWindow.xaml.cs
@@ -32,7 +32,7 @@ public partial class MainWindow : Window
///
/// 布局文件保存路径
///
- public static readonly string LayoutFilePath = Path.Combine(Path.GetDirectoryName(Environment.ProcessPath), "layout.json");
+ public static readonly string LastStateFilePath = Path.Combine(Path.GetDirectoryName(Environment.ProcessPath), "laststate.json");
private static readonly Logger _logger = LogManager.GetCurrentClassLogger();
private ListViewItem? _listViewDragSourceItem = null;
@@ -54,8 +54,6 @@ 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;
@@ -63,8 +61,7 @@ public partial class MainWindow : Window
_renderPanel.CanvasMouseButtonReleased += vm.CanvasMouseButtonReleased;
// 设置默认参数并启动渲染
- vm.ResolutionX = 1500;
- vm.ResolutionY = 1000;
+ vm.SetResolution(1500, 1000);
vm.Zoom = 0.75f;
vm.CenterX = 0;
vm.CenterY = 0;
@@ -74,14 +71,16 @@ public partial class MainWindow : Window
// 加载首选项
_vm.PreferenceViewModel.LoadPreference();
+
+ LoadLastState();
}
private void MainWindow_Closed(object? sender, EventArgs e)
{
+ SaveLastState();
+
var vm = _vm.SFMLRendererViewModel;
vm.StopRender();
-
- SaveLayout();
}
///
@@ -112,9 +111,9 @@ public partial class MainWindow : Window
LogManager.ReconfigExistingLoggers();
}
- private void LoadLayout()
+ private void LoadLastState()
{
- if (JsonHelper.Deserialize(LayoutFilePath, out var m, true))
+ if (JsonHelper.Deserialize(LastStateFilePath, out var m, true))
{
Left = m.WindowLeft;
Top = m.WindowTop;
@@ -133,13 +132,19 @@ public partial class MainWindow : Window
_modelListGrid.RowDefinitions[0].Height = new(m.ModelListRow0Height);
_explorerGrid.RowDefinitions[0].Height = new(m.ExplorerGridRow0Height);
_rightPanelGrid.RowDefinitions[0].Height = new(m.RightPanelGridRow0Height);
+
+ _vm.SFMLRendererViewModel.SetResolution(m.ResolutionX, m.ResolutionY);
+ _vm.SFMLRendererViewModel.MaxFps = m.MaxFps;
+ _vm.SFMLRendererViewModel.Speed = m.Speed;
+ _vm.SFMLRendererViewModel.ShowAxis = m.ShowAxis;
+ _vm.SFMLRendererViewModel.BackgroundColor = m.BackgroundColor;
}
}
- private void SaveLayout()
+ private void SaveLastState()
{
- var m = new MainWindowLayoutModel()
+ var m = new LastStateModel()
{
WindowLeft = Left,
WindowTop = Top,
@@ -151,9 +156,16 @@ public partial class MainWindow : Window
ModelListRow0Height = _modelListGrid.RowDefinitions[0].ActualHeight,
ExplorerGridRow0Height = _explorerGrid.RowDefinitions[0].ActualHeight,
RightPanelGridRow0Height = _rightPanelGrid.RowDefinitions[0].ActualHeight,
+
+ ResolutionX = _vm.SFMLRendererViewModel.ResolutionX,
+ ResolutionY = _vm.SFMLRendererViewModel.ResolutionY,
+ MaxFps = _vm.SFMLRendererViewModel.MaxFps,
+ Speed = _vm.SFMLRendererViewModel.Speed,
+ ShowAxis = _vm.SFMLRendererViewModel.ShowAxis,
+ BackgroundColor = _vm.SFMLRendererViewModel.BackgroundColor,
};
- JsonHelper.Serialize(m, LayoutFilePath);
+ JsonHelper.Serialize(m, LastStateFilePath);
}
#region _spinesListView 事件处理
@@ -292,9 +304,7 @@ public partial class MainWindow : Window
IntPtr hwnd = new WindowInteropHelper(this).Handle;
if (Win32.GetScreenResolution(hwnd, out var resX, out var resY))
{
- var vm = _vm.SFMLRendererViewModel;
- vm.ResolutionX = resX;
- vm.ResolutionY = resY;
+ _vm.SFMLRendererViewModel.SetResolution(resX, resY);
}
HandyControl.Controls.IconElement.SetGeometry(_fullScreenButton, AppResource.Geo_ArrowsMinimize);
diff --git a/SpineViewer/Views/PreferenceDialog.xaml b/SpineViewer/Views/PreferenceDialog.xaml
index 2983bfe..b3c7dfb 100644
--- a/SpineViewer/Views/PreferenceDialog.xaml
+++ b/SpineViewer/Views/PreferenceDialog.xaml
@@ -134,34 +134,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-