You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kev/Drawer/AI/Models/SpecialMessages/GriddingParamCardMessage.cs

133 lines
5.9 KiB
C#

1 month ago
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.CompilerServices;
namespace AI.Models.SpecialMessages
{
/// <summary>
/// 网格化参数卡片的执行阶段
/// </summary>
public enum GriddingParamCardPhase
{
/// <summary>正在从业务层加载参数</summary>
Loading = 0,
/// <summary>参数已加载,等待用户编辑并点击生成</summary>
Ready = 1,
/// <summary>正在执行成图</summary>
Generating = 2,
/// <summary>成图完成</summary>
Done = 3,
/// <summary>出错(加载失败或成图失败)</summary>
Error = 4,
}
/// <summary>
/// 网格化参数设置综合卡片:将「获取参数」「编辑参数」「执行成图」合并到一张卡片。
/// 整个业务流程由卡片本身驱动AI 只需调用一次展示此卡片;
/// 用户确认参数后点击"生成"按钮,卡片自动完成参数设置和成图,最终摘要发回 AI。
/// </summary>
public class GriddingParamCardMessage : ISpecialMessage, INotifyPropertyChanged
{
private GriddingParamCardPhase _phase = GriddingParamCardPhase.Loading;
private string _statusMessage = string.Empty;
private string _generateButtonLabel = "生成";
public string Id { get; set; } = Guid.NewGuid().ToString();
public string TypeName => "GriddingParamCard";
public bool IsLive => false;
// ── 阶段控制 ──────────────────────────────────────────────────────────
public GriddingParamCardPhase Phase
{
get => _phase;
set
{
if (SetProperty(ref _phase, value))
{
OnPropertyChanged(nameof(IsLoading));
OnPropertyChanged(nameof(ShowItems));
OnPropertyChanged(nameof(ShowGenerateButton));
OnPropertyChanged(nameof(IsGenerating));
OnPropertyChanged(nameof(IsDone));
OnPropertyChanged(nameof(IsError));
OnPropertyChanged(nameof(ShowDoneBadge));
OnPropertyChanged(nameof(ShowErrorMessage));
}
}
}
// ── 状态派生属性 ─────────────────────────────────────────────────────
/// <summary>是否正在加载参数(显示 loading 占位)</summary>
public bool IsLoading => _phase == GriddingParamCardPhase.Loading;
/// <summary>是否显示参数列表(非 Loading 阶段)</summary>
public bool ShowItems => _phase != GriddingParamCardPhase.Loading;
/// <summary>是否显示"生成"按钮Ready 阶段)</summary>
public bool ShowGenerateButton => _phase == GriddingParamCardPhase.Ready;
/// <summary>是否正在执行成图</summary>
public bool IsGenerating => _phase == GriddingParamCardPhase.Generating;
/// <summary>成图是否已完成</summary>
public bool IsDone => _phase == GriddingParamCardPhase.Done;
/// <summary>是否处于错误状态</summary>
public bool IsError => _phase == GriddingParamCardPhase.Error;
/// <summary>是否显示"成图完成"标记</summary>
public bool ShowDoneBadge => _phase == GriddingParamCardPhase.Done;
/// <summary>是否显示错误信息</summary>
public bool ShowErrorMessage => _phase == GriddingParamCardPhase.Error && !string.IsNullOrEmpty(_statusMessage);
// ── 状态文案 ──────────────────────────────────────────────────────────
/// <summary>状态提示文案(加载中、错误信息、成功提示等)</summary>
public string StatusMessage
{
get => _statusMessage;
set
{
SetProperty(ref _statusMessage, value ?? string.Empty);
OnPropertyChanged(nameof(ShowErrorMessage));
OnPropertyChanged(nameof(HasStatusMessage));
}
}
/// <summary>是否有状态信息</summary>
public bool HasStatusMessage => !string.IsNullOrEmpty(_statusMessage);
/// <summary>"生成"按钮文案(执行中可切换为"生成中..."</summary>
public string GenerateButtonLabel
{
get => _generateButtonLabel;
set => SetProperty(ref _generateButtonLabel, value ?? "生成");
}
// ── 参数项列表 ────────────────────────────────────────────────────────
/// <summary>参数项列表(从业务层加载后填充,用户可编辑)</summary>
public ObservableCollection<ParameterSetItem> Items { get; } = new ObservableCollection<ParameterSetItem>();
// ── INotifyPropertyChanged ───────────────────────────────────────────
public event PropertyChangedEventHandler? PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string? propertyName = null) =>
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
protected bool SetProperty<T>(ref T field, T value, [CallerMemberName] string? propertyName = null)
{
if (EqualityComparer<T>.Default.Equals(field, value)) return false;
field = value;
OnPropertyChanged(propertyName);
return true;
}
}
}