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 @@ - - - - - - - - - - - - - - - -