using System; using System.Collections.Generic; using System.Collections.ObjectModel; using CommunityToolkit.Mvvm.ComponentModel; namespace BetterGenshinImpact.ViewModel.Pages.Component; /// /// 齿轮任务模型,支持无限树嵌套层级 /// public partial class GearTaskViewModel : ObservableObject { [ObservableProperty] private string _name = string.Empty; [ObservableProperty] private string _path = string.Empty; [ObservableProperty] private string _description = string.Empty; [ObservableProperty] private string _taskType = string.Empty; [ObservableProperty] private string _latestExecutionResult = string.Empty; private bool _isEnabled = true; /// /// 是否启用,支持父子节点联动 /// public bool IsEnabled { get => _isEnabled; set { if (SetProperty(ref _isEnabled, value)) { // 当父节点状态改变时,同步更新所有子节点 UpdateChildrenEnabledState(value); } } } [ObservableProperty] private bool _isDirectory = false; [ObservableProperty] private bool _isExpanded = false; [ObservableProperty] private ObservableCollection _children = new(); /// /// 任务参数,存储为JSON字符串 /// shell 脚本存储 shell 命令 /// [ObservableProperty] private string _parameters = ""; /// /// 创建时间 /// public DateTime CreatedTime { get; set; } = DateTime.Now; /// /// 修改时间 /// public DateTime ModifiedTime { get; set; } = DateTime.Now; /// /// 任务优先级 /// [ObservableProperty] private int _priority = 0; /// /// 任务标签 /// [ObservableProperty] private string _tags = string.Empty; public GearTaskViewModel() { } public GearTaskViewModel(string name, bool isDirectory = false) { Name = name; IsDirectory = isDirectory; } /// /// 添加子任务 /// /// public void AddChild(GearTaskViewModel child) { Children.Add(child); IsDirectory = true; } /// /// 移除子任务 /// /// public void RemoveChild(GearTaskViewModel child) { Children.Remove(child); if (Children.Count == 0) { IsDirectory = false; } } /// /// 获取所有子任务(递归) /// /// public IEnumerable GetAllChildren() { foreach (var child in Children) { yield return child; foreach (var grandChild in child.GetAllChildren()) { yield return grandChild; } } } /// /// 更新所有子节点的启用状态 /// /// 启用状态 private void UpdateChildrenEnabledState(bool enabled) { foreach (var child in Children) { // 直接设置私有字段,避免触发递归更新 child._isEnabled = enabled; child.OnPropertyChanged(nameof(IsEnabled)); // 递归更新子节点的子节点 child.UpdateChildrenEnabledState(enabled); } } /// /// 克隆任务 /// /// public GearTaskViewModel Clone() { var clone = new GearTaskViewModel { Name = Name, Path = Path, Description = Description, TaskType = TaskType, IsEnabled = IsEnabled, IsDirectory = IsDirectory, Parameters = Parameters, Priority = Priority, Tags = Tags, CreatedTime = CreatedTime, ModifiedTime = DateTime.Now }; foreach (var child in Children) { clone.Children.Add(child.Clone()); } return clone; } }