diff --git a/src/dlangui/widgets/docks.d b/src/dlangui/widgets/docks.d index c7ced5c5..b37bbaca 100644 --- a/src/dlangui/widgets/docks.d +++ b/src/dlangui/widgets/docks.d @@ -31,6 +31,10 @@ class DockHost : WidgetGroupDefaultDrawing { protected int _bottomSpace; protected int _rightSpace; protected int _leftSpace; + protected ResizerWidget _topResizer; + protected ResizerWidget _bottomResizer; + protected ResizerWidget _leftResizer; + protected ResizerWidget _rightResizer; protected Widget _bodyWidget; @property Widget bodyWidget() { return _bodyWidget; } @property void bodyWidget(Widget widget) { @@ -40,13 +44,32 @@ class DockHost : WidgetGroupDefaultDrawing { _bodyWidget.parent = this; } - void addDockedWindow(DockWindow dockWin) { + void addDockedWindow(DockWindow dockWin, int delta) { addChild(dockWin); } + void onResize(ResizerWidget source) { + } + this() { super("DOCK_HOST"); styleId = STYLE_DOCK_HOST; + _topResizer = new ResizerWidget("top_resizer", Orientation.Vertical); + _topResizer.visibility = Visibility.Gone; + _topResizer.resizeListener = &onResize; + _leftResizer = new ResizerWidget("left_resizer", Orientation.Horizontal); + _leftResizer.visibility = Visibility.Gone; + _leftResizer.resizeListener = &onResize; + _rightResizer = new ResizerWidget("right_resizer", Orientation.Horizontal); + _rightResizer.visibility = Visibility.Gone; + _rightResizer.resizeListener = &onResize; + _bottomResizer = new ResizerWidget("bottom_resizer", Orientation.Vertical); + _bottomResizer.visibility = Visibility.Gone; + _bottomResizer.resizeListener = &onResize; + addChild(_topResizer); + addChild(_leftResizer); + addChild(_rightResizer); + addChild(_bottomResizer); } protected DockWindow[] getDockedWindowList(DockAlignment alignType) { @@ -102,6 +125,31 @@ class DockHost : WidgetGroupDefaultDrawing { _bottomSpace = bottom.length ? rc.height / 4 : 0; _rightSpace = right.length ? rc.width / 4 : 0; _leftSpace = left.length ? rc.width / 4 : 0; + int resizerWidth = 6; + if (_topSpace) { + _topResizer.visibility = Visibility.Visible; + _topResizer.layout(Rect(rc.left + _leftSpace, rc.top + _topSpace - resizerWidth, rc.right - _rightSpace, rc.top + _topSpace)); + } else { + _topResizer.visibility = Visibility.Gone; + } + if (_bottomSpace) { + _bottomResizer.visibility = Visibility.Visible; + _bottomResizer.layout(Rect(rc.left + _leftSpace, rc.bottom - _bottomSpace, rc.right - _rightSpace, rc.bottom - _bottomSpace + resizerWidth)); + } else { + _bottomResizer.visibility = Visibility.Gone; + } + if (_leftSpace) { + _leftResizer.visibility = Visibility.Visible; + _leftResizer.layout(Rect(rc.left + _leftSpace - resizerWidth, rc.top, rc.left + _leftSpace, rc.bottom)); + } else { + _leftResizer.visibility = Visibility.Gone; + } + if (_rightSpace) { + _rightResizer.visibility = Visibility.Visible; + _rightResizer.layout(Rect(rc.right - _rightSpace, rc.top, rc.right - _rightSpace + resizerWidth, rc.bottom)); + } else { + _rightResizer.visibility = Visibility.Gone; + } if (_bodyWidget) _bodyWidget.layout(Rect(rc.left + _leftSpace, rc.top + _topSpace, rc.right - _rightSpace, rc.bottom - _bottomSpace)); layoutDocked(top, Rect(rc.left + _leftSpace, rc.top, rc.right - _rightSpace, rc.top + _topSpace), Orientation.Horizontal); diff --git a/src/dlangui/widgets/layouts.d b/src/dlangui/widgets/layouts.d index 72e84405..37f928a1 100644 --- a/src/dlangui/widgets/layouts.d +++ b/src/dlangui/widgets/layouts.d @@ -10,7 +10,7 @@ VerticalLayout - just LinearLayout with orientation=Orientation.Vertical HorizontalLayout - just LinearLayout with orientation=Orientation.Vertical FrameLayout - children occupy the same place, usually one one is visible at a time TableLayout - children aligned into rows and columns - +ResizerWidget - widget to resize sibling widgets Synopsis: @@ -271,6 +271,10 @@ class LayoutItems { } } +interface ResizeHandler { + void onResize(ResizerWidget source, int delta); +} + /** * Resizer control. * Put it between other items in LinearLayout to allow resizing its siblings. @@ -282,16 +286,20 @@ class ResizerWidget : Widget { protected Widget _nextWidget; protected string _styleVertical; protected string _styleHorizontal; + Signal!ResizeHandler resizeListener; + /// Orientation: Vertical to resize vertically, Horizontal - to resize horizontally + @property Orientation orientation() { return _orientation; } /// empty parameter list constructor - for usage by factory this() { this(null); } /// create with ID parameter - this(string ID) { + this(string ID, Orientation orient = Orientation.Vertical) { super(ID); _styleVertical = "RESIZER_VERTICAL"; _styleHorizontal = "RESIZER_HORIZONTAL"; + _orientation = orient; trackHover = true; }