mirror of
https://github.com/colhountech/DarkUI.Net5.git
synced 2025-07-03 15:49:26 +03:00
Moved classes out of subfolders. Moved enums to be within the same file as their main class. Added new DarkControl superclass.
169 lines
5.0 KiB
C#
169 lines
5.0 KiB
C#
using DarkUI.Forms;
|
|
using System;
|
|
using System.Drawing;
|
|
using System.Windows.Forms;
|
|
|
|
namespace DarkUI.Docking
|
|
{
|
|
public enum DarkSplitterType
|
|
{
|
|
Left,
|
|
Right,
|
|
Top,
|
|
Bottom
|
|
}
|
|
|
|
public class DarkDockSplitter
|
|
{
|
|
#region Field Region
|
|
|
|
private Control _parentControl;
|
|
private Control _control;
|
|
|
|
private DarkSplitterType _splitterType;
|
|
|
|
private int _minimum;
|
|
private int _maximum;
|
|
private DarkTranslucentForm _overlayForm;
|
|
|
|
#endregion
|
|
|
|
#region Property Region
|
|
|
|
public Rectangle Bounds { get; set; }
|
|
|
|
public Cursor ResizeCursor { get; private set; }
|
|
|
|
#endregion
|
|
|
|
#region Constructor Region
|
|
|
|
public DarkDockSplitter(Control parentControl, Control control, DarkSplitterType splitterType)
|
|
{
|
|
_parentControl = parentControl;
|
|
_control = control;
|
|
_splitterType = splitterType;
|
|
|
|
switch (_splitterType)
|
|
{
|
|
case DarkSplitterType.Left:
|
|
case DarkSplitterType.Right:
|
|
ResizeCursor = Cursors.SizeWE;
|
|
break;
|
|
case DarkSplitterType.Top:
|
|
case DarkSplitterType.Bottom:
|
|
ResizeCursor = Cursors.SizeNS;
|
|
break;
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Method Region
|
|
|
|
public void ShowOverlay()
|
|
{
|
|
_overlayForm = new DarkTranslucentForm(Color.Black);
|
|
_overlayForm.Visible = true;
|
|
|
|
UpdateOverlay(new Point(0, 0));
|
|
}
|
|
|
|
public void HideOverlay()
|
|
{
|
|
_overlayForm.Visible = false;
|
|
}
|
|
|
|
public void UpdateOverlay(Point difference)
|
|
{
|
|
var bounds = new Rectangle(Bounds.Location, Bounds.Size);
|
|
|
|
switch (_splitterType)
|
|
{
|
|
case DarkSplitterType.Left:
|
|
var leftX = Math.Max(bounds.Location.X - difference.X, _minimum);
|
|
|
|
if (_maximum != 0 && leftX > _maximum)
|
|
leftX = _maximum;
|
|
|
|
bounds.Location = new Point(leftX, bounds.Location.Y);
|
|
break;
|
|
case DarkSplitterType.Right:
|
|
var rightX = Math.Max(bounds.Location.X - difference.X, _minimum);
|
|
|
|
if (_maximum != 0 && rightX > _maximum)
|
|
rightX = _maximum;
|
|
|
|
bounds.Location = new Point(rightX, bounds.Location.Y);
|
|
break;
|
|
case DarkSplitterType.Top:
|
|
var topY = Math.Max(bounds.Location.Y - difference.Y, _minimum);
|
|
|
|
if (_maximum != 0 && topY > _maximum)
|
|
topY = _maximum;
|
|
|
|
bounds.Location = new Point(bounds.Location.X, topY);
|
|
break;
|
|
case DarkSplitterType.Bottom:
|
|
var bottomY = Math.Max(bounds.Location.Y - difference.Y, _minimum);
|
|
|
|
if (_maximum != 0 && bottomY > _maximum)
|
|
topY = _maximum;
|
|
|
|
bounds.Location = new Point(bounds.Location.X, bottomY);
|
|
break;
|
|
}
|
|
|
|
_overlayForm.Bounds = bounds;
|
|
}
|
|
|
|
public void Move(Point difference)
|
|
{
|
|
switch (_splitterType)
|
|
{
|
|
case DarkSplitterType.Left:
|
|
_control.Width += difference.X;
|
|
break;
|
|
case DarkSplitterType.Right:
|
|
_control.Width -= difference.X;
|
|
break;
|
|
case DarkSplitterType.Top:
|
|
_control.Height += difference.Y;
|
|
break;
|
|
case DarkSplitterType.Bottom:
|
|
_control.Height -= difference.Y;
|
|
break;
|
|
}
|
|
|
|
UpdateBounds();
|
|
}
|
|
|
|
public void UpdateBounds()
|
|
{
|
|
var bounds = _parentControl.RectangleToScreen(_control.Bounds);
|
|
|
|
switch (_splitterType)
|
|
{
|
|
case DarkSplitterType.Left:
|
|
Bounds = new Rectangle(bounds.Left - 2, bounds.Top, 5, bounds.Height);
|
|
_maximum = bounds.Right - 2 - _control.MinimumSize.Width;
|
|
break;
|
|
case DarkSplitterType.Right:
|
|
Bounds = new Rectangle(bounds.Right - 2, bounds.Top, 5, bounds.Height);
|
|
_minimum = bounds.Left - 2 + _control.MinimumSize.Width;
|
|
break;
|
|
case DarkSplitterType.Top:
|
|
Bounds = new Rectangle(bounds.Left, bounds.Top - 2, bounds.Width, 5);
|
|
_maximum = bounds.Bottom - 2 - _control.MinimumSize.Height;
|
|
break;
|
|
case DarkSplitterType.Bottom:
|
|
Bounds = new Rectangle(bounds.Left, bounds.Bottom - 2, bounds.Width, 5);
|
|
_minimum = bounds.Top - 2 + _control.MinimumSize.Height;
|
|
break;
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
}
|