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