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#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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