Skip to content

Commit

Permalink
Merge pull request #324 from BAndysc/isempty_properfix
Browse files Browse the repository at this point in the history
Corrected the logic for updating IsEmpty
  • Loading branch information
wieslawsoltes authored Mar 11, 2024
2 parents 9cded63 + c7f8d5d commit 8bf68bd
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 50 deletions.
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

0 comments on commit 8bf68bd

Please sign in to comment.