using System; using System.Collections.ObjectModel; using System.Linq; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using BetterGenshinImpact.ViewModel.Pages.Component; using BetterGenshinImpact.Model.Gear.Triggers; using BetterGenshinImpact.Model; using BetterGenshinImpact.Service; using Microsoft.Extensions.Logging; using Wpf.Ui.Violeta.Controls; using BetterGenshinImpact.Helpers.Extensions; namespace BetterGenshinImpact.ViewModel.Windows.GearTask; /// /// 新增触发器对话框 ViewModel /// public partial class AddTriggerDialogViewModel : ObservableObject { private readonly GearTaskStorageService _storageService; private readonly ILogger _logger; [ObservableProperty] private string _dialogTitle = "新增触发器"; [ObservableProperty] private string _triggerName = string.Empty; [ObservableProperty] private TriggerType _selectedTriggerType = TriggerType.Timed; [ObservableProperty] private string _cronExpression = "0 0 8 * * ?"; // 默认每天8点 [ObservableProperty] private HotKey? _selectedHotkey; [ObservableProperty] private HotKeyTypeEnum _hotkeyType = HotKeyTypeEnum.KeyboardMonitor; /// /// 快捷键类型显示名称 /// public string HotkeyTypeName => HotkeyType.ToChineseName(); [ObservableProperty] private string _selectedTaskDefinitionName = string.Empty; [ObservableProperty] private bool _isEnabled = true; /// /// 触发器类型选择是否可用 /// [ObservableProperty] private bool _isTriggerTypeSelectionEnabled = true; /// /// 可用的触发器类型 /// public ObservableCollection> TriggerTypes { get; } = new() { EnumItem.Create(TriggerType.Timed), EnumItem.Create(TriggerType.Hotkey) }; /// /// 可用的任务定义列表 /// [ObservableProperty] private ObservableCollection _availableTaskDefinitions = new(); /// /// 请求关闭事件 /// public event EventHandler? RequestClose; /// /// 创建的触发器 /// public GearTriggerViewModel? CreatedTrigger { get; private set; } public AddTriggerDialogViewModel(GearTaskStorageService storageService, ILogger logger) { _storageService = storageService; _logger = logger; // 生成默认名称 GenerateDefaultName(); // 加载可用的任务定义 LoadAvailableTaskDefinitions(); } /// /// 构造函数,用于指定触发器类型 /// public AddTriggerDialogViewModel(GearTaskStorageService storageService, ILogger logger, TriggerType? predefinedType = null) { _storageService = storageService; _logger = logger; // 如果指定了预定义类型,则设置并禁用选择 if (predefinedType.HasValue) { SelectedTriggerType = predefinedType.Value; IsTriggerTypeSelectionEnabled = false; } // 生成默认名称 GenerateDefaultName(); // 加载可用的任务定义 LoadAvailableTaskDefinitions(); } public AddTriggerDialogViewModel(GearTaskStorageService storageService, ILogger logger, GearTriggerViewModel existingTrigger) { _storageService = storageService; _logger = logger; DialogTitle = "编辑触发器"; IsTriggerTypeSelectionEnabled = false; SelectedTriggerType = existingTrigger.TriggerType; TriggerName = existingTrigger.Name; IsEnabled = existingTrigger.IsEnabled; SelectedTaskDefinitionName = existingTrigger.TaskDefinitionName; CronExpression = existingTrigger.TriggerType == TriggerType.Timed ? (existingTrigger.CronExpression ?? CronExpression) : CronExpression; SelectedHotkey = existingTrigger.TriggerType == TriggerType.Hotkey ? existingTrigger.Hotkey : null; HotkeyType = existingTrigger.TriggerType == TriggerType.Hotkey ? existingTrigger.HotkeyType : HotKeyTypeEnum.KeyboardMonitor; LoadAvailableTaskDefinitions(); } /// /// 生成默认触发器名称 /// private void GenerateDefaultName() { var typeName = SelectedTriggerType == TriggerType.Timed ? "定时触发器" : "热键触发器"; TriggerName = $"{typeName} {DateTime.Now:MMdd_HHmm}"; } /// /// 加载可用的任务定义 /// private async void LoadAvailableTaskDefinitions() { try { AvailableTaskDefinitions.Clear(); // 从 GearTaskStorageService 加载所有任务定义 var taskDefinitions = await _storageService.LoadAllTaskDefinitionsAsync(); // 提取任务定义名称并添加到列表中 foreach (var taskDefinition in taskDefinitions) { if (!string.IsNullOrWhiteSpace(taskDefinition.Name)) { AvailableTaskDefinitions.Add(taskDefinition.Name); } } _logger.LogInformation("已加载 {Count} 个可用的任务定义", AvailableTaskDefinitions.Count); // 如果有任务定义,默认选择第一个 if (AvailableTaskDefinitions.Count > 0 && string.IsNullOrWhiteSpace(SelectedTaskDefinitionName)) { SelectedTaskDefinitionName = AvailableTaskDefinitions[0]; } } catch (Exception ex) { _logger.LogDebug(ex, "加载可用任务定义时发生错误"); // 发生错误时添加一个提示项 AvailableTaskDefinitions.Clear(); AvailableTaskDefinitions.Add("(无可用任务定义)"); } } /// /// 快捷键类型改变时的处理 /// partial void OnHotkeyTypeChanged(HotKeyTypeEnum value) { // 通知UI更新快捷键类型显示名称 OnPropertyChanged(nameof(HotkeyTypeName)); // 清空当前快捷键设置 SelectedHotkey = null; } /// /// 触发器类型改变时的处理 /// partial void OnSelectedTriggerTypeChanged(TriggerType value) { GenerateDefaultName(); } /// /// 确认创建触发器 /// [RelayCommand] private void Confirm() { if (string.IsNullOrWhiteSpace(TriggerName)) { Toast.Error("请输入触发器名称"); return; } if (SelectedTriggerType == TriggerType.Timed && string.IsNullOrWhiteSpace(CronExpression)) { Toast.Error("请输入 Cron 表达式"); return; } if (SelectedTriggerType == TriggerType.Hotkey && SelectedHotkey == null) { Toast.Error("请选择热键"); return; } // 创建触发器 ViewModel CreatedTrigger = new GearTriggerViewModel(TriggerName, SelectedTriggerType) { IsEnabled = IsEnabled, TaskDefinitionName = SelectedTaskDefinitionName, CronExpression = SelectedTriggerType == TriggerType.Timed ? CronExpression : null, Hotkey = SelectedTriggerType == TriggerType.Hotkey ? SelectedHotkey : null, HotkeyType = SelectedTriggerType == TriggerType.Hotkey ? HotkeyType : HotKeyTypeEnum.KeyboardMonitor }; RequestClose?.Invoke(this, true); } /// /// 取消创建 /// [RelayCommand] private void Cancel() { RequestClose?.Invoke(this, false); } /// /// 切换快捷键类型 /// [RelayCommand] private void SwitchHotKeyType() { HotkeyType = HotkeyType == HotKeyTypeEnum.GlobalRegister ? HotKeyTypeEnum.KeyboardMonitor : HotKeyTypeEnum.GlobalRegister; } /// /// 选择热键 /// [RelayCommand] private void SelectHotkey() { // 移除旧的示例代码,现在使用HotKeyTextBox直接设置 // HotKeyTextBox会直接绑定到SelectedHotkey属性 } }