using System; using System.Collections.ObjectModel; using System.Linq; using System.Windows; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using Microsoft.Extensions.Logging; using BetterGenshinImpact.ViewModel.Pages.Component; using BetterGenshinImpact.Model.Gear.Tasks; using BetterGenshinImpact.Model; namespace BetterGenshinImpact.ViewModel.Pages; /// /// 任务触发页面ViewModel /// public partial class GearTriggerPageViewModel : ViewModel { private readonly ILogger _logger; /// /// 顺序触发器列表 /// [ObservableProperty] private ObservableCollection _sequentialTriggers = new(); /// /// 定时触发器列表 /// [ObservableProperty] private ObservableCollection _timedTriggers = new(); /// /// 热键触发器列表 /// [ObservableProperty] private ObservableCollection _hotkeyTriggers = new(); /// /// 当前选中的触发器 /// [ObservableProperty] private GearTriggerViewModel? _selectedTrigger; /// /// 当前选中的触发器类型Tab /// [ObservableProperty] private int _selectedTriggerTypeIndex = 0; /// /// 触发器配置中的任务定义列表 /// [ObservableProperty] private ObservableCollection _availableTaskDefinitions = new(); /// /// 当前触发器的任务引用列表 /// [ObservableProperty] private ObservableCollection _currentTaskReferences = new(); /// /// 当前选中的任务引用 /// [ObservableProperty] private GearTaskRefence? _selectedTaskReference; public GearTriggerPageViewModel(ILogger logger) { _logger = logger; InitializeData(); } private void InitializeData() { // 初始化示例数据 var sequentialTrigger = new GearTriggerViewModel("示例顺序触发器", TriggerType.Sequential); SequentialTriggers.Add(sequentialTrigger); var timedTrigger = new GearTriggerViewModel("示例定时触发器", TriggerType.Timed) { IntervalMs = 10000, IsRepeating = true }; TimedTriggers.Add(timedTrigger); var hotkeyTrigger = new GearTriggerViewModel("示例热键触发器", TriggerType.Hotkey) { Hotkey = new HotKey(System.Windows.Input.Key.F1, System.Windows.Input.ModifierKeys.Control) }; HotkeyTriggers.Add(hotkeyTrigger); // 初始化可用的任务定义(这里应该从实际的任务定义服务获取) LoadAvailableTaskDefinitions(); } private void LoadAvailableTaskDefinitions() { // 这里应该从实际的任务定义服务获取 // 暂时创建示例数据 var sampleTask = new GearTaskDefinitionViewModel("示例任务组", "这是一个示例任务组"); AvailableTaskDefinitions.Add(sampleTask); } partial void OnSelectedTriggerChanged(GearTriggerViewModel? value) { UpdateCurrentTaskReferences(); } private void UpdateCurrentTaskReferences() { CurrentTaskReferences.Clear(); if (SelectedTrigger != null) { foreach (var taskRef in SelectedTrigger.TaskReferences) { CurrentTaskReferences.Add(taskRef); } } } /// /// 添加顺序触发器 /// [RelayCommand] private void AddSequentialTrigger() { var trigger = new GearTriggerViewModel($"顺序触发器 {SequentialTriggers.Count + 1}", TriggerType.Sequential); SequentialTriggers.Add(trigger); SelectedTrigger = trigger; SelectedTriggerTypeIndex = 0; } /// /// 添加定时触发器 /// [RelayCommand] private void AddTimedTrigger() { var trigger = new GearTriggerViewModel($"定时触发器 {TimedTriggers.Count + 1}", TriggerType.Timed); TimedTriggers.Add(trigger); SelectedTrigger = trigger; SelectedTriggerTypeIndex = 1; } /// /// 添加热键触发器 /// [RelayCommand] private void AddHotkeyTrigger() { var trigger = new GearTriggerViewModel($"热键触发器 {HotkeyTriggers.Count + 1}", TriggerType.Hotkey); HotkeyTriggers.Add(trigger); SelectedTrigger = trigger; SelectedTriggerTypeIndex = 2; } /// /// 删除触发器 /// [RelayCommand] private void DeleteTrigger(GearTriggerViewModel? trigger) { if (trigger == null) return; var result = MessageBox.Show($"确定要删除触发器 '{trigger.Name}' 吗?", "确认删除", MessageBoxButton.YesNo, MessageBoxImage.Question); if (result == MessageBoxResult.Yes) { switch (trigger.TriggerType) { case TriggerType.Sequential: SequentialTriggers.Remove(trigger); break; case TriggerType.Timed: TimedTriggers.Remove(trigger); break; case TriggerType.Hotkey: HotkeyTriggers.Remove(trigger); break; } if (SelectedTrigger == trigger) { SelectedTrigger = null; } } } /// /// 编辑触发器 /// [RelayCommand] private void EditTrigger(GearTriggerViewModel? trigger) { if (trigger == null) return; SelectedTrigger = trigger; // 切换到对应的Tab SelectedTriggerTypeIndex = trigger.TriggerType switch { TriggerType.Sequential => 0, TriggerType.Timed => 1, TriggerType.Hotkey => 2, _ => 0 }; } /// /// 添加任务定义到当前触发器 /// [RelayCommand] private void AddTaskDefinition(GearTaskDefinitionViewModel? taskDefinition) { if (taskDefinition == null || SelectedTrigger == null) return; // 创建任务引用 var taskRef = new GearTaskRefence { Name = taskDefinition.Name, Enabled = true, GearTaskFilePath = $"tasks/{taskDefinition.Name}.json" // 这里应该是实际的文件路径 }; SelectedTrigger.TaskReferences.Add(taskRef); CurrentTaskReferences.Add(taskRef); } /// /// 删除任务引用 /// [RelayCommand] private void RemoveTaskReference(GearTaskRefence? taskRef) { if (taskRef == null || SelectedTrigger == null) return; SelectedTrigger.TaskReferences.Remove(taskRef); CurrentTaskReferences.Remove(taskRef); } /// /// 上移任务引用 /// [RelayCommand] private void MoveTaskReferenceUp(GearTaskRefence? taskRef) { if (taskRef == null || SelectedTrigger == null) return; var index = CurrentTaskReferences.IndexOf(taskRef); if (index > 0) { CurrentTaskReferences.Move(index, index - 1); SelectedTrigger.TaskReferences.Move(index, index - 1); } } /// /// 下移任务引用 /// [RelayCommand] private void MoveTaskReferenceDown(GearTaskRefence? taskRef) { if (taskRef == null || SelectedTrigger == null) return; var index = CurrentTaskReferences.IndexOf(taskRef); if (index < CurrentTaskReferences.Count - 1) { CurrentTaskReferences.Move(index, index + 1); SelectedTrigger.TaskReferences.Move(index, index + 1); } } /// /// 保存配置 /// [RelayCommand] private void SaveConfiguration() { try { // 这里应该实现保存到文件的逻辑 _logger.LogInformation("触发器配置已保存"); MessageBox.Show("配置保存成功!", "提示", MessageBoxButton.OK, MessageBoxImage.Information); } catch (Exception ex) { _logger.LogError(ex, "保存触发器配置时发生错误"); MessageBox.Show($"保存失败:{ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error); } } /// /// 加载配置 /// [RelayCommand] private void LoadConfiguration() { try { // 这里应该实现从文件加载的逻辑 _logger.LogInformation("触发器配置已加载"); MessageBox.Show("配置加载成功!", "提示", MessageBoxButton.OK, MessageBoxImage.Information); } catch (Exception ex) { _logger.LogError(ex, "加载触发器配置时发生错误"); MessageBox.Show($"加载失败:{ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error); } } }