From d1a47bd40129a2d6f6b745d46fa15d347445a7b2 Mon Sep 17 00:00:00 2001 From: Vadim Lopatin Date: Wed, 26 Mar 2014 16:48:17 +0400 Subject: [PATCH] lists --- examples/example1/main.d | 12 +++++++++ src/dlangui/all.d | 1 + src/dlangui/widgets/controls.d | 27 +++++++++++++++++++ src/dlangui/widgets/lists.d | 47 ++++++++++++++++++++++++++++++++++ 4 files changed, 87 insertions(+) diff --git a/examples/example1/main.d b/examples/example1/main.d index d370092c..1ab079e2 100644 --- a/examples/example1/main.d +++ b/examples/example1/main.d @@ -89,6 +89,18 @@ extern (C) int UIAppMain(string[] args) { layout.childById("BTN2").onClickListener(delegate (Widget w) { Log.d("onClick ", w.id); return true; }); layout.childById("BTN3").onClickListener(delegate (Widget w) { Log.d("onClick ", w.id); return true; }); + ListWidget list = new ListWidget("mylist", Orientation.Horizontal); + WidgetListAdapter listAdapter = new WidgetListAdapter(); + listAdapter.widgets.add((new TextWidget()).text("List item 1")); + listAdapter.widgets.add((new TextWidget()).text("List item 2")); + listAdapter.widgets.add((new TextWidget()).text("List item 3")); + listAdapter.widgets.add((new TextWidget()).text("List item 4")); + listAdapter.widgets.add((new TextWidget()).text("List item 5")); + listAdapter.widgets.add((new TextWidget()).text("List item 6")); + list.ownAdapter = listAdapter; + list.layoutWidth(FILL_PARENT); + layout.addChild(list); + layout.layoutHeight(FILL_PARENT).layoutWidth(FILL_PARENT); window.mainWidget = layout; diff --git a/src/dlangui/all.d b/src/dlangui/all.d index 78d5ebff..d401f6ea 100644 --- a/src/dlangui/all.d +++ b/src/dlangui/all.d @@ -7,4 +7,5 @@ public import dlangui.graphics.images; public import dlangui.widgets.widget; public import dlangui.widgets.controls; public import dlangui.widgets.layouts; +public import dlangui.widgets.lists; public import dlangui.graphics.fonts; diff --git a/src/dlangui/widgets/controls.d b/src/dlangui/widgets/controls.d index a49623ca..16f6785e 100644 --- a/src/dlangui/widgets/controls.d +++ b/src/dlangui/widgets/controls.d @@ -167,6 +167,33 @@ class ScrollBar : WidgetGroup, OnClickHandler { protected int _pageSize = 30; protected int _position = 20; + @property int position() { return _position; } + @property ScrollBar position(int newPosition) { + if (_position != newPosition) { + _position = newPosition; + requestLayout(); + } + return this; + } + @property int minValue() { return _minValue; } + @property int maxValue() { return _maxValue; } + @property int pageSize() { return _pageSize; } + @property ScrollBar pageSize(int size) { + if (_pageSize != size) { + _pageSize = size; + requestLayout(); + } + return this; + } + ScrollBar setRange(int min, int max) { + if (_minValue != min || _maxValue != max) { + _minValue = min; + _maxValue = max; + requestLayout(); + } + return this; + } + class PageScrollButton : Widget { this(string ID) { super(ID); diff --git a/src/dlangui/widgets/lists.d b/src/dlangui/widgets/lists.d index a154375a..ed03f29b 100644 --- a/src/dlangui/widgets/lists.d +++ b/src/dlangui/widgets/lists.d @@ -11,6 +11,21 @@ interface ListAdapter { Widget itemWidget(int index); } +/// List adapter for simple list of widget instances +class WidgetListAdapter : ListAdapter { + WidgetList _widgets; + /// list of widgets to display + @property ref WidgetList widgets() { return _widgets; } + /// returns number of widgets in list + @property override int itemCount() { + return _widgets.count; + } + /// return list item widget by item index + override Widget itemWidget(int index) { + return _widgets.get(index); + } +} + class ListWidget : WidgetGroup { protected Orientation _orientation = Orientation.Vertical; /// returns linear layout orientation (Vertical, Horizontal) @@ -32,11 +47,26 @@ class ListWidget : WidgetGroup { protected int _lastMeasureHeight; protected ListAdapter _adapter; + /// when true, need to destroy adapter on list destroy + protected bool _ownAdapter; + /// get adapter @property ListAdapter adapter() { return _adapter; } /// set adapter @property ListWidget adapter(ListAdapter adapter) { + if (_adapter !is null && _ownAdapter) + destroy(_adapter); _adapter = adapter; + _ownAdapter = false; + onAdapterChanged(); + return this; + } + /// set adapter + @property ListWidget ownAdapter(ListAdapter adapter) { + if (_adapter !is null && _ownAdapter) + destroy(_adapter); + _adapter = adapter; + _ownAdapter = true; onAdapterChanged(); return this; } @@ -67,6 +97,12 @@ class ListWidget : WidgetGroup { addChild(_scrollbar); } + ~this() { + if (_adapter !is null && _ownAdapter) + destroy(_adapter); + _adapter = null; + } + /// 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) { @@ -222,6 +258,17 @@ class ListWidget : WidgetGroup { p += w; } } + if (_needScrollbar) { + if (_orientation == Orientation.Vertical) { + _scrollbar.setRange(0, p); + _scrollbar.pageSize = rc.height; + _scrollbar.position = 0; + } else { + _scrollbar.setRange(0, p); + _scrollbar.pageSize = rc.width; + _scrollbar.position = 0; + } + } _needLayout = false; }