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;
}
}