Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Corrected the logic for updating IsEmpty #324

Merged
merged 1 commit into from
Mar 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
107 changes: 80 additions & 27 deletions src/Dock.Model/FactoryBase.Dockable.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Dock.Model.Controls;
using System.Linq;
using Dock.Model.Controls;
using Dock.Model.Core;

namespace Dock.Model;
Expand All @@ -13,8 +14,7 @@ public virtual void AddDockable(IDock dock, IDockable dockable)
{
InitDockable(dockable, dock);
dock.VisibleDockables ??= CreateList<IDockable>();
dock.VisibleDockables.Add(dockable);
dock.IsEmpty = dock.VisibleDockables.Count == 0;
AddVisibleDockable(dock, dockable);
OnDockableAdded(dockable);
}

Expand All @@ -25,8 +25,7 @@ public virtual void InsertDockable(IDock dock, IDockable dockable, int index)
{
InitDockable(dockable, dock);
dock.VisibleDockables ??= CreateList<IDockable>();
dock.VisibleDockables.Insert(index, dockable);
dock.IsEmpty = dock.VisibleDockables.Count == 0;
InsertVisibleDockable(dock, index, dockable);
OnDockableAdded(dockable);
}
}
Expand All @@ -45,8 +44,7 @@ public virtual void RemoveDockable(IDockable dockable, bool collapse)
return;
}

dock.VisibleDockables.Remove(dockable);
dock.IsEmpty = dock.VisibleDockables.Count == 0;
RemoveVisibleDockable(dock, dockable);
OnDockableRemoved(dockable);

var indexActiveDockable = index > 0 ? index - 1 : 0;
Expand Down Expand Up @@ -102,11 +100,9 @@ public virtual void MoveDockable(IDock dock, IDockable sourceDockable, IDockable

if (sourceIndex >= 0 && targetIndex >= 0 && sourceIndex != targetIndex)
{
dock.VisibleDockables.RemoveAt(sourceIndex);
dock.IsEmpty = dock.VisibleDockables.Count == 0;
RemoveVisibleDockableAt(dock, sourceIndex);
OnDockableRemoved(sourceDockable);
dock.VisibleDockables.Insert(targetIndex, sourceDockable);
dock.IsEmpty = dock.VisibleDockables.Count == 0;
InsertVisibleDockable(dock, targetIndex, sourceDockable);
OnDockableAdded(sourceDockable);
OnDockableMoved(sourceDockable);
dock.ActiveDockable = sourceDockable;
Expand Down Expand Up @@ -177,11 +173,9 @@ public virtual void MoveDockable(IDock sourceDock, IDock targetDock, IDockable s
var sourceIndex = sourceDock.VisibleDockables.IndexOf(sourceDockable);
if (sourceIndex < targetIndex)
{
targetDock.VisibleDockables.Insert(targetIndex + 1, sourceDockable);
targetDock.IsEmpty = targetDock.VisibleDockables.Count == 0;
InsertVisibleDockable(targetDock, targetIndex + 1, sourceDockable);
OnDockableAdded(sourceDockable);
targetDock.VisibleDockables.RemoveAt(sourceIndex);
targetDock.IsEmpty = targetDock.VisibleDockables.Count == 0;
RemoveVisibleDockableAt(targetDock, sourceIndex);
OnDockableRemoved(sourceDockable);
OnDockableMoved(sourceDockable);
}
Expand All @@ -190,11 +184,9 @@ public virtual void MoveDockable(IDock sourceDock, IDock targetDock, IDockable s
var removeIndex = sourceIndex + 1;
if (targetDock.VisibleDockables.Count + 1 > removeIndex)
{
targetDock.VisibleDockables.Insert(targetIndex, sourceDockable);
targetDock.IsEmpty = targetDock.VisibleDockables.Count == 0;
InsertVisibleDockable(targetDock, targetIndex, sourceDockable);
OnDockableAdded(sourceDockable);
targetDock.VisibleDockables.RemoveAt(removeIndex);
targetDock.IsEmpty = targetDock.VisibleDockables.Count == 0;
RemoveVisibleDockableAt(targetDock, removeIndex);
OnDockableRemoved(sourceDockable);
OnDockableMoved(sourceDockable);
}
Expand All @@ -203,8 +195,7 @@ public virtual void MoveDockable(IDock sourceDock, IDock targetDock, IDockable s
else
{
RemoveDockable(sourceDockable, true);
targetDock.VisibleDockables.Insert(targetIndex, sourceDockable);
targetDock.IsEmpty = targetDock.VisibleDockables.Count == 0;
InsertVisibleDockable(targetDock, targetIndex, sourceDockable);
OnDockableAdded(sourceDockable);
OnDockableMoved(sourceDockable);
InitDockable(sourceDockable, targetDock);
Expand All @@ -230,11 +221,9 @@ public virtual void SwapDockable(IDock dock, IDockable sourceDockable, IDockable
var originalTargetDockable = dock.VisibleDockables[targetIndex];

dock.VisibleDockables[targetIndex] = originalSourceDockable;
dock.IsEmpty = dock.VisibleDockables.Count == 0;
OnDockableRemoved(originalTargetDockable);
OnDockableAdded(originalSourceDockable);
dock.VisibleDockables[sourceIndex] = originalTargetDockable;
dock.IsEmpty = dock.VisibleDockables.Count == 0;
OnDockableAdded(originalTargetDockable);
OnDockableSwapped(originalSourceDockable);
OnDockableSwapped(originalTargetDockable);
Expand Down Expand Up @@ -363,8 +352,7 @@ public virtual void PinDockable(IDockable dockable)

if (toolDock.VisibleDockables is not null)
{
toolDock.VisibleDockables.Remove(dockable);
toolDock.IsEmpty = toolDock.VisibleDockables.Count == 0;
RemoveVisibleDockable(toolDock, dockable);
OnDockableRemoved(dockable);
}

Expand Down Expand Up @@ -468,8 +456,7 @@ public virtual void PinDockable(IDockable dockable)
}
}

toolDock.VisibleDockables.Add(dockable);
toolDock.IsEmpty = toolDock.VisibleDockables.Count == 0;
AddVisibleDockable(toolDock, dockable);
OnDockableAdded(dockable);

// TODO: Handle ActiveDockable state.
Expand Down Expand Up @@ -610,4 +597,70 @@ public virtual void CloseRightDockables(IDockable dockable)

CloseDockablesRange(dock, indexOf + 1, dock.VisibleDockables.Count - 1);
}

/// <summary>
/// Adds the dockable to the visible dockables list of the dock.
/// </summary>
protected void AddVisibleDockable(IDock dock, IDockable dockable)
{
if (dock.VisibleDockables == null)
{
dock.VisibleDockables = CreateList<IDockable>();
}
dock.VisibleDockables.Add(dockable);
UpdateIsEmpty(dock);
}

/// <summary>
/// Inserts the dockable to the visible dockables list of the dock at the specified index.
/// </summary>
protected void InsertVisibleDockable(IDock dock, int index, IDockable dockable)
{
if (dock.VisibleDockables == null)
{
dock.VisibleDockables = CreateList<IDockable>();
}
dock.VisibleDockables.Insert(index, dockable);
UpdateIsEmpty(dock);
}

/// <summary>
/// Removes the dockable from the visible dockables list of the dock.
/// </summary>
protected void RemoveVisibleDockable(IDock dock, IDockable dockable)
{
if (dock.VisibleDockables != null)
{
dock.VisibleDockables.Remove(dockable);
UpdateIsEmpty(dock);
}
}

/// <summary>
/// Removes the dockable at the specified index from the visible dockables list of the dock.
/// </summary>
protected void RemoveVisibleDockableAt(IDock dock, int index)
{
if (dock.VisibleDockables != null)
{
dock.VisibleDockables.RemoveAt(index);
UpdateIsEmpty(dock);
}
}

private void UpdateIsEmpty(IDock dock)
{
bool oldIsEmpty = dock.IsEmpty;

var newIsEmpty = dock.VisibleDockables == null
|| dock.VisibleDockables?.Count == 0
|| dock.VisibleDockables!.All(x => x is IDock { IsEmpty: true } or IProportionalDockSplitter);

if (oldIsEmpty != newIsEmpty)
{
dock.IsEmpty = newIsEmpty;
if (dock.Owner is IDock parent)
UpdateIsEmpty(parent);
}
}
}
2 changes: 1 addition & 1 deletion src/Dock.Model/FactoryBase.Init.cs
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ public virtual void InitDockable(IDockable dockable, IDockable? owner)
InitDockable(child, dockable);
}

dock.IsEmpty = dock.VisibleDockables.Count == 0;
UpdateIsEmpty(dock);
}
}

Expand Down
33 changes: 11 additions & 22 deletions src/Dock.Model/FactoryBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -125,8 +125,7 @@ public virtual IDock CreateSplitLayout(IDock dock, IDockable dockable, DockOpera
split.VisibleDockables = CreateList<IDockable>();
if (split.VisibleDockables is not null)
{
split.VisibleDockables.Add(dockable);
split.IsEmpty = split.VisibleDockables.Count == 0;
AddVisibleDockable(split, dockable);
OnDockableAdded(dockable);
split.ActiveDockable = dockable;
}
Expand Down Expand Up @@ -166,8 +165,7 @@ public virtual IDock CreateSplitLayout(IDock dock, IDockable dockable, DockOpera
{
if (layout.VisibleDockables is not null)
{
layout.VisibleDockables.Add(split);
layout.IsEmpty = layout.VisibleDockables.Count == 0;
AddVisibleDockable(layout, split);
OnDockableAdded(split);
layout.ActiveDockable = split;
}
Expand All @@ -179,8 +177,7 @@ public virtual IDock CreateSplitLayout(IDock dock, IDockable dockable, DockOpera
{
if (layout.VisibleDockables is not null)
{
layout.VisibleDockables.Add(dock);
layout.IsEmpty = layout.VisibleDockables.Count == 0;
AddVisibleDockable(layout, dock);
OnDockableAdded(dock);
layout.ActiveDockable = dock;
}
Expand All @@ -189,8 +186,7 @@ public virtual IDock CreateSplitLayout(IDock dock, IDockable dockable, DockOpera
}
}

layout.VisibleDockables?.Add(splitter);
layout.IsEmpty = layout.VisibleDockables?.Count == 0;
AddVisibleDockable(layout, splitter);
OnDockableAdded(splitter);

switch (operation)
Expand All @@ -200,8 +196,7 @@ public virtual IDock CreateSplitLayout(IDock dock, IDockable dockable, DockOpera
{
if (layout.VisibleDockables is not null)
{
layout.VisibleDockables.Add(dock);
layout.IsEmpty = layout.VisibleDockables.Count == 0;
AddVisibleDockable(layout, dock);
OnDockableAdded(dock);
layout.ActiveDockable = dock;
}
Expand All @@ -213,8 +208,7 @@ public virtual IDock CreateSplitLayout(IDock dock, IDockable dockable, DockOpera
{
if (layout.VisibleDockables is not null)
{
layout.VisibleDockables.Add(split);
layout.IsEmpty = layout.VisibleDockables.Count == 0;
AddVisibleDockable(layout, split);
OnDockableAdded(split);
layout.ActiveDockable = split;
}
Expand Down Expand Up @@ -242,11 +236,9 @@ public virtual void SplitToDock(IDock dock, IDockable dockable, DockOperation op
if (index >= 0)
{
var layout = CreateSplitLayout(dock, dockable, operation);
ownerDock.VisibleDockables.RemoveAt(index);
ownerDock.IsEmpty = ownerDock.VisibleDockables.Count == 0;
RemoveVisibleDockableAt(ownerDock, index);
OnDockableRemoved(dockable);
ownerDock.VisibleDockables.Insert(index, layout);
layout.IsEmpty = layout.VisibleDockables?.Count == 0;
InsertVisibleDockable(ownerDock, index, layout);
OnDockableAdded(dockable);
InitDockable(layout, ownerDock);
ownerDock.ActiveDockable = layout;
Expand Down Expand Up @@ -276,8 +268,7 @@ public virtual void SplitToDock(IDock dock, IDockable dockable, DockOperation op
dock.VisibleDockables = CreateList<IDockable>();
if (dock.VisibleDockables is not null)
{
dock.VisibleDockables.Add(dockable);
dock.IsEmpty = dock.VisibleDockables.Count == 0;
AddVisibleDockable(dock, dockable);
OnDockableAdded(dockable);
dock.ActiveDockable = dockable;
}
Expand Down Expand Up @@ -309,8 +300,7 @@ public virtual void SplitToDock(IDock dock, IDockable dockable, DockOperation op
}
if (dock.VisibleDockables is not null)
{
dock.VisibleDockables.Add(dockable);
dock.IsEmpty = dock.VisibleDockables.Count == 0;
AddVisibleDockable(dock, dockable);
OnDockableAdded(dockable);
dock.ActiveDockable = dockable;
}
Expand Down Expand Up @@ -359,8 +349,7 @@ public virtual void SplitToDock(IDock dock, IDockable dockable, DockOperation op
root.VisibleDockables = CreateList<IDockable>();
if (root.VisibleDockables is not null && target is not null)
{
root.VisibleDockables.Add(target);
root.IsEmpty = root.VisibleDockables.Count == 0;
AddVisibleDockable(root, target);
OnDockableAdded(target);
root.ActiveDockable = target;
root.DefaultDockable = target;
Expand Down
Loading