using System; using System.Collections.Generic; using System.Linq; using System.Text.Json.Serialization; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using StabilityMatrix.Avalonia.Controls; using StabilityMatrix.Avalonia.Services; using StabilityMatrix.Avalonia.ViewModels.Base; using StabilityMatrix.Avalonia.ViewModels.Inference.Modules; using StabilityMatrix.Core.Attributes; #pragma warning disable CS0657 // Not a valid attribute location for this declaration namespace StabilityMatrix.Avalonia.ViewModels.Inference; [View(typeof(StackEditableCard))] [ManagedService] [Transient] public partial class StackEditableCardViewModel : StackViewModelBase { private readonly ServiceManager vmFactory; [ObservableProperty] [property: JsonIgnore] private string? title = Languages.Resources.Label_Steps; [ObservableProperty] [property: JsonIgnore] private bool isEditEnabled; /// /// Available module types for user creation /// [JsonIgnore] public IReadOnlyList AvailableModules { get; set; } = Array.Empty(); /// /// Default modules that are used when no modules are loaded /// This is a subset of /// [JsonIgnore] public IReadOnlyList DefaultModules { get; set; } = Array.Empty(); /// public StackEditableCardViewModel(ServiceManager vmFactory) : base(vmFactory) { this.vmFactory = vmFactory; } /// /// Populate with new instances of types /// public void InitializeDefaults() { foreach (var module in DefaultModules) { AddModule(module); } } partial void OnIsEditEnabledChanged(bool value) { // Propagate edit state to children foreach (var module in Cards.OfType()) { module.IsEditEnabled = value; } } /// protected override void OnCardAdded(LoadableViewModelBase item) { base.OnCardAdded(item); if (item is StackExpanderViewModel module) { // Inherit our edit state module.IsEditEnabled = IsEditEnabled; } } public T AddModule() where T : ModuleBase { var card = vmFactory.Get(); AddCards(card); return card; } public T AddModule(Action initializer) where T : ModuleBase { var card = vmFactory.Get(initializer); AddCards(card); return card; } [RelayCommand] private void AddModule(Type type) { if (!type.IsSubclassOf(typeof(ModuleBase))) { throw new ArgumentException($"Type {type} must be subclass of {nameof(ModuleBase)}"); } var card = vmFactory.Get(type) as LoadableViewModelBase; AddCards(card!); } /*/// public override void LoadStateFromJsonObject(JsonObject state) { var derivedTypes = ViewModelSerializer.GetDerivedTypes(typeof(LoadableViewModelBase)); Clear(); var stateArray = state.AsArray(); foreach (var node in stateArray) { } var cards = ViewModelSerializer.DeserializeJsonObject>(state); AddCards(cards!); } /// public override JsonObject SaveStateToJsonObject() { return ViewModelSerializer.SerializeToJsonObject(Cards.ToList()); }*/ }