settings dialog support

This commit is contained in:
Vadim Lopatin 2015-03-03 17:57:12 +03:00
parent 042c675431
commit e654035492
4 changed files with 209 additions and 117 deletions

View File

@ -57,6 +57,12 @@ class SettingsFile {
protected bool _loaded;
@property Setting setting() { return _setting; }
@property Setting copySettings() {
return _setting.clone();
}
@property void applySettings(Setting settings) {
_setting.apply(settings);
}
alias setting this;
/// create settings file object; if filename is provided, attempts to load settings from file
@ -241,6 +247,13 @@ final class Setting {
@property int length() {
return cast(int)list.length;
}
/// deep copy
void copyFrom(ref SettingArray v) {
list.length = v.list.length;
for(int i = 0; i < v.list.length; i++) {
list[i] = v.list[i].clone();
}
}
}
/// ordered map
@ -315,6 +328,16 @@ final class Setting {
@property int length() {
return cast(int)list.length;
}
/// deep copy
void copyFrom(SettingMap * v) {
list.length = v.list.length;
for(int i = 0; i < v.list.length; i++) {
list[i] = v.list[i].clone();
}
destroy(map);
foreach(key, value; v.map)
map[key] = value;
}
}
@ -374,6 +397,45 @@ final class Setting {
}
}
void apply(Setting settings) {
}
/// deep copy of settings
Setting clone() {
Setting res = new Setting();
res.clear(_type);
final switch(_type) with(SettingType) {
case STRING:
res._store.str = _store.str;
break;
case ARRAY:
res._store.array.copyFrom(_store.array);
break;
case OBJECT:
if (_store.map) {
res._store.map = new SettingMap();
res._store.map.copyFrom(_store.map);
}
break;
case INTEGER:
res._store.integer = _store.integer;
break;
case UINTEGER:
res._store.uinteger = _store.uinteger;
break;
case FLOAT:
res._store.floating = _store.floating;
break;
case TRUE:
case FALSE:
case NULL:
break;
}
res._changed = false;
return res;
}
/// read as string value
@property inout(string) str() inout {
final switch(_type) with(SettingType) {

View File

@ -4,7 +4,7 @@ import dlangui.core.events;
import dlangui.core.i18n;
import dlangui.core.stdaction;
import dlangui.core.files;
import dlangui.core.settings;
public import dlangui.core.settings;
import dlangui.widgets.controls;
import dlangui.widgets.lists;
import dlangui.widgets.layouts;
@ -22,6 +22,7 @@ private import std.utf;
private import std.conv : to;
private import std.array : split;
/// item on settings page
class SettingsItem {
protected string _id;
protected UIString _label;
@ -40,20 +41,27 @@ class SettingsItem {
}
}
/// items shows checkbox
/// checkbox setting
class CheckboxItem : SettingsItem {
this(string id, UIString label) {
private bool _inverse;
this(string id, UIString label, bool inverse = false) {
super(id, label);
_inverse = inverse;
}
/// create setting widget
override Widget createWidget(Setting settings) {
CheckBox res = new CheckBox(_id, _label);
Setting setting = settings.settingByPath(_id, SettingType.FALSE);
res.checked = setting.boolean;
res.checked = setting.boolean ^ _inverse;
res.onCheckChangeListener = delegate(Widget source, bool checked) {
setting.boolean = checked ^ _inverse;
return true;
};
return res;
}
}
/// settings page - item of settings tree, can edit several settings
class SettingsPage {
protected SettingsPage _parent;
protected ObjectList!SettingsPage _children;
@ -78,9 +86,14 @@ class SettingsPage {
return _children[index];
}
void addChild(SettingsPage item) {
SettingsPage addChild(SettingsPage item) {
_children.add(item);
item._parent = this;
return item;
}
SettingsPage addChild(string id, UIString label) {
return addChild(new SettingsPage(id, label));
}
@property int itemCount() {
@ -92,9 +105,17 @@ class SettingsPage {
return _items[index];
}
void addItem(SettingsItem item) {
SettingsItem addItem(SettingsItem item) {
_items.add(item);
item._page = this;
return item;
}
/// add checkbox (boolean value) for setting
CheckboxItem addCheckbox(string id, UIString label, bool inverse = false) {
CheckboxItem res = new CheckboxItem(id, label, inverse);
addItem(res);
return res;
}
/// create page widget (default implementation creates empty page)
@ -110,7 +131,7 @@ class SettingsPage {
}
TreeItem createTreeItem() {
return null;
return new TreeItem(_id, _label);
}
}
@ -118,10 +139,10 @@ class SettingsPage {
class SettingsDialog : Dialog {
protected TreeWidget _tree;
protected FrameLayout _frame;
protected SettingsFile _settings;
protected Setting _settings;
protected SettingsPage _layout;
this(UIString caption, Window parent, SettingsFile settings, SettingsPage layout) {
this(UIString caption, Window parent, Setting settings, SettingsPage layout) {
super(caption, parent, DialogFlag.Modal | DialogFlag.Resizable | DialogFlag.Popup);
_settings = settings;
_layout = layout;
@ -152,10 +173,18 @@ class SettingsDialog : Dialog {
minWidth(600).minHeight(400);
_tree = new TreeWidget("prop_tree");
_tree.layoutHeight(FILL_PARENT).layoutHeight(FILL_PARENT);
_tree.minHeight(200).minWidth(100);
_tree.selectionListener = &onTreeItemSelected;
_tree.fontSize = 16;
_frame = new FrameLayout("prop_pages");
_frame.minHeight(200).minWidth(100);
createControls(_layout, _tree.items);
HorizontalLayout content = new HorizontalLayout("settings_dlg_content");
content.addChild(_tree);
content.addChild(_frame);
content.layoutHeight(FILL_PARENT).layoutHeight(FILL_PARENT);
addChild(content);
addChild(createButtonsPanel([ACTION_APPLY, ACTION_CANCEL], 0, 0));
}
}

View File

@ -3,6 +3,7 @@
ACTION_OK=Ok
ACTION_CANCEL=Cancel
ACTION_YES=Yes
ACTION_APPLY=Apply
ACTION_NO=No
ACTION_CLOSE=Close
ACTION_ABORT=Abort