Bläddra i källkod

Made NodeViewModel generic and moved existing ones into PixiEditor.ViewModels.Document.Nodes

CPKreuz 1 år sedan
förälder
incheckning
a39eb7fdb4

+ 1 - 0
src/PixiEditor/Models/DocumentModels/DocumentUpdater.cs

@@ -19,6 +19,7 @@ using PixiEditor.Models.Handlers;
 using PixiEditor.Models.Layers;
 using PixiEditor.Numerics;
 using PixiEditor.ViewModels.Document;
+using PixiEditor.ViewModels.Document.Nodes;
 using PixiEditor.ViewModels.Nodes;
 
 namespace PixiEditor.Models.DocumentModels;

+ 10 - 12
src/PixiEditor/ViewModels/Document/DocumentViewModel.cs

@@ -46,6 +46,7 @@ using PixiEditor.Models.Structures;
 using PixiEditor.Models.Tools;
 using PixiEditor.Numerics;
 using PixiEditor.Parser.Skia;
+using PixiEditor.ViewModels.Document.Nodes;
 using PixiEditor.ViewModels.Document.TransformOverlays;
 using PixiEditor.Views.Overlays.SymmetryOverlay;
 using Color = PixiEditor.DrawingApi.Core.ColorsImpl.Color;
@@ -147,7 +148,7 @@ internal partial class DocumentViewModel : PixiObservableObject, IDocument
     private double verticalSymmetryAxisX;
     public double VerticalSymmetryAxisXBindable => verticalSymmetryAxisX;
 
-    private readonly HashSet<StructureMemberViewModel> softSelectedStructureMembers = new();
+    private readonly HashSet<IStructureMemberHandler> softSelectedStructureMembers = new();
 
     public bool UpdateableChangeActive => Internals.ChangeController.IsChangeActive;
 
@@ -714,8 +715,11 @@ internal partial class DocumentViewModel : PixiObservableObject, IDocument
         OnPropertyChanged(nameof(VerticalSymmetryAxisXBindable));
     }
 
-    public void SetSelectedMember(IStructureMemberHandler member) =>
-        SetSelectedMember((StructureMemberViewModel)member);
+    public void SetSelectedMember(IStructureMemberHandler member)
+    {
+        SelectedStructureMember = member;
+        OnPropertyChanged(nameof(SelectedStructureMember));
+    }
 
     public void SetHorizontalSymmetryAxisY(double horizontalSymmetryAxisY)
     {
@@ -742,25 +746,19 @@ internal partial class DocumentViewModel : PixiObservableObject, IDocument
         OnPropertyChanged(nameof(SelectionPathBindable));
     }
 
-    public void SetSelectedMember(StructureMemberViewModel? member)
+    public void AddSoftSelectedMember(IStructureMemberHandler member)
     {
-        SelectedStructureMember = member;
-        OnPropertyChanged(nameof(SelectedStructureMember));
+        softSelectedStructureMembers.Add(member);
     }
 
     public void RemoveSoftSelectedMember(IStructureMemberHandler member)
     {
         SelectedStructureMember = member;
+        softSelectedStructureMembers.Remove(member);
     }
 
     public void ClearSoftSelectedMembers() => softSelectedStructureMembers.Clear();
 
-    public void AddSoftSelectedMember(IStructureMemberHandler member) =>
-        softSelectedStructureMembers.Add((StructureMemberViewModel)member);
-
-    public void RemoveSoftSelectedMember(StructureMemberViewModel member) =>
-        softSelectedStructureMembers.Remove(member);
-
     #endregion
 
     /// <summary>

+ 1 - 0
src/PixiEditor/ViewModels/Document/FolderHandlerFactory.cs

@@ -1,6 +1,7 @@
 using PixiEditor.Helpers;
 using PixiEditor.Models.DocumentModels;
 using PixiEditor.Models.Handlers;
+using PixiEditor.ViewModels.Document.Nodes;
 
 namespace PixiEditor.ViewModels.Document;
 

+ 1 - 1
src/PixiEditor/ViewModels/Document/KeyFrameGroupViewModel.cs

@@ -52,7 +52,7 @@ internal class KeyFrameGroupViewModel : KeyFrameViewModel, IKeyFrameGroupHandler
         Children.CollectionChanged += ChildrenOnCollectionChanged;
         Document.StructureHelper.Find(LayerGuid).PropertyChanged += (sender, args) =>
         {
-            if (args.PropertyName == nameof(StructureMemberViewModel.NodeNameBindable))
+            if (args.PropertyName == nameof(IStructureMemberHandler.NodeNameBindable))
             {
                 OnPropertyChanged(nameof(LayerName));
             }

+ 1 - 0
src/PixiEditor/ViewModels/Document/LayerHandlerFactory.cs

@@ -1,6 +1,7 @@
 using PixiEditor.Helpers;
 using PixiEditor.Models.DocumentModels;
 using PixiEditor.Models.Handlers;
+using PixiEditor.ViewModels.Document.Nodes;
 
 namespace PixiEditor.ViewModels.Document;
 

+ 3 - 2
src/PixiEditor/ViewModels/Document/FolderViewModel.cs → src/PixiEditor/ViewModels/Document/Nodes/FolderViewModel.cs

@@ -1,10 +1,11 @@
 using System.Collections.ObjectModel;
+using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes;
 using PixiEditor.Models.DocumentModels;
 using PixiEditor.Models.Handlers;
 
-namespace PixiEditor.ViewModels.Document;
+namespace PixiEditor.ViewModels.Document.Nodes;
 #nullable enable
-internal class FolderViewModel : StructureMemberViewModel, IFolderHandler
+internal class FolderViewModel : StructureMemberViewModel<FolderNode>, IFolderHandler
 {
     public FolderViewModel()
     {

+ 3 - 2
src/PixiEditor/ViewModels/Document/LayerViewModel.cs → src/PixiEditor/ViewModels/Document/Nodes/LayerViewModel.cs

@@ -1,10 +1,11 @@
 using PixiEditor.ChangeableDocument.Actions.Generated;
+using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes;
 using PixiEditor.Models.DocumentModels;
 using PixiEditor.Models.Handlers;
 
-namespace PixiEditor.ViewModels.Document;
+namespace PixiEditor.ViewModels.Document.Nodes;
 #nullable enable
-internal class LayerViewModel : StructureMemberViewModel, ILayerHandler
+internal class LayerViewModel : StructureMemberViewModel<LayerNode>, ILayerHandler
 {
     public LayerViewModel()
     {

+ 16 - 18
src/PixiEditor/ViewModels/Document/StructureMemberViewModel.cs → src/PixiEditor/ViewModels/Document/Nodes/StructureMemberViewModel.cs

@@ -1,12 +1,6 @@
-using System.Collections.ObjectModel;
-using Avalonia.Media.Imaging;
-using ChunkyImageLib;
-using CommunityToolkit.Mvvm.ComponentModel;
-using PixiEditor.Views.Nodes;
-using PixiEditor.ChangeableDocument.Actions.Generated;
+using PixiEditor.ChangeableDocument.Actions.Generated;
+using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes;
 using PixiEditor.DrawingApi.Core;
-using PixiEditor.DrawingApi.Core.Numerics;
-using PixiEditor.Extensions.FlyUI.Elements;
 using PixiEditor.Helpers;
 using PixiEditor.Models.DocumentModels;
 using PixiEditor.Models.Handlers;
@@ -15,9 +9,9 @@ using PixiEditor.Numerics;
 using PixiEditor.ViewModels.Nodes;
 using BlendMode = PixiEditor.ChangeableDocument.Enums.BlendMode;
 
-namespace PixiEditor.ViewModels.Document;
+namespace PixiEditor.ViewModels.Document.Nodes;
 #nullable enable
-internal abstract class StructureMemberViewModel : NodeViewModel, IStructureMemberHandler
+internal abstract class StructureMemberViewModel<T> : NodeViewModel<T>, IStructureMemberHandler where T : Node
 {
     public StructureMemberViewModel()
     {
@@ -164,14 +158,6 @@ internal abstract class StructureMemberViewModel : NodeViewModel, IStructureMemb
     /// <summary>
     /// Calculates the size of a scaled-down preview for a given size of layer tight bounds.
     /// </summary>
-    public static VecI CalculatePreviewSize(VecI tightBoundsSize)
-    {
-        double proportions = tightBoundsSize.Y / (double)tightBoundsSize.X;
-        const int prSize = StructureHelpers.PreviewSize;
-        return proportions > 1
-            ? new VecI(Math.Max((int)Math.Round(prSize / proportions), 1), prSize)
-            : new VecI(prSize, Math.Max((int)Math.Round(prSize * proportions), 1));
-    }
 
     public StructureMemberViewModel(DocumentViewModel doc, DocumentInternalParts internals, Guid id)
     {
@@ -182,3 +168,15 @@ internal abstract class StructureMemberViewModel : NodeViewModel, IStructureMemb
         PreviewSurface = null;
     }
 }
+
+public static class StructureMemberViewModel
+{
+    public static VecI CalculatePreviewSize(VecI tightBoundsSize)
+    {
+        double proportions = tightBoundsSize.Y / (double)tightBoundsSize.X;
+        const int prSize = StructureHelpers.PreviewSize;
+        return proportions > 1
+            ? new VecI(Math.Max((int)Math.Round(prSize / proportions), 1), prSize)
+            : new VecI(prSize, Math.Max((int)Math.Round(prSize * proportions), 1));
+    }
+}

+ 4 - 0
src/PixiEditor/ViewModels/Nodes/NodeViewModel.cs

@@ -5,6 +5,7 @@ using ChunkyImageLib;
 using CommunityToolkit.Mvvm.ComponentModel;
 using PixiEditor.ChangeableDocument.Actions.Generated;
 using PixiEditor.ChangeableDocument.Changeables.Graph.Interfaces;
+using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes;
 using PixiEditor.ChangeableDocument.Changeables.Interfaces;
 using PixiEditor.ChangeableDocument.ChangeInfos.NodeGraph;
 using PixiEditor.DrawingApi.Core;
@@ -16,6 +17,7 @@ using PixiEditor.Numerics;
 using PixiEditor.ViewModels.Document;
 
 namespace PixiEditor.ViewModels.Nodes;
+
 internal class NodeViewModel : ObservableObject, INodeHandler
 {
     private IBrush? categoryBrush;
@@ -328,3 +330,5 @@ internal class NodeViewModel : ObservableObject, INodeHandler
         return Outputs.FirstOrDefault(x => x.PropertyName == propName) as NodePropertyViewModel;
     }
 }
+
+internal abstract class NodeViewModel<T> : NodeViewModel where T : Node { }

+ 1 - 0
src/PixiEditor/ViewModels/SubViewModels/LayersViewModel.cs

@@ -25,6 +25,7 @@ using PixiEditor.Numerics;
 using PixiEditor.UI.Common.Fonts;
 using PixiEditor.ViewModels.Dock;
 using PixiEditor.ViewModels.Document;
+using PixiEditor.ViewModels.Document.Nodes;
 
 namespace PixiEditor.ViewModels.SubViewModels;
 #nullable enable

+ 1 - 0
src/PixiEditor/Views/Layers/FolderControl.axaml.cs

@@ -6,6 +6,7 @@ using Avalonia.Media;
 using PixiEditor.Models.Controllers.InputDevice;
 using PixiEditor.Models.Layers;
 using PixiEditor.ViewModels.Document;
+using PixiEditor.ViewModels.Document.Nodes;
 
 namespace PixiEditor.Views.Layers;
 #nullable enable

+ 1 - 0
src/PixiEditor/Views/Layers/LayerControl.axaml.cs

@@ -7,6 +7,7 @@ using CommunityToolkit.Mvvm.Input;
 using PixiEditor.Models.Controllers.InputDevice;
 using PixiEditor.Models.Layers;
 using PixiEditor.ViewModels.Document;
+using PixiEditor.ViewModels.Document.Nodes;
 
 namespace PixiEditor.Views.Layers;
 #nullable enable

+ 3 - 2
src/PixiEditor/Views/Layers/LayersManager.axaml

@@ -14,6 +14,7 @@
              xmlns:docVm="clr-namespace:PixiEditor.ViewModels.Document"
              xmlns:ui1="clr-namespace:PixiEditor.Helpers.UI"
              xmlns:panels="clr-namespace:PixiEditor.Views.Panels"
+             xmlns:nodes="clr-namespace:PixiEditor.ViewModels.Document.Nodes"
              mc:Ignorable="d"
              d:DesignHeight="450" d:DesignWidth="250" x:Name="layersManager">
     <UserControl.Resources>
@@ -137,14 +138,14 @@
 
                 </TreeView.Resources>
                 <TreeView.DataTemplates>
-                    <TreeDataTemplate DataType="docVm:FolderViewModel" ItemsSource="{Binding Children}">
+                    <TreeDataTemplate DataType="nodes:FolderViewModel" ItemsSource="{Binding Children}">
                         <layers:FolderControl
                                 Folder="{Binding}"
                                 Manager="{Binding ElementName=layersManager}"
                                 PointerPressed="FolderControl_MouseDown"
                                 PointerReleased="FolderControl_MouseUp"/>
                     </TreeDataTemplate>
-                    <DataTemplate DataType="{x:Type docVm:LayerViewModel}">
+                    <DataTemplate DataType="{x:Type nodes:LayerViewModel}">
                         <layers:LayerControl
                             Layer="{Binding}"
                             Manager="{Binding ElementName=layersManager}"

+ 2 - 1
src/PixiEditor/Views/Layers/LayersManager.axaml.cs

@@ -10,6 +10,7 @@ using PixiEditor.Models.Layers;
 using PixiEditor.ViewModels;
 using PixiEditor.ViewModels.Dock;
 using PixiEditor.ViewModels.Document;
+using PixiEditor.ViewModels.Document.Nodes;
 using PixiEditor.ViewModels.Nodes;
 
 namespace PixiEditor.Views.Layers;
@@ -180,7 +181,7 @@ internal partial class LayersManager : UserControl
         ((Border)sender).BorderBrush = Brushes.Transparent;
     }
 
-    private void HandleMouseDown(StructureMemberViewModel memberVM, PointerPressedEventArgs pointerPressedEventArgs)
+    private void HandleMouseDown(IStructureMemberHandler memberVM, PointerPressedEventArgs pointerPressedEventArgs)
     {
         if (ActiveDocument is null)
             return;