瀏覽代碼

Selection Overlay

Krzysztof Krysiński 1 年之前
父節點
當前提交
93b846b4d7

+ 58 - 25
src/PixiEditor.AvaloniaUI/Views/Main/ViewportControls/Viewport.axaml.cs

@@ -11,6 +11,7 @@ using Avalonia.Interactivity;
 using Avalonia.Media.Imaging;
 using ChunkyImageLib;
 using ChunkyImageLib.DataHolders;
+using PixiEditor.AvaloniaUI.Helpers.Converters;
 using PixiEditor.AvaloniaUI.Helpers.UI;
 using PixiEditor.AvaloniaUI.Models.Controllers.InputDevice;
 using PixiEditor.AvaloniaUI.Models.DocumentModels;
@@ -20,6 +21,7 @@ using PixiEditor.AvaloniaUI.ViewModels.Document;
 using PixiEditor.AvaloniaUI.ViewModels.Tools.ToolSettings.Toolbars;
 using PixiEditor.AvaloniaUI.Views.Overlays;
 using PixiEditor.AvaloniaUI.Views.Overlays.BrushShapeOverlay;
+using PixiEditor.AvaloniaUI.Views.Overlays.SelectionOverlay;
 using PixiEditor.AvaloniaUI.Views.Overlays.SymmetryOverlay;
 using PixiEditor.AvaloniaUI.Views.Visuals;
 using PixiEditor.DrawingApi.Core.Numerics;
@@ -293,16 +295,14 @@ internal partial class Viewport : UserControl, INotifyPropertyChanged
 
     private MouseUpdateController? mouseUpdateController;
 
-    private GridLines _gridLinesOverlay;
-
-    private SymmetryOverlay _symmetryOverlay;
+    private GridLines gridLinesOverlay;
+    private SelectionOverlay selectionOverlay;
 
     static Viewport()
     {
         DocumentProperty.Changed.Subscribe(OnDocumentChange);
         ZoomViewportTriggerProperty.Changed.Subscribe(ZoomViewportTriggerChanged);
         CenterViewportTriggerProperty.Changed.Subscribe(CenterViewportTriggerChanged);
-        GridLinesVisibleProperty.Changed.Subscribe(GridLinesVisibleChanged);
     }
 
     public Viewport()
@@ -322,8 +322,14 @@ internal partial class Viewport : UserControl, INotifyPropertyChanged
 
     private void InitBuiltInOverlays()
     {
-        _gridLinesOverlay = new GridLines();
-        _symmetryOverlay = new SymmetryOverlay();
+        gridLinesOverlay = new GridLines();
+        BindGridLines();
+
+        selectionOverlay = new SelectionOverlay();
+        BindSelectionOverlay();
+
+        ActiveOverlays.Add(gridLinesOverlay);
+        ActiveOverlays.Add(selectionOverlay);
     }
 
     public Panel? MainImage => zoombox != null ? (Panel?)((Grid?)((Border?)zoombox.AdditionalContent)?.Child)?.Children[0] : null;
@@ -375,41 +381,68 @@ internal partial class Viewport : UserControl, INotifyPropertyChanged
         newDoc?.Operations.AddOrUpdateViewport(viewport.GetLocation());
     }
 
-    private static void GridLinesVisibleChanged(AvaloniaPropertyChangedEventArgs<bool> e)
+    private void BindGridLines()
     {
-        Viewport? viewport = (Viewport)e.Sender;
-        if (e.NewValue.Value)
+        Binding isVisBinding = new()
         {
-            BindGridLines(viewport);
-            viewport.ActiveOverlays.Add(viewport._gridLinesOverlay);
-        }
-        else
-        {
-            viewport.ActiveOverlays.Remove(viewport._gridLinesOverlay);
-        }
-    }
+            Source = this,
+            Path = "GridLinesVisible",
+            Mode = BindingMode.OneWay
+        };
 
-    private static void BindGridLines(Viewport viewport)
-    {
         Binding binding = new()
         {
-            Source = viewport.Document,
+            Source = Document,
             Path = "Width",
             Mode = BindingMode.OneWay
         };
 
-        viewport._gridLinesOverlay.Bind(GridLines.PixelWidthProperty, binding);
-        viewport._gridLinesOverlay.Bind(GridLines.ColumnsProperty, binding);
+        gridLinesOverlay.Bind(GridLines.PixelWidthProperty, binding);
+        gridLinesOverlay.Bind(GridLines.ColumnsProperty, binding);
 
         binding = new Binding
         {
-            Source = viewport.Document,
+            Source = Document,
             Path = "Height",
             Mode = BindingMode.OneWay
         };
 
-        viewport._gridLinesOverlay.Bind(GridLines.PixelHeightProperty, binding);
-        viewport._gridLinesOverlay.Bind(GridLines.RowsProperty, binding);
+        gridLinesOverlay.Bind(GridLines.PixelHeightProperty, binding);
+        gridLinesOverlay.Bind(GridLines.RowsProperty, binding);
+        gridLinesOverlay.Bind(GridLines.IsVisibleProperty, isVisBinding);
+    }
+
+    private void BindSelectionOverlay()
+    {
+        //    ShowFill="{Binding ToolsSubViewModel.ActiveTool, Source={viewModels:MainVM}, Converter={converters:IsSelectionToolConverter}}"
+        //Path="{Binding Document.SelectionPathBindable}"
+
+        Binding showFillBinding = new()
+        {
+            Source = this,
+            Path = "Document.ToolsSubViewModel.ActiveTool",
+            Converter = new IsSelectionToolConverter(),
+            Mode = BindingMode.OneWay
+        };
+
+        Binding pathBinding = new()
+        {
+            Source = this,
+            Path = "Document.SelectionPathBindable",
+            Mode = BindingMode.OneWay
+        };
+
+        Binding isVisibleBinding = new()
+        {
+            Source = this,
+            Path = "Document.SelectionPathBindable",
+            Mode = BindingMode.OneWay,
+            Converter = new NotNullToVisibilityConverter()
+        };
+
+        selectionOverlay.Bind(SelectionOverlay.ShowFillProperty, showFillBinding);
+        selectionOverlay.Bind(SelectionOverlay.PathProperty, pathBinding);
+        selectionOverlay.Bind(IsVisibleProperty, isVisibleBinding);
     }
 
     private void OnImageSizeChanged(object? sender, DocumentSizeChangedEventArgs e)

+ 1 - 1
src/PixiEditor.AvaloniaUI/Views/Overlays/Overlay.cs

@@ -6,7 +6,7 @@ using PixiEditor.AvaloniaUI.Views.Overlays.Handles;
 
 namespace PixiEditor.AvaloniaUI.Views.Overlays;
 
-public class Overlay : Decorator
+public abstract class Overlay : Decorator
 {
     public List<Handle> Handles { get; } = new();
 

+ 4 - 17
src/PixiEditor.AvaloniaUI/Views/Overlays/SelectionOverlay/SelectionOverlay.cs

@@ -1,7 +1,6 @@
 using System.Linq;
 using Avalonia;
 using Avalonia.Animation;
-using Avalonia.Controls;
 using Avalonia.Media;
 using Avalonia.Styling;
 using PixiEditor.AvaloniaUI.Animation;
@@ -9,7 +8,7 @@ using PixiEditor.DrawingApi.Core.Surface.Vector;
 
 namespace PixiEditor.AvaloniaUI.Views.Overlays.SelectionOverlay;
 #nullable enable
-internal class SelectionOverlay : Control
+internal class SelectionOverlay : Overlay
 {
     public static readonly StyledProperty<VectorPath?> PathProperty =
         AvaloniaProperty.Register<SelectionOverlay, VectorPath?>(nameof(Path));
@@ -20,15 +19,6 @@ internal class SelectionOverlay : Control
         set => SetValue(PathProperty, value);
     }
 
-    public static readonly StyledProperty<double> ZoomboxScaleProperty =
-        AvaloniaProperty.Register<SelectionOverlay, double>(nameof(ZoomboxScale), defaultValue: 1.0);
-
-    public double ZoomboxScale
-    {
-        get => GetValue(ZoomboxScaleProperty);
-        set => SetValue(ZoomboxScaleProperty, value);
-    }
-
     public static readonly StyledProperty<bool> ShowFillProperty =
         AvaloniaProperty.Register<SelectionOverlay, bool>(nameof(ShowFill), defaultValue: true);
 
@@ -46,7 +36,6 @@ internal class SelectionOverlay : Control
     static SelectionOverlay()
     {
         AffectsRender<SelectionOverlay>(PathProperty);
-        ZoomboxScaleProperty.Changed.Subscribe(OnZoomboxScaleChanged);
         ShowFillProperty.Changed.Subscribe(OnShowFillChanged);
     }
 
@@ -107,12 +96,10 @@ internal class SelectionOverlay : Control
         drawingContext.DrawGeometry(fillBrush, blackDashedPen, renderPath);
     }
 
-    private static void OnZoomboxScaleChanged(AvaloniaPropertyChangedEventArgs<double> args)
+    protected override void ZoomChanged(double newZoom)
     {
-        var self = (SelectionOverlay)args.Sender;
-        double newScale = args.NewValue.Value;
-        self.whitePen.Thickness = 1.0 / newScale;
-        self.blackDashedPen.Thickness = 1.0 / newScale;
+        whitePen.Thickness = 1.0 / newZoom;
+        blackDashedPen.Thickness = 1.0 / newZoom;
     }
 
     private static void OnShowFillChanged(AvaloniaPropertyChangedEventArgs<bool> args)