From 110fc9122eb67b7d7f8f0d931f1e64ab5793d7ce Mon Sep 17 00:00:00 2001 From: and3md Date: Sun, 25 Jun 2017 13:53:23 +0200 Subject: [PATCH] Change the way how some widgets are measured, minimumVisibleContentSize() for widgets which content can be bigger than widget size. --- src/dlangui/widgets/grid.d | 23 +++++++++++++++++++++++ src/dlangui/widgets/lists.d | 15 +++++++++++++++ src/dlangui/widgets/scroll.d | 9 ++++++++- src/dlangui/widgets/tree.d | 4 ++++ 4 files changed, 50 insertions(+), 1 deletion(-) diff --git a/src/dlangui/widgets/grid.d b/src/dlangui/widgets/grid.d index 1d4f9177..27844b0b 100644 --- a/src/dlangui/widgets/grid.d +++ b/src/dlangui/widgets/grid.d @@ -1533,6 +1533,29 @@ class GridWidgetBase : ScrollWidgetBase, GridModelAdapter, MenuItemActionHandler sz.y += _rowHeights[i]; return sz; } + + /// calculate minimum size of widget + override Point minimumVisibleContentSize() { + Point sz; + if (_cols == 0 || _rows == 0) { + sz.x = 100; + sz.y = 100; + return sz; + } + // width: + if (_cols < 2) + sz.x = _colWidths[0]; + else + sz.x = _colWidths[0] + _colWidths[1]; + + // height + if (_rows < 2) + sz.y = _rowHeights[0]; + else + sz.y = _rowHeights[0] + _rowHeights[1]; + + return sz; + } override protected void drawClient(DrawBuf buf) { if (!_cols || !_rows) diff --git a/src/dlangui/widgets/lists.d b/src/dlangui/widgets/lists.d index 29e33249..5d12d08e 100644 --- a/src/dlangui/widgets/lists.d +++ b/src/dlangui/widgets/lists.d @@ -942,6 +942,11 @@ class ListWidget : WidgetGroup, OnScrollHandler, OnAdapterChangeHandler { if (_adapter) _adapter.onThemeChanged(); } + + /// sets minimum size for the list, override to change + Point minimumVisibleContentSize() { + return Point(100, 100); + } /// Measure widget according to desired width and height constraints. (Step 1 of two phase layout). override void measure(int parentWidth, int parentHeight) { @@ -953,6 +958,15 @@ class ListWidget : WidgetGroup, OnScrollHandler, OnAdapterChangeHandler { _itemSizes.length = itemCount; Rect m = margins; Rect p = padding; + + // set widget area to small when first measure + if (parentWidth == SIZE_UNSPECIFIED && parentHeight == SIZE_UNSPECIFIED) + { + Point sz = minimumVisibleContentSize; + measuredContent(parentWidth, parentHeight, sz.x, sz.y); + return; + } + // calc size constraints for children int pwidth = parentWidth; int pheight = parentHeight; @@ -1041,6 +1055,7 @@ class ListWidget : WidgetGroup, OnScrollHandler, OnAdapterChangeHandler { } } measuredContent(parentWidth, parentHeight, sz.x + _sbsz.x, sz.y + _sbsz.y); + if (_scrollbar.visibility == oldScrollbarVisibility) { _needLayout = oldNeedLayout; _scrollbar.cancelLayout(); diff --git a/src/dlangui/widgets/scroll.d b/src/dlangui/widgets/scroll.d index 966b23d5..63d4bc6c 100644 --- a/src/dlangui/widgets/scroll.d +++ b/src/dlangui/widgets/scroll.d @@ -273,6 +273,11 @@ class ScrollWidgetBase : WidgetGroup, OnScrollHandler { return sz; } + // override to set minimum scrollwidget size - default 100x100 + Point minimumVisibleContentSize() { + return Point(100,100); + } + /// Measure widget according to desired width and height constraints. (Step 1 of two phase layout). override void measure(int parentWidth, int parentHeight) { if (visibility == Visibility.Gone) { @@ -280,6 +285,7 @@ class ScrollWidgetBase : WidgetGroup, OnScrollHandler { } Rect m = margins; Rect p = padding; + // calc size constraints for children int pwidth = parentWidth; int pheight = parentHeight; @@ -293,13 +299,14 @@ class ScrollWidgetBase : WidgetGroup, OnScrollHandler { if (_vscrollbar && _vscrollbarMode == ScrollBarMode.Visible) { _vscrollbar.measure(pwidth, pheight); } - Point sz = fullContentSize(); + Point sz = minimumVisibleContentSize(); if (_hscrollbar && _hscrollbarMode == ScrollBarMode.Visible) { sz.y += _hscrollbar.measuredHeight; } if (_vscrollbar && _vscrollbarMode == ScrollBarMode.Visible) { sz.x += _vscrollbar.measuredWidth; } + measuredContent(parentWidth, parentHeight, sz.x, sz.y); } diff --git a/src/dlangui/widgets/tree.d b/src/dlangui/widgets/tree.d index b5425ca6..f0453a19 100644 --- a/src/dlangui/widgets/tree.d +++ b/src/dlangui/widgets/tree.d @@ -813,6 +813,10 @@ class TreeWidgetBase : ScrollWidget, OnTreeContentChangeListener, OnTreeStateCh super.layout(rc); } + override Point minimumVisibleContentSize() { + return Point(200,200); + } + /// Measure widget according to desired width and height constraints. (Step 1 of two phase layout). override void measure(int parentWidth, int parentHeight) { if (visibility == Visibility.Gone) {