Can now insert content above existing groups.

This commit is contained in:
Robin 2016-01-02 08:30:39 +00:00
parent 7e43827bee
commit f96c0b0f21
4 changed files with 245 additions and 24 deletions

View File

@ -101,11 +101,11 @@ namespace DarkUI.Docking
[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public List<DarkDockRegion> Regions
public Dictionary<DarkDockArea, DarkDockRegion> Regions
{
get
{
return _regions.Values.ToList();
return _regions;
}
}
@ -159,6 +159,25 @@ namespace DarkUI.Docking
dockContent.Select();
}
public void InsertContent(DarkDockContent dockContent, DarkDockGroup dockGroup)
{
if (_contents.Contains(dockContent))
RemoveContent(dockContent);
dockContent.DockPanel = this;
_contents.Add(dockContent);
dockContent.DockArea = dockGroup.DockArea;
var region = _regions[dockGroup.DockArea];
region.InsertContent(dockContent, dockGroup);
if (ContentAdded != null)
ContentAdded(this, new DockContentEventArgs(dockContent));
dockContent.Select();
}
public void RemoveContent(DarkDockContent dockContent)
{
if (!_contents.Contains(dockContent))

View File

@ -83,7 +83,22 @@ namespace DarkUI.Docking
dockContent.DockRegion = this;
dockGroup.AddContent(dockContent);
// Show the region if it was previously hidden
if (!Visible)
{
Visible = true;
CreateSplitter();
}
PositionGroups();
}
internal void InsertContent(DarkDockContent dockContent, DarkDockGroup dockGroup)
{
var newGroup = InsertGroup(dockGroup.Order);
dockContent.DockRegion = this;
newGroup.AddContent(dockContent);
if (!Visible)
{
Visible = true;
@ -147,6 +162,21 @@ namespace DarkUI.Docking
return newGroup;
}
private DarkDockGroup InsertGroup(int order)
{
foreach (var group in _groups)
{
if (group.Order <= order)
group.Order++;
}
var newGroup = new DarkDockGroup(DockPanel, this, order);
_groups.Add(newGroup);
Controls.Add(newGroup);
return newGroup;
}
private void RemoveGroup(DarkDockGroup group)
{
var lastOrder = group.Order;

View File

@ -17,8 +17,13 @@ namespace DarkUI.Win32
private DarkTranslucentForm _highlightForm;
private bool _isDragging = false;
private bool _insert = false;
private DarkDockRegion _targetRegion;
private DarkDockGroup _targetGroup;
private Dictionary<DarkDockRegion, Rectangle> _regionDropAreas = new Dictionary<DarkDockRegion, Rectangle>();
private Dictionary<DarkDockGroup, Rectangle> _groupInsertDropAreas = new Dictionary<DarkDockGroup, Rectangle>();
private Dictionary<DarkDockGroup, Rectangle> _groupDropAreas = new Dictionary<DarkDockGroup, Rectangle>();
#endregion
@ -39,7 +44,7 @@ namespace DarkUI.Win32
public bool PreFilterMessage(ref Message m)
{
// Exit out early if we're not dragging any content
if (_dragContent == null)
if (!_isDragging)
return false;
// We only care about mouse events
@ -58,8 +63,21 @@ namespace DarkUI.Win32
// Drop content
if (m.Msg == (int)WM.LBUTTONUP)
{
if (_targetGroup != null)
_dockPanel.AddContent(_dragContent, _targetGroup);
if (_targetRegion != null)
{
_dockPanel.RemoveContent(_dragContent);
_dragContent.DockArea = _targetRegion.DockArea;
_dockPanel.AddContent(_dragContent);
}
else if (_targetGroup != null)
{
_dockPanel.RemoveContent(_dragContent);
if (_insert)
_dockPanel.InsertContent(_dragContent, _targetGroup);
else
_dockPanel.AddContent(_dragContent, _targetGroup);
}
StopDrag();
return false;
@ -74,52 +92,182 @@ namespace DarkUI.Win32
public void StartDrag(DarkDockContent content)
{
_regionDropAreas = new Dictionary<DarkDockRegion, Rectangle>();
_groupInsertDropAreas = new Dictionary<DarkDockGroup, Rectangle>();
_groupDropAreas = new Dictionary<DarkDockGroup, Rectangle>();
foreach (var region in _dockPanel.Regions)
foreach (var region in _dockPanel.Regions.Values)
{
foreach (var group in region.Groups)
if (region.Visible)
{
var rect = new Rectangle
foreach (var group in region.Groups)
{
X = group.PointToScreen(Point.Empty).X,
Y = group.PointToScreen(Point.Empty).Y,
Width = group.Width,
Height = group.Height
};
var rect = new Rectangle
{
X = group.PointToScreen(Point.Empty).X,
Y = group.PointToScreen(Point.Empty).Y,
Width = group.Width,
Height = group.Height
};
_groupDropAreas.Add(group, rect);
var insertRect = new Rectangle();
switch (group.DockArea)
{
case DarkDockArea.Left:
case DarkDockArea.Right:
var top = rect.Top;
if (group.Order > 0)
top -= 7;
insertRect = new Rectangle
{
X = rect.Left,
Y = top,
Width = rect.Width,
Height = 15
};
break;
case DarkDockArea.Bottom:
var left = rect.Left;
if (group.Order > 0)
left -= 7;
insertRect = new Rectangle
{
X = left,
Y = rect.Top,
Width = 15,
Height = rect.Height
};
break;
}
_groupDropAreas.Add(group, rect);
_groupInsertDropAreas.Add(group, insertRect);
}
}
else
{
var rect = new Rectangle();
switch (region.DockArea)
{
case DarkDockArea.Left:
rect = new Rectangle
{
X = _dockPanel.PointToScreen(Point.Empty).X,
Y = _dockPanel.PointToScreen(Point.Empty).Y,
Width = 15,
Height = _dockPanel.Height
};
break;
case DarkDockArea.Right:
rect = new Rectangle
{
X = _dockPanel.PointToScreen(Point.Empty).X + _dockPanel.Width - 15,
Y = _dockPanel.PointToScreen(Point.Empty).Y,
Width = 15,
Height = _dockPanel.Height
};
break;
case DarkDockArea.Bottom:
var x = _dockPanel.PointToScreen(Point.Empty).X;
var width = _dockPanel.Width;
if (_dockPanel.Regions[DarkDockArea.Left].Visible)
{
x += _dockPanel.Regions[DarkDockArea.Left].Width;
width -= _dockPanel.Regions[DarkDockArea.Left].Width;
}
if (_dockPanel.Regions[DarkDockArea.Right].Visible)
{
width -= _dockPanel.Regions[DarkDockArea.Right].Width;
}
rect = new Rectangle
{
X = x,
Y = _dockPanel.PointToScreen(Point.Empty).Y + _dockPanel.Height - 15,
Width = width,
Height = 15
};
break;
}
_regionDropAreas.Add(region, rect);
}
}
_dragContent = content;
_isDragging = true;
}
private void StopDrag()
{
_highlightForm.Hide();
_dragContent = null;
_isDragging = false;
}
private void HandleDrag()
{
var location = Cursor.Position;
_targetRegion = null;
_targetGroup = null;
foreach (var keyValuePair in _groupDropAreas)
foreach (var keyValuePair in _regionDropAreas)
{
var region = keyValuePair.Key;
var rect = keyValuePair.Value;
if (rect.Contains(location))
{
_targetRegion = region;
_highlightForm.Location = new Point(rect.X, rect.Y);
_highlightForm.Size = new Size(rect.Width, rect.Height);
}
}
var inserting = false;
foreach (var keyValuePair in _groupInsertDropAreas)
{
var group = keyValuePair.Key;
var rect = keyValuePair.Value;
if (group == _dragContent.DockGroup)
continue;
if (group.DockRegion == _dragContent.DockGroup.DockRegion)
{
if (group == _dragContent.DockGroup)
continue;
if (group.DockArea == DarkDockArea.Document)
continue;
if (_dragContent.DockGroup.Order == group.Order - 1)
continue;
}
if (rect.Contains(location))
{
inserting = true;
_insert = true;
_targetGroup = group;
_highlightForm.Location = new Point(rect.X, rect.Y);
@ -127,12 +275,34 @@ namespace DarkUI.Win32
}
}
if (_targetGroup == null)
if (!inserting)
{
foreach (var keyValuePair in _groupDropAreas)
{
var group = keyValuePair.Key;
var rect = keyValuePair.Value;
if (group == _dragContent.DockGroup)
continue;
if (group.DockArea == DarkDockArea.Document)
continue;
if (rect.Contains(location))
{
_insert = false;
_targetGroup = group;
_highlightForm.Location = new Point(rect.X, rect.Y);
_highlightForm.Size = new Size(rect.Width, rect.Height);
}
}
}
if (_targetRegion == null && _targetGroup == null)
{
if (_highlightForm.Visible)
{
_highlightForm.Hide();
}
}
else
{

View File

@ -1,4 +1,5 @@
DarkUI
-- moving nodes within a treeview doesn't re-build the next/prev references
-- Add textbox control
-- Add dropdown control
-- Allow dropdown to show arbitrary control types
@ -24,4 +25,5 @@ Dock panel
-- right click tab menu. close all, close all but this etc. etc.
-- stop dragging tabs instantly going to the end of the row
-- stop differently sized toolwindow tabs from vibrating when dragging
-- fix regions being visible with no groups on load
-- remove 1 pixel left padding from bottom region
-- add 1 pixel border between groups in bottom region