Selaa lähdekoodia

Incorporate node size in node zone

CPKreuz 1 kuukausi sitten
vanhempi
commit
aa56068420

+ 2 - 0
src/PixiEditor/Models/Handlers/INodeHandler.cs

@@ -1,5 +1,6 @@
 using System.Collections.ObjectModel;
 using System.ComponentModel;
+using Avalonia;
 using Avalonia.Media;
 using ChunkyImageLib;
 using PixiEditor.ChangeableDocument.Changeables.Graph.Interfaces;
@@ -22,6 +23,7 @@ public interface INodeHandler : INotifyPropertyChanged, IDisposable
     public ObservableRangeCollection<INodePropertyHandler> Outputs { get; }
     public PreviewPainter? ResultPainter { get; set; }
     public VecD PositionBindable { get; set; }
+    public Rect UiSize { get; set; }
     public bool IsNodeSelected { get; set; }
     public string Icon { get; }
     public void TraverseBackwards(Func<INodeHandler, bool> func);

+ 2 - 1
src/PixiEditor/Styles/Templates/NodeGraphView.axaml

@@ -59,7 +59,8 @@
                                         RelativeSource={RelativeSource FindAncestor, AncestorType=nodes:NodeGraphView}}"
                                     SocketDropCommand="{Binding SocketDropCommand,
                                         RelativeSource={RelativeSource FindAncestor, AncestorType=nodes:NodeGraphView}}"
-                                    ResultPreview="{Binding ResultPainter}" />
+                                    ResultPreview="{Binding ResultPainter}"
+                                    Bounds="{Binding UiSize, Mode=OneWayToSource}" />
                             </DataTemplate>
                         </ItemsControl.ItemTemplate>
                         <ItemsControl.ItemContainerTheme>

+ 3 - 1
src/PixiEditor/ViewModels/Nodes/NodeFrameViewModelBase.cs

@@ -81,7 +81,9 @@ public abstract class NodeFrameViewModelBase : ObservableObject
 
     private void NodePropertyChanged(object? sender, PropertyChangedEventArgs e)
     {
-        if (e.PropertyName != nameof(INodeHandler.PositionBindable))
+        if (e.PropertyName is
+            not nameof(INodeHandler.PositionBindable) and
+            not nameof(INodeHandler.UiSize))
         {
             return;
         }

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

@@ -25,6 +25,7 @@ namespace PixiEditor.ViewModels.Nodes;
 internal abstract class NodeViewModel : ObservableObject, INodeHandler
 {
     private LocalizedString displayName;
+    private Rect size;
     private IBrush? categoryBrush;
     private string? nodeNameBindable;
     private VecD position;
@@ -111,6 +112,12 @@ internal abstract class NodeViewModel : ObservableObject, INodeHandler
         }
     }
 
+    public Rect UiSize
+    {
+        get => size;
+        set => SetProperty(ref size, value);
+    }
+
     public ObservableRangeCollection<INodePropertyHandler> Inputs
     {
         get => inputs;

+ 13 - 5
src/PixiEditor/ViewModels/Nodes/NodeZoneViewModel.cs

@@ -51,22 +51,30 @@ public sealed class NodeZoneViewModel : NodeFrameViewModelBase
         const int defaultXOffset = -30;
         const int defaultYOffset = -45;
         
-        // TODO: Use the actual node height
         foreach (var node in Nodes)
         {
+            var size = new VecD(node.UiSize.Size.Width, node.UiSize.Size.Height);
+
             if (node == start)
             {
-                list.Add(new RectD(node.PositionBindable + new VecD(100, defaultYOffset), new VecD(100, 400)));
+                // The + 40 ensure that the rectangle has a minimum size
+                var safeSizeOffset = size + new VecD(-size.X + 40, defaultYOffset * -2);
+                
+                list.Add(new RectD(node.PositionBindable + new VecD(size.X / 3 * 2, defaultYOffset), safeSizeOffset));
                 continue;
             }
-
+            
             if (node == end)
             {
-                list.Add(new RectD(node.PositionBindable + new VecD(defaultXOffset, defaultYOffset), new VecD(100, 400)));
+                var sizeOffset = size + new VecD(-size.X, defaultYOffset * -2);
+
+                list.Add(new RectD(node.PositionBindable + new VecD(size.X / 3, defaultYOffset), sizeOffset));
                 continue;
             }
             
-            list.Add(new RectD(node.PositionBindable + new VecD(defaultXOffset, defaultYOffset), new VecD(200, 400)));
+            var sizeNormalOffset = size + new VecD(defaultXOffset * -2, defaultYOffset * -2);
+
+            list.Add(new RectD(node.PositionBindable + new VecD(defaultXOffset, defaultYOffset), sizeNormalOffset));
         }
         
         return list;