using System; using System.Collections.ObjectModel; using System.ComponentModel; using System.Linq; using BetterGenshinImpact.Model.Gear.Triggers; using BetterGenshinImpact.Model; using BetterGenshinImpact.Helpers.Extensions; using CommunityToolkit.Mvvm.ComponentModel; using Quartz; namespace BetterGenshinImpact.ViewModel.Pages.Component; /// /// 触发器ViewModel /// public partial class GearTriggerViewModel : ObservableObject { [ObservableProperty] private string _name = string.Empty; [ObservableProperty] private bool _isEnabled = true; [ObservableProperty] private bool _isSelected = false; [ObservableProperty] private string? _cronExpression; partial void OnCronExpressionChanged(string? value) { UpdateNextRunTime(); } [ObservableProperty] private DateTime _createdTime = DateTime.Now; [ObservableProperty] private DateTime _modifiedTime = DateTime.Now; /// /// 触发器类型 /// [ObservableProperty] private TriggerType _triggerType = TriggerType.Timed; /// /// 任务引用名称 /// [ObservableProperty] private string _taskDefinitionName = string.Empty; // 热键触发器属性 [ObservableProperty] private HotKey? _hotkey; /// /// 快捷键类型 (全局热键/键鼠监听) /// [ObservableProperty] private HotKeyTypeEnum _hotkeyType = HotKeyTypeEnum.KeyboardMonitor; /// /// 快捷键类型名称 (中文显示) /// public string HotkeyTypeName => HotkeyType.ToChineseName(); [ObservableProperty] private DateTime? _nextRunTime; [ObservableProperty] private DateTime? _lastRunTime; public void UpdateNextRunTime() { if (TriggerType == TriggerType.Timed && !string.IsNullOrWhiteSpace(CronExpression)) { try { var cron = new CronExpression(CronExpression); var next = cron.GetNextValidTimeAfter(DateTimeOffset.Now); NextRunTime = next?.LocalDateTime; } catch { NextRunTime = null; } } else { NextRunTime = null; } } public GearTriggerViewModel() { } public GearTriggerViewModel(string name, TriggerType triggerType) { Name = name; TriggerType = triggerType; } /// /// 获取触发器类型显示名称 /// public string TriggerTypeDisplayName => TriggerType switch { TriggerType.Timed => "定时触发", TriggerType.Hotkey => "热键触发", _ => "未知类型" }; /// /// 获取热键显示文本 /// public string HotkeyDisplayText => Hotkey?.ToString() ?? "未设置"; /// /// 转换为对应的触发器实例 /// public GearBaseTrigger ToTrigger() { GearBaseTrigger trigger = TriggerType switch { TriggerType.Timed => new QuartzCronGearTrigger { CronExpression = CronExpression }, TriggerType.Hotkey => new HotkeyGearTrigger { Hotkey = Hotkey }, _ => throw new ArgumentOutOfRangeException() }; trigger.Name = Name; trigger.IsEnabled = IsEnabled; trigger.TaskDefinitionName = TaskDefinitionName; return trigger; } } /// /// 触发器类型枚举 /// public enum TriggerType { /// /// 定时触发 /// [Description("定时触发")] Timed, /// /// 热键触发 /// [Description("热键触发")] Hotkey }