using System; using System.Linq; using System.Text.Json; using System.Text.Json.Serialization; using Avalonia.Controls; using Avalonia.Input; using Avalonia.Threading; using CommunityToolkit.Mvvm.ComponentModel; using StabilityMatrix.Avalonia.Models; using StabilityMatrix.Avalonia.ViewModels.Inference; using StabilityMatrix.Core.Models.Database; using StabilityMatrix.Core.Models.FileInterfaces; #pragma warning disable CS0657 // Not a valid attribute location for this declaration namespace StabilityMatrix.Avalonia.ViewModels.Base; public abstract partial class InferenceTabViewModelBase : LoadableViewModelBase, IDisposable, IPersistentViewProvider, IDropTarget { /// /// The title of the tab /// public virtual string TabTitle => ProjectFile?.NameWithoutExtension ?? "New Project"; /// /// Whether there are unsaved changes /// [ObservableProperty] [property: JsonIgnore] private bool hasUnsavedChanges; /// /// The tab's project file /// [ObservableProperty] [NotifyPropertyChangedFor(nameof(TabTitle))] [property: JsonIgnore] private FilePath? projectFile; /// Control? IPersistentViewProvider.AttachedPersistentView { get; set; } protected virtual void Dispose(bool disposing) { if (disposing) { ((IPersistentViewProvider)this).AttachedPersistentView = null; } } /// public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } /// public void DragOver(object? sender, DragEventArgs e) { // 1. Context drop for LocalImageFile if (e.Data.GetDataFormats().Contains("Context")) { if (e.Data.Get("Context") is LocalImageFile imageFile) { e.Handled = true; return; } e.DragEffects = DragDropEffects.None; } // 2. OS Files if (e.Data.GetDataFormats().Contains(DataFormats.Files)) { e.Handled = true; e.DragEffects = DragDropEffects.None; return; } e.DragEffects = DragDropEffects.None; } /// public void Drop(object? sender, DragEventArgs e) { // 1. Context drop for LocalImageFile if (e.Data.GetDataFormats().Contains("Context")) { if (e.Data.Get("Context") is LocalImageFile imageFile) { e.Handled = true; Dispatcher.UIThread.Post(() => { var metadata = imageFile.ReadMetadata(); if (metadata.SMProject is not null) { var project = JsonSerializer.Deserialize( metadata.SMProject ); // Check project type matches if ( project?.ProjectType.ToViewModelType() == GetType() && project.State is not null ) { LoadStateFromJsonObject(project.State); } // Load image if (this is IImageGalleryComponent imageGalleryComponent) { imageGalleryComponent.LoadImagesToGallery( new ImageSource(imageFile.GlobalFullPath) ); } } }); return; } } // 2. OS Files if (e.Data.GetDataFormats().Contains(DataFormats.Files)) { e.Handled = true; } } }