Files
SpineViewer/SpineViewer/ViewModels/MainWindow/MainWindowViewModel.cs
2025-09-30 08:45:28 +08:00

178 lines
6.5 KiB
C#

using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using NLog;
using SFMLRenderer;
using SpineViewer.Models;
using SpineViewer.Services;
using SpineViewer.Utils;
using System.Windows;
using System.Windows.Shell;
namespace SpineViewer.ViewModels.MainWindow
{
/// <summary>
/// MainWindow 上下文对象
/// </summary>
public class MainWindowViewModel : ObservableObject
{
private static readonly Logger _logger = LogManager.GetCurrentClassLogger();
public MainWindowViewModel(ISFMLRenderer sfmlRenderer, ISFMLRenderer wallpaperRenderer)
{
_sfmlRenderer = sfmlRenderer;
_wallpaperRenderer = wallpaperRenderer;
_explorerListViewModel = new(this);
_spineObjectListViewModel = new(this);
_sfmlRendererViewModel = new(this);
_preferenceViewModel = new(this);
}
public string Title => $"SpineViewer - v{App.Version}";
/// <summary>
/// 指示是否通过托盘图标进行退出
/// </summary>
public bool IsShuttingDownFromTray => _isShuttingDownFromTray;
private bool _isShuttingDownFromTray;
public bool? CloseToTray
{
get => _closeToTray;
set => SetProperty(ref _closeToTray, value);
}
private bool? _closeToTray = null;
public string AutoRunWorkspaceConfigPath
{
get => _autoRunWorkspaceConfigPath;
set => SetProperty(ref _autoRunWorkspaceConfigPath, value);
}
private string _autoRunWorkspaceConfigPath;
/// <summary>
/// SFML 渲染对象
/// </summary>
public ISFMLRenderer SFMLRenderer => _sfmlRenderer;
private readonly ISFMLRenderer _sfmlRenderer;
public ISFMLRenderer WallpaperRenderer => _wallpaperRenderer;
private readonly ISFMLRenderer _wallpaperRenderer;
public TaskbarItemProgressState ProgressState { get => _progressState; set => SetProperty(ref _progressState, value); }
private TaskbarItemProgressState _progressState = TaskbarItemProgressState.None;
public float ProgressValue { get => _progressValue; set => SetProperty(ref _progressValue, value); }
private float _progressValue = 0;
/// <summary>
/// 已加载的 Spine 对象
/// </summary>
public ObservableCollectionWithLock<SpineObjectModel> SpineObjects => _spineObjectModels;
private readonly ObservableCollectionWithLock<SpineObjectModel> _spineObjectModels = [];
/// <summary>
/// 首选项 ViewModel
/// </summary>
public PreferenceViewModel PreferenceViewModel => _preferenceViewModel;
private readonly PreferenceViewModel _preferenceViewModel;
/// <summary>
/// 浏览页列表 ViewModel
/// </summary>
public ExplorerListViewModel ExplorerListViewModel => _explorerListViewModel;
private readonly ExplorerListViewModel _explorerListViewModel;
/// <summary>
/// 模型列表 ViewModel
/// </summary>
public SpineObjectListViewModel SpineObjectListViewModel => _spineObjectListViewModel;
private readonly SpineObjectListViewModel _spineObjectListViewModel;
/// <summary>
/// 模型属性页 ViewModel
/// </summary>
public SpineObjectTabViewModel SpineObjectTabViewModel => _spineObjectTabViewModel;
private readonly SpineObjectTabViewModel _spineObjectTabViewModel = new();
/// <summary>
/// SFML 渲染 ViewModel
/// </summary>
public SFMLRendererViewModel SFMLRendererViewModel => _sfmlRendererViewModel;
private readonly SFMLRendererViewModel _sfmlRendererViewModel;
public RelayCommand Cmd_SwitchWallpaperView => _cmd_SwitchWallpaperView ??= new(() =>
{
_preferenceViewModel.WallpaperView = !_preferenceViewModel.WallpaperView;
_preferenceViewModel.SavePreference();
});
private RelayCommand _cmd_SwitchWallpaperView;
public RelayCommand Cmd_ExitFromTray => _cmd_ExitFromTray ??= new(() =>
{
_isShuttingDownFromTray = true;
OnPropertyChanged(nameof(IsShuttingDownFromTray));
App.Current.Shutdown();
});
private RelayCommand? _cmd_ExitFromTray;
/// <summary>
/// 打开工作区
/// </summary>
public RelayCommand Cmd_OpenWorkspace => _cmd_OpenWorkspace ??= new(OpenWorkspace_Execute);
private RelayCommand? _cmd_OpenWorkspace;
private void OpenWorkspace_Execute()
{
if (!DialogService.ShowOpenJsonDialog(out var fileName)) return;
if (JsonHelper.Deserialize<WorkspaceModel>(fileName, out var obj))
{
Workspace = obj;
}
}
/// <summary>
/// 保存工作区
/// </summary>
public RelayCommand Cmd_SaveWorkspace => _cmd_SaveWorkspace ??= new(SaveWorkspace_Execute);
private RelayCommand? _cmd_SaveWorkspace;
private void SaveWorkspace_Execute()
{
string fileName = "workspace.jcfg";
if (!DialogService.ShowSaveJsonDialog(ref fileName)) return;
JsonHelper.Serialize(Workspace, fileName);
}
/// <summary>
/// 显示诊断信息对话框
/// </summary>
public RelayCommand Cmd_ShowDiagnosticsDialog => _cmd_ShowDiagnosticsDialog ??= new(() => { DialogService.ShowDiagnosticsDialog(); });
private RelayCommand? _cmd_ShowDiagnosticsDialog;
/// <summary>
/// 显示关于对话框
/// </summary>
public RelayCommand Cmd_ShowAboutDialog => _cmd_ShowAboutDialog ??= new(() => { DialogService.ShowAboutDialog(); });
private RelayCommand? _cmd_ShowAboutDialog;
public WorkspaceModel Workspace
{
get
{
return new()
{
ExploringDirectory = _explorerListViewModel.CurrentDirectory,
RendererConfig = _sfmlRendererViewModel.WorkspaceConfig,
LoadedSpineObjects = _spineObjectListViewModel.LoadedSpineObjects
};
}
set
{
_explorerListViewModel.CurrentDirectory = value.ExploringDirectory;
_sfmlRendererViewModel.WorkspaceConfig = value.RendererConfig;
_spineObjectListViewModel.LoadedSpineObjects = value.LoadedSpineObjects;
}
}
}
}