Browse Source

Refreshing cursor after apply transform works

flabbet 8 months ago
parent
commit
85294f118c
2 changed files with 32 additions and 0 deletions
  1. 11 0
      src/PixiEditor/Views/Overlays/Overlay.cs
  2. 21 0
      src/PixiEditor/Views/Rendering/Scene.cs

+ 11 - 0
src/PixiEditor/Views/Overlays/Overlay.cs

@@ -44,6 +44,7 @@ public abstract class Overlay : Decorator, IOverlay // TODO: Maybe make it not a
     }
 
     public event Action? RefreshRequested;
+    public event Action? RefreshCursorRequested;
     public event PointerEvent? PointerEnteredOverlay;
     public event PointerEvent? PointerExitedOverlay;
     public event PointerEvent? PointerMovedOverlay;
@@ -77,6 +78,11 @@ public abstract class Overlay : Decorator, IOverlay // TODO: Maybe make it not a
         InvalidateVisual(); // For elements in visual tree
     }
 
+    public void ForceRefreshCursor()
+    {
+        RefreshCursorRequested?.Invoke();
+    }
+
     public void CaptureHandle(Handle handle)
     {
         CapturedHandle = handle;
@@ -273,6 +279,11 @@ public abstract class Overlay : Decorator, IOverlay // TODO: Maybe make it not a
         {
             Refresh();
         }
+        else
+        {
+            Cursor = null;
+            RefreshCursorRequested?.Invoke();
+        }
     }
 
     protected static void AffectsOverlayRender(params AvaloniaProperty[] properties)

+ 21 - 0
src/PixiEditor/Views/Rendering/Scene.cs

@@ -317,6 +317,8 @@ internal class Scene : Zoombox.Zoombox, ICustomHitTest
         {
             OverlayPointerArgs args = ConstructPointerArgs(e);
 
+            Cursor = DefaultCursor;
+            
             if (capturedOverlay != null)
             {
                 capturedOverlay.MovePointer(args);
@@ -494,6 +496,7 @@ internal class Scene : Zoombox.Zoombox, ICustomHitTest
             foreach (Overlay overlay in e.OldItems)
             {
                 overlay.RefreshRequested -= QueueRender;
+                overlay.RefreshCursorRequested -= RefreshCursor;
             }
         }
 
@@ -502,6 +505,7 @@ internal class Scene : Zoombox.Zoombox, ICustomHitTest
             foreach (Overlay overlay in e.NewItems)
             {
                 overlay.RefreshRequested += QueueRender;
+                overlay.RefreshCursorRequested += RefreshCursor;
             }
         }
     }
@@ -610,6 +614,23 @@ internal class Scene : Zoombox.Zoombox, ICustomHitTest
 
     #endregion
 
+    public void RefreshCursor()
+    {
+        Cursor = DefaultCursor;
+        if (AllOverlays != null)
+        {
+            foreach (Overlay overlay in AllOverlays)
+            {
+                if (!overlay.IsVisible) continue;
+                
+                if (overlay.IsHitTestVisible)
+                {
+                    Cursor = overlay.Cursor ?? DefaultCursor;
+                }
+            }
+        }
+    }
+    
     private void QueueRender()
     {
         Dispatcher.UIThread.Post(InvalidateVisual, DispatcherPriority.Render);