mirror of
https://github.com/colhountech/DarkUI.Net5.git
synced 2024-10-16 23:06:49 +03:00
Can now insert content above existing groups.
This commit is contained in:
parent
7e43827bee
commit
f96c0b0f21
@ -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))
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
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,9 +92,13 @@ 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)
|
||||
{
|
||||
if (region.Visible)
|
||||
{
|
||||
foreach (var group in region.Groups)
|
||||
{
|
||||
@ -88,25 +110,173 @@ namespace DarkUI.Win32
|
||||
Height = group.Height
|
||||
};
|
||||
|
||||
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 _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.DockRegion == _dragContent.DockGroup.DockRegion)
|
||||
{
|
||||
if (group == _dragContent.DockGroup)
|
||||
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);
|
||||
_highlightForm.Size = new Size(rect.Width, rect.Height);
|
||||
}
|
||||
}
|
||||
|
||||
if (!inserting)
|
||||
{
|
||||
foreach (var keyValuePair in _groupDropAreas)
|
||||
{
|
||||
var group = keyValuePair.Key;
|
||||
@ -120,20 +290,20 @@ namespace DarkUI.Win32
|
||||
|
||||
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 (_targetGroup == null)
|
||||
if (_targetRegion == null && _targetGroup == null)
|
||||
{
|
||||
if (_highlightForm.Visible)
|
||||
{
|
||||
_highlightForm.Hide();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!_highlightForm.Visible)
|
||||
|
4
todo.txt
4
todo.txt
@ -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
|
Loading…
Reference in New Issue
Block a user