From 7d759c87977fbf638a30a0521b33c52fc47885bb Mon Sep 17 00:00:00 2001 From: Misaki Date: Sat, 28 Mar 2026 14:25:32 +0900 Subject: [PATCH] fix(dock): move dock math to core to fix test suite breakage --- .../Controls/Internal/Docking/DockMath.cs | 33 +++++++++++++++++++ .../Ghost.Editor/View/Controls/DockLayout.cs | 17 +--------- src/Test/Ghost.UnitTest/DockLayoutTest.cs | 30 ++++++++--------- src/Test/Ghost.UnitTest/Ghost.UnitTest.csproj | 1 - 4 files changed, 49 insertions(+), 32 deletions(-) create mode 100644 src/Editor/Ghost.Editor.Core/Controls/Internal/Docking/DockMath.cs diff --git a/src/Editor/Ghost.Editor.Core/Controls/Internal/Docking/DockMath.cs b/src/Editor/Ghost.Editor.Core/Controls/Internal/Docking/DockMath.cs new file mode 100644 index 0000000..6d87c55 --- /dev/null +++ b/src/Editor/Ghost.Editor.Core/Controls/Internal/Docking/DockMath.cs @@ -0,0 +1,33 @@ +namespace Ghost.Editor.Core.Controls.Internal.Docking; + +/// +/// Defines the possible dock positions for a drop operation. +/// +public enum DockPosition +{ + Center, + Top, + Bottom, + Left, + Right, + None +} + +/// +/// Helper class for docking-related calculations. +/// +public static class DockMath +{ + /// + /// Calculates the dock position based on the relative position within a target element. + /// Precedence: Left/Right win over Top/Bottom at corners. + /// + public static DockPosition CalculateDockPosition(double width, double height, double x, double y, double threshold) + { + if (x < width * threshold) return DockPosition.Left; + if (x > width * (1 - threshold)) return DockPosition.Right; + if (y < height * threshold) return DockPosition.Top; + if (y > height * (1 - threshold)) return DockPosition.Bottom; + return DockPosition.Center; + } +} diff --git a/src/Editor/Ghost.Editor/View/Controls/DockLayout.cs b/src/Editor/Ghost.Editor/View/Controls/DockLayout.cs index f821488..94572db 100644 --- a/src/Editor/Ghost.Editor/View/Controls/DockLayout.cs +++ b/src/Editor/Ghost.Editor/View/Controls/DockLayout.cs @@ -25,8 +25,6 @@ public sealed partial class DockLayout : Control private FrameworkElement? _dropTargetOverlay; private readonly HashSet _subscribedNodes = new(); - public enum DockPosition { Center, Top, Bottom, Left, Right, None } - public DockLayout() { DefaultStyleKey = typeof(DockLayout); @@ -34,19 +32,6 @@ public sealed partial class DockLayout : Control Unloaded += OnUnloaded; } - /// - /// Calculates the dock position based on the relative position within a target element. - /// Precedence: Left/Right win over Top/Bottom at corners. - /// - public static DockPosition CalculateDockPosition(double width, double height, double x, double y, double threshold) - { - if (x < width * threshold) return DockPosition.Left; - if (x > width * (1 - threshold)) return DockPosition.Right; - if (y < height * threshold) return DockPosition.Top; - if (y > height * (1 - threshold)) return DockPosition.Bottom; - return DockPosition.Center; - } - private void OnLoaded(object sender, RoutedEventArgs e) { if (Root != null) @@ -327,7 +312,7 @@ public sealed partial class DockLayout : Control e.AcceptedOperation = global::Windows.ApplicationModel.DataTransfer.DataPackageOperation.Move; var position = e.GetPosition(targetElement); - var newPosition = CalculateDockPosition(targetElement.ActualWidth, targetElement.ActualHeight, position.X, position.Y, DROP_EDGE_THRESHOLD); + var newPosition = DockMath.CalculateDockPosition(targetElement.ActualWidth, targetElement.ActualHeight, position.X, position.Y, DROP_EDGE_THRESHOLD); if (newPosition != _currentDropPosition) { diff --git a/src/Test/Ghost.UnitTest/DockLayoutTest.cs b/src/Test/Ghost.UnitTest/DockLayoutTest.cs index 7af1161..ab39bc3 100644 --- a/src/Test/Ghost.UnitTest/DockLayoutTest.cs +++ b/src/Test/Ghost.UnitTest/DockLayoutTest.cs @@ -1,4 +1,4 @@ -using Ghost.Editor.View.Controls; +using Ghost.Editor.Core.Controls.Internal.Docking; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace Ghost.UnitTest; @@ -12,36 +12,36 @@ public class DockLayoutTest public void TestCalculateDockPosition_Center() { // 100x100, threshold 0.25 -> Center is [25, 75] - var pos = DockLayout.CalculateDockPosition(100, 100, 50, 50, THRESHOLD); - Assert.AreEqual(DockLayout.DockPosition.Center, pos); + var pos = DockMath.CalculateDockPosition(100, 100, 50, 50, THRESHOLD); + Assert.AreEqual(DockPosition.Center, pos); } [TestMethod] public void TestCalculateDockPosition_Left() { - var pos = DockLayout.CalculateDockPosition(100, 100, 10, 50, THRESHOLD); - Assert.AreEqual(DockLayout.DockPosition.Left, pos); + var pos = DockMath.CalculateDockPosition(100, 100, 10, 50, THRESHOLD); + Assert.AreEqual(DockPosition.Left, pos); } [TestMethod] public void TestCalculateDockPosition_Right() { - var pos = DockLayout.CalculateDockPosition(100, 100, 90, 50, THRESHOLD); - Assert.AreEqual(DockLayout.DockPosition.Right, pos); + var pos = DockMath.CalculateDockPosition(100, 100, 90, 50, THRESHOLD); + Assert.AreEqual(DockPosition.Right, pos); } [TestMethod] public void TestCalculateDockPosition_Top() { - var pos = DockLayout.CalculateDockPosition(100, 100, 50, 10, THRESHOLD); - Assert.AreEqual(DockLayout.DockPosition.Top, pos); + var pos = DockMath.CalculateDockPosition(100, 100, 50, 10, THRESHOLD); + Assert.AreEqual(DockPosition.Top, pos); } [TestMethod] public void TestCalculateDockPosition_Bottom() { - var pos = DockLayout.CalculateDockPosition(100, 100, 50, 90, THRESHOLD); - Assert.AreEqual(DockLayout.DockPosition.Bottom, pos); + var pos = DockMath.CalculateDockPosition(100, 100, 50, 90, THRESHOLD); + Assert.AreEqual(DockPosition.Bottom, pos); } [TestMethod] @@ -49,14 +49,14 @@ public class DockLayoutTest { // (10, 10) is in both Left and Top zones. // Current implementation: Left/Right win over Top/Bottom. - var pos = DockLayout.CalculateDockPosition(100, 100, 10, 10, THRESHOLD); - Assert.AreEqual(DockLayout.DockPosition.Left, pos); + var pos = DockMath.CalculateDockPosition(100, 100, 10, 10, THRESHOLD); + Assert.AreEqual(DockPosition.Left, pos); } [TestMethod] public void TestCalculateDockPosition_CornerPrecedence_RightBottom() { - var pos = DockLayout.CalculateDockPosition(100, 100, 90, 90, THRESHOLD); - Assert.AreEqual(DockLayout.DockPosition.Right, pos); + var pos = DockMath.CalculateDockPosition(100, 100, 90, 90, THRESHOLD); + Assert.AreEqual(DockPosition.Right, pos); } } diff --git a/src/Test/Ghost.UnitTest/Ghost.UnitTest.csproj b/src/Test/Ghost.UnitTest/Ghost.UnitTest.csproj index 4cce861..0b2d506 100644 --- a/src/Test/Ghost.UnitTest/Ghost.UnitTest.csproj +++ b/src/Test/Ghost.UnitTest/Ghost.UnitTest.csproj @@ -16,7 +16,6 @@ -