using System.Collections.ObjectModel; using System.Text.Json; using BetterGenshinImpact.Model; using BetterGenshinImpact.ViewModel; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using Microsoft.Extensions.Logging; using System.IO; using System.Windows; using System.Linq; using System; using BetterGenshinImpact.ViewModel.Pages.Component; namespace BetterGenshinImpact.ViewModel.Pages; /// /// 任务列表页面ViewModel /// public partial class GearTaskListPageViewModel : ViewModel { private readonly ILogger _logger; /// /// 任务定义列表(左侧) /// [ObservableProperty] private ObservableCollection _taskDefinitions = new(); /// /// 当前选中的任务定义 /// [ObservableProperty] private GearTaskDefinitionViewModel? _selectedTaskDefinition; /// /// 当前任务树(右侧) /// [ObservableProperty] private ObservableCollection _currentTaskTree = new(); /// /// 当前选中的任务节点 /// [ObservableProperty] private GearTaskViewModel? _selectedTaskNode; /// /// 可用的任务类型 /// public ObservableCollection AvailableTaskTypes { get; } = new() { "采集任务", "战斗任务", "传送任务", "交互任务", "等待任务", "脚本任务", "条件任务", "循环任务", "组合任务" }; public GearTaskListPageViewModel(ILogger logger) { _logger = logger; InitializeData(); } /// /// 初始化数据 /// private void InitializeData() { // 创建示例数据 var sampleTask = new GearTaskDefinitionViewModel("示例任务组", "这是一个示例任务组"); if (sampleTask.RootTask != null) { sampleTask.RootTask.AddChild(new GearTaskViewModel("采集任务1") { TaskType = "采集任务", Description = "采集莲花" }); sampleTask.RootTask.AddChild(new GearTaskViewModel("战斗任务1") { TaskType = "战斗任务", Description = "击败史莱姆" }); var subGroup = new GearTaskViewModel("子任务组", true); subGroup.AddChild(new GearTaskViewModel("传送任务1") { TaskType = "传送任务", Description = "传送到蒙德" }); subGroup.AddChild(new GearTaskViewModel("交互任务1") { TaskType = "交互任务", Description = "与NPC对话" }); sampleTask.RootTask.AddChild(subGroup); } TaskDefinitions.Add(sampleTask); } /// /// 选中任务定义时的处理 /// partial void OnSelectedTaskDefinitionChanged(GearTaskDefinitionViewModel? value) { // 清除之前选中项的状态 foreach (var task in TaskDefinitions) { task.IsSelected = false; } // 设置当前选中项 if (value != null) { value.IsSelected = true; } CurrentTaskTree.Clear(); if (value?.RootTask != null) { CurrentTaskTree.Add(value.RootTask); } } /// /// 选择任务定义命令 /// [RelayCommand] private void SelectTaskDefinition(GearTaskDefinitionViewModel? taskDefinition) { SelectedTaskDefinition = taskDefinition; } /// /// 添加新的任务定义 /// [RelayCommand] private void AddTaskDefinition() { var newTask = new GearTaskDefinitionViewModel($"新任务组 {TaskDefinitions.Count + 1}", "新创建的任务组"); TaskDefinitions.Add(newTask); SelectedTaskDefinition = newTask; } /// /// 删除任务定义 /// [RelayCommand] private void DeleteTaskDefinition(GearTaskDefinitionViewModel? taskDefinition) { if (taskDefinition == null) return; var result = MessageBox.Show($"确定要删除任务定义 '{taskDefinition.Name}' 吗?", "确认删除", MessageBoxButton.YesNo, MessageBoxImage.Question); if (result == MessageBoxResult.Yes) { TaskDefinitions.Remove(taskDefinition); if (SelectedTaskDefinition == taskDefinition) { SelectedTaskDefinition = TaskDefinitions.FirstOrDefault(); } } } /// /// 重命名任务定义 /// [RelayCommand] private void RenameTaskDefinition(GearTaskDefinitionViewModel? taskDefinition) { if (taskDefinition == null) return; // 这里可以弹出重命名对话框,暂时简单处理 var newName = "新名称"; // 简化处理,实际应该弹出输入框 if (!string.IsNullOrWhiteSpace(newName)) { taskDefinition.Name = newName; taskDefinition.ModifiedTime = DateTime.Now; if (taskDefinition.RootTask != null) { taskDefinition.RootTask.Name = newName; } } } /// /// 添加任务节点 /// [RelayCommand] private void AddTaskNode(string? taskType = null) { if (SelectedTaskDefinition?.RootTask == null) return; var newTask = new GearTaskViewModel($"新任务 {DateTime.Now:HHmmss}") { TaskType = taskType ?? AvailableTaskTypes.First(), Description = "新创建的任务" }; if (SelectedTaskNode != null) { SelectedTaskNode.AddChild(newTask); } else { SelectedTaskDefinition.RootTask.AddChild(newTask); } SelectedTaskDefinition.ModifiedTime = DateTime.Now; } /// /// 添加任务组 /// [RelayCommand] private void AddTaskGroup() { if (SelectedTaskDefinition?.RootTask == null) return; var newGroup = new GearTaskViewModel($"新任务组 {DateTime.Now:HHmmss}", true) { Description = "新创建的任务组" }; if (SelectedTaskNode != null) { SelectedTaskNode.AddChild(newGroup); } else { SelectedTaskDefinition.RootTask.AddChild(newGroup); } SelectedTaskDefinition.ModifiedTime = DateTime.Now; } /// /// 删除任务节点 /// [RelayCommand] private void DeleteTaskNode(GearTaskViewModel? taskNode) { if (taskNode == null || SelectedTaskDefinition?.RootTask == null) return; var result = MessageBox.Show($"确定要删除任务 '{taskNode.Name}' 吗?", "确认删除", MessageBoxButton.YesNo, MessageBoxImage.Question); if (result == MessageBoxResult.Yes) { RemoveTaskFromTree(SelectedTaskDefinition.RootTask, taskNode); SelectedTaskDefinition.ModifiedTime = DateTime.Now; } } /// /// 从树中移除任务节点 /// private bool RemoveTaskFromTree(GearTaskViewModel parent, GearTaskViewModel target) { if (parent.Children.Contains(target)) { parent.RemoveChild(target); return true; } foreach (var child in parent.Children) { if (RemoveTaskFromTree(child, target)) { return true; } } return false; } /// /// 保存到JSON(预留功能) /// [RelayCommand] private void SaveToJson() { try { var json = JsonSerializer.Serialize(TaskDefinitions, new JsonSerializerOptions { WriteIndented = true, Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping }); // 这里可以保存到配置文件 _logger.LogInformation("任务定义已序列化为JSON: {Json}", json); MessageBox.Show("保存成功!", "提示", MessageBoxButton.OK, MessageBoxImage.Information); } catch (Exception ex) { _logger.LogError(ex, "保存任务定义到JSON时发生错误"); MessageBox.Show($"保存失败: {ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error); } } /// /// 从JSON加载(预留功能) /// [RelayCommand] private void LoadFromJson() { try { // 这里可以从配置文件加载 _logger.LogInformation("从JSON加载任务定义功能待实现"); MessageBox.Show("加载功能待实现!", "提示", MessageBoxButton.OK, MessageBoxImage.Information); } catch (Exception ex) { _logger.LogError(ex, "从JSON加载任务定义时发生错误"); MessageBox.Show($"加载失败: {ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error); } } }