From cbf9b64b0c11697d724e53453fc8fb5be7a58036 Mon Sep 17 00:00:00 2001 From: Vadim Lopatin Date: Wed, 4 Mar 2015 13:28:08 +0300 Subject: [PATCH] settings editor - edit number; editors - change listener --- src/dlangui/core/settings.d | 83 ++++++++++++++-------------- src/dlangui/dialogs/settingsdialog.d | 50 ++++++++++++++++- src/dlangui/widgets/editors.d | 9 +++ views/res/theme_default.xml | 1 - 4 files changed, 99 insertions(+), 44 deletions(-) diff --git a/src/dlangui/core/settings.d b/src/dlangui/core/settings.d index 381b7116..5af4844c 100644 --- a/src/dlangui/core/settings.d +++ b/src/dlangui/core/settings.d @@ -718,47 +718,6 @@ final class Setting { return result; } - static long parseLong(inout string v, long defValue = 0) { - int len = cast(int)v.length; - if (len == 0) - return defValue; - int sign = 1; - long value = 0; - int digits = 0; - for (int i = 0; i < len; i++) { - char ch = v[i]; - if (ch == '-') { - if (i != 0) - return defValue; - sign = -1; - } else if (ch >= '0' && ch <= '9') { - digits++; - value = value * 10 + (ch - '0'); - } else { - return defValue; - } - } - return digits > 0 ? (sign > 0 ? value : -value) : defValue; - } - - static ulong parseULong(inout string v, ulong defValue = 0) { - int len = cast(int)v.length; - if (len == 0) - return defValue; - ulong value = 0; - int digits = 0; - for (int i = 0; i < len; i++) { - char ch = v[i]; - if (ch >= '0' && ch <= '9') { - digits++; - value = value * 10 + (ch - '0'); - } else { - return defValue; - } - } - return digits > 0 ? value : defValue; - } - /// read as long value @property inout(long) integer() inout { final switch(_type) with(SettingType) { @@ -1916,3 +1875,45 @@ final class Setting { } } } + +long parseLong(inout string v, long defValue = 0) { + int len = cast(int)v.length; + if (len == 0) + return defValue; + int sign = 1; + long value = 0; + int digits = 0; + for (int i = 0; i < len; i++) { + char ch = v[i]; + if (ch == '-') { + if (i != 0) + return defValue; + sign = -1; + } else if (ch >= '0' && ch <= '9') { + digits++; + value = value * 10 + (ch - '0'); + } else { + return defValue; + } + } + return digits > 0 ? (sign > 0 ? value : -value) : defValue; +} + +ulong parseULong(inout string v, ulong defValue = 0) { + int len = cast(int)v.length; + if (len == 0) + return defValue; + ulong value = 0; + int digits = 0; + for (int i = 0; i < len; i++) { + char ch = v[i]; + if (ch >= '0' && ch <= '9') { + digits++; + value = value * 10 + (ch - '0'); + } else { + return defValue; + } + } + return digits > 0 ? value : defValue; +} + diff --git a/src/dlangui/dialogs/settingsdialog.d b/src/dlangui/dialogs/settingsdialog.d index b30baccd..80b34cd8 100644 --- a/src/dlangui/dialogs/settingsdialog.d +++ b/src/dlangui/dialogs/settingsdialog.d @@ -62,6 +62,46 @@ class CheckboxItem : SettingsItem { } } +class NumberEditItem : SettingsItem { + protected int _minValue; + protected int _maxValue; + protected int _defaultValue; + this(string id, UIString label, int minValue = int.max, int maxValue = int.max, int defaultValue = 0) { + super(id, label); + _minValue = minValue; + _maxValue = maxValue; + _defaultValue = defaultValue; + } + /// create setting widget + override Widget createWidget(Setting settings) { + HorizontalLayout res = new HorizontalLayout(_id); + TextWidget lbl = new TextWidget(_id ~ "-label", _label); + EditLine ed = new EditLine(_id ~ "-edit", _label); + Setting setting = settings.settingByPath(_id, SettingType.STRING); + int n = cast(int)setting.integerDef(_defaultValue); + if (_minValue != int.max && n < _minValue) + n = _minValue; + if (_maxValue != int.max && n > _maxValue) + n = _maxValue; + setting.integer = cast(long)n; + ed.text = toUTF32(to!string(n)); + ed.onContentChangeListener = delegate(EditableContent content) { + long v = parseLong(toUTF8(content.text), long.max); + if (v != long.max) { + if ((_minValue == int.max || v >= _minValue) && (_maxValue == int.max || v <= _maxValue)) { + setting.integer = v; + ed.textColor = 0x000000; + } else { + ed.textColor = 0xFF0000; + } + } + }; + res.addChild(lbl); + res.addChild(ed); + return res; + } +} + /// settings page - item of settings tree, can edit several settings class SettingsPage { protected SettingsPage _parent; @@ -119,6 +159,13 @@ class SettingsPage { return res; } + /// add EditLine to edit number + NumberEditItem addNumberEdit(string id, UIString label, int minValue = int.max, int maxValue = int.max, int defaultValue = 0) { + NumberEditItem res = new NumberEditItem(id, label, minValue, maxValue, defaultValue); + addItem(res); + return res; + } + /// create page widget (default implementation creates empty page) Widget createWidget(Setting settings) { VerticalLayout res = new VerticalLayout(_id); @@ -192,7 +239,7 @@ class SettingsDialog : Dialog { _tree.fontSize = 16; _frame = new FrameLayout("prop_pages"); _frame.styleId = STYLE_SETTINGS_PAGES; - _frame.minHeight(200).minWidth(100).layoutHeight(FILL_PARENT).layoutHeight(FILL_PARENT); + _frame.layoutHeight(FILL_PARENT).layoutHeight(FILL_PARENT).minHeight(200).minWidth(100); createControls(_layout, _tree.items); HorizontalLayout content = new HorizontalLayout("settings_dlg_content"); content.addChild(_tree); @@ -202,7 +249,6 @@ class SettingsDialog : Dialog { addChild(createButtonsPanel([ACTION_APPLY, ACTION_CANCEL], 0, 0)); if (_layout.childCount > 0) _tree.selectItem(_layout.child(0).id); - } } diff --git a/src/dlangui/widgets/editors.d b/src/dlangui/widgets/editors.d index dc7e4251..48e23392 100644 --- a/src/dlangui/widgets/editors.d +++ b/src/dlangui/widgets/editors.d @@ -43,6 +43,11 @@ interface ModifiedStateListener { void onModifiedStateChange(Widget source, bool modified); } +/// Modified content listener +interface EditableContentChangeListener { + void onEditableContentChanged(EditableContent source); +} + /// Editor action codes enum EditorActions : int { None = 0, @@ -235,6 +240,7 @@ class EditWidgetBase : ScrollWidgetBase, EditableContentListener, MenuItemAction /// Modified state change listener Signal!ModifiedStateListener onModifiedStateChangeListener; + Signal!EditableContentChangeListener onContentChangeListener; /// override to support modification of client rect after change, e.g. apply offset override protected void handleClientRectLayout(ref Rect rc) { @@ -690,6 +696,9 @@ class EditWidgetBase : ScrollWidgetBase, EditableContentListener, MenuItemAction onModifiedStateChangeListener(this, content.modified); requestActionsUpdate(); } + } + if (onContentChangeListener.assigned) { + onContentChangeListener(_content); } return; } diff --git a/views/res/theme_default.xml b/views/res/theme_default.xml index 012d5d01..5f17dd34 100644 --- a/views/res/theme_default.xml +++ b/views/res/theme_default.xml @@ -371,7 +371,6 @@