using Prism.Commands;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using TeamAAS.Communication.Models;
namespace TeamAAS.ViewModels
{
///
/// 全局变量编辑器 VM(可复用)。在独立工作集 上增删改移,
/// 与 live GlobalVariableManager.Variables 解耦——配合“克隆-编辑-提交”,取消可回滚。
/// 调用方指定 Scope(新建变量盖此作用域)与初始项(通常为某作用域的克隆)。
/// DataContext 供 GlobalVarEditorView 绑定。
///
public class GlobalVarEditorViewModel : TeamAAS.BindableBase
{
/// 工作集(克隆),编辑不直接影响 live 列表;由调用方在确定时提交。
public ObservableCollection Items { get; }
= new ObservableCollection();
/// 本编辑器管理的作用域;新建变量盖此 Scope。
public VarScope Scope { get; }
/// 可选变量类型(供类型下拉)。
public Array VarTypes => GlobalVariableTypes.AllTypes;
private GlobalVariableModel _selected;
public GlobalVariableModel Selected
{
get => _selected;
set
{
if (SetProperty(ref _selected, value))
{
DeleteCommand?.RaiseCanExecuteChanged();
MoveUpCommand?.RaiseCanExecuteChanged();
MoveDownCommand?.RaiseCanExecuteChanged();
}
}
}
public bool HasSelected => _selected != null;
public DelegateCommand AddCommand { get; }
public DelegateCommand DeleteCommand { get; }
public DelegateCommand MoveUpCommand { get; }
public DelegateCommand MoveDownCommand { get; }
public GlobalVarEditorViewModel(VarScope scope, IEnumerable initial)
{
Scope = scope;
if (initial != null)
foreach (var v in initial) Items.Add(v);
Reindex();
AddCommand = new DelegateCommand(Add);
DeleteCommand = new DelegateCommand(Delete, () => HasSelected);
MoveUpCommand = new DelegateCommand(MoveUp, () => HasSelected);
MoveDownCommand = new DelegateCommand(MoveDown, () => HasSelected);
}
private void Add(string dataType)
{
if (string.IsNullOrEmpty(dataType)) return;
Items.Add(GlobalVariableModel.Create(dataType, Scope, Items.Count));
}
private void Delete()
{
if (_selected == null) return;
Items.Remove(_selected);
Selected = null;
Reindex();
}
private void MoveUp()
{
if (_selected == null) return;
int i = Items.IndexOf(_selected);
if (i <= 0) return;
Items.Move(i, i - 1);
Reindex();
}
private void MoveDown()
{
if (_selected == null) return;
int i = Items.IndexOf(_selected);
if (i < 0 || i >= Items.Count - 1) return;
Items.Move(i, i + 1);
Reindex();
}
private void Reindex()
{
for (int i = 0; i < Items.Count; i++) Items[i].Index = i;
}
}
}