diff --git a/src/Dock.Model/DockService.cs b/src/Dock.Model/DockService.cs index 4df7625b1..25f1a89d8 100644 --- a/src/Dock.Model/DockService.cs +++ b/src/Dock.Model/DockService.cs @@ -17,6 +17,13 @@ private static void CopyDockGroup(IDockable source, IDockable target) } } + private static void CopyToolDockSettings(IToolDock source, IToolDock target) + { + target.IsExpanded = source.IsExpanded; + target.AutoHide = source.AutoHide; + target.GripMode = source.GripMode; + } + private static bool IsValidMove(IDockable sourceDockable, IDock sourceDockableOwner, IDock targetDock, IDockable targetDockable) { if (targetDockable is IDock) @@ -158,6 +165,14 @@ private void SplitToolDockable(IDockable sourceDockable, IDock sourceDockableOwn targetToolDock.Title = nameof(IToolDock); targetToolDock.Alignment = operation.ToAlignment(); targetToolDock.VisibleDockables = factory.CreateList(); + if (targetDock is IToolDock targetToolDockSource) + { + CopyToolDockSettings(targetToolDockSource, targetToolDock); + } + else if (sourceDockableOwner is IToolDock sourceToolDock) + { + CopyToolDockSettings(sourceToolDock, targetToolDock); + } CopyDockGroup(sourceDockable, targetToolDock); // Local split into a new (empty) dock: allow per Empty Dock Rule diff --git a/tests/Dock.Model.UnitTests/ToolDockGripModeInheritanceTests.cs b/tests/Dock.Model.UnitTests/ToolDockGripModeInheritanceTests.cs new file mode 100644 index 000000000..478fd5e90 --- /dev/null +++ b/tests/Dock.Model.UnitTests/ToolDockGripModeInheritanceTests.cs @@ -0,0 +1,44 @@ +using Dock.Model; +using Dock.Model.Avalonia; +using Dock.Model.Avalonia.Controls; +using Dock.Model.Controls; +using Dock.Model.Core; +using Xunit; + +namespace Dock.Model.UnitTests; + +public class ToolDockGripModeInheritanceTests +{ + [Fact] + public void SplitToolDockable_Inherits_GripMode_From_TargetDock() + { + var factory = new Factory(); + var root = factory.CreateRootDock(); + root.VisibleDockables = factory.CreateList(); + + var toolDock = new ToolDock + { + GripMode = GripMode.AutoHide, + VisibleDockables = factory.CreateList() + }; + + var tool1 = new Tool { Id = "Tool1", Title = "Tool1" }; + var tool2 = new Tool { Id = "Tool2", Title = "Tool2" }; + + toolDock.VisibleDockables.Add(tool1); + toolDock.VisibleDockables.Add(tool2); + toolDock.ActiveDockable = tool1; + root.VisibleDockables.Add(toolDock); + + factory.InitLayout(root); + + var manager = new DockManager(new DockService()); + var executed = manager.ValidateTool(tool2, toolDock, DragAction.Move, DockOperation.Right, bExecute: true); + + Assert.True(executed); + var newDock = tool2.Owner as IToolDock; + Assert.NotNull(newDock); + Assert.NotSame(toolDock, newDock); + Assert.Equal(GripMode.AutoHide, newDock!.GripMode); + } +}