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 @@
-