mirror of https://github.com/buggins/dlangui.git
settings - part 3
This commit is contained in:
parent
45ef53745d
commit
d2e37e38b8
|
@ -15,25 +15,43 @@ interface Settings {
|
||||||
string getString(string key, string defValue = null);
|
string getString(string key, string defValue = null);
|
||||||
/// set string for key, returns old value or null if not set
|
/// set string for key, returns old value or null if not set
|
||||||
string setString(string key, string value);
|
string setString(string key, string value);
|
||||||
|
/// get string by index, returns defValue if no such key
|
||||||
|
string getString(int index, string defValue = null);
|
||||||
|
/// set string for index, returns old value or null if not set
|
||||||
|
string setString(int index, string value);
|
||||||
/// get bool by key, returns defValue if no such key
|
/// get bool by key, returns defValue if no such key
|
||||||
bool getBool(string key, bool defValue = false);
|
bool getBool(string key, bool defValue = false);
|
||||||
/// set bool for key, returns old value or null if not set
|
/// set bool for key, returns old value or false if not set
|
||||||
bool setBool(string key, bool value);
|
bool setBool(string key, bool value);
|
||||||
|
/// get bool by index, returns defValue if no such key
|
||||||
|
bool getBool(int index, bool defValue = false);
|
||||||
|
/// set bool for index, returns old value or false if not set
|
||||||
|
bool setBool(int index, bool value);
|
||||||
/// get bool by key, returns defValue if no such key
|
/// get bool by key, returns defValue if no such key
|
||||||
int getInt(string key, int defValue = 0);
|
int getInt(string key, int defValue = 0);
|
||||||
/// set bool for key, returns old value or null if not set
|
/// set bool for key, returns old value or 0 if not set
|
||||||
int setInt(string key, int value);
|
int setInt(string key, int value);
|
||||||
|
/// get bool by index, returns defValue if no such key
|
||||||
|
int getInt(int index, int defValue = 0);
|
||||||
|
/// set bool for index, returns old value or 0 if not set
|
||||||
|
int setInt(int index, int value);
|
||||||
/// remove setting, returns true if removed, false if no such key
|
/// remove setting, returns true if removed, false if no such key
|
||||||
bool remove(string key);
|
bool remove(string key);
|
||||||
/// child subsettings access
|
/// child subsettings access by string key
|
||||||
Settings child(string key, bool createIfNotExist = false);
|
Settings child(string key, bool createIfNotExist = false);
|
||||||
|
/// child subsettings access by index
|
||||||
|
Settings child(int index, bool createIfNotExist = false);
|
||||||
|
/// returns number of number-indexed items
|
||||||
|
@property int length();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// implementation of settings object
|
/// implementation of settings object
|
||||||
class SettingsImpl : Settings {
|
class SettingsImpl : Settings {
|
||||||
protected SettingsImpl _parent;
|
protected SettingsImpl _parent;
|
||||||
protected SettingsImpl[string] _children;
|
protected SettingsImpl[string] _children;
|
||||||
|
protected SettingsImpl[] _indexedChildren;
|
||||||
protected string[string] _values;
|
protected string[string] _values;
|
||||||
|
protected string[] _indexedValues;
|
||||||
|
|
||||||
this(SettingsImpl parent = null) {
|
this(SettingsImpl parent = null) {
|
||||||
_parent = parent;
|
_parent = parent;
|
||||||
|
@ -44,6 +62,34 @@ class SettingsImpl : Settings {
|
||||||
return _parent;
|
return _parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// get string by index, returns defValue if no such key
|
||||||
|
override string getString(int index, string defValue = null) {
|
||||||
|
if (index < 0 || index >= _indexedValues.length)
|
||||||
|
return defValue;
|
||||||
|
string res = _indexedValues[index];
|
||||||
|
if (!res)
|
||||||
|
return defValue;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
/// set string for index, returns old value or null if not set
|
||||||
|
override string setString(int index, string value) {
|
||||||
|
assert(index >= 0);
|
||||||
|
assert(index < 10000);
|
||||||
|
string res;
|
||||||
|
if (index >= 0 && index < _indexedValues.length)
|
||||||
|
res = _indexedValues[index];
|
||||||
|
if (_indexedValues.length <= index)
|
||||||
|
_indexedValues.length = !_indexedValues.length ? 8 : index * 2;
|
||||||
|
_indexedValues[index] = value;
|
||||||
|
if (index < _indexedChildren.length)
|
||||||
|
_indexedChildren[index] = null;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
/// returns number of number-indexed items
|
||||||
|
override @property int length() {
|
||||||
|
return cast(int)max(_indexedValues.length, _indexedChildren.length);
|
||||||
|
}
|
||||||
|
|
||||||
private static bool splitKey(string key, ref string part1, ref string part2) {
|
private static bool splitKey(string key, ref string part1, ref string part2) {
|
||||||
int dashPos = -1;
|
int dashPos = -1;
|
||||||
for (int i = 0; i < key.length; i++) {
|
for (int i = 0; i < key.length; i++) {
|
||||||
|
@ -140,6 +186,20 @@ class SettingsImpl : Settings {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// child subsettings access by index
|
||||||
|
override Settings child(int index, bool createIfNotExist = false) {
|
||||||
|
assert(index >= 0);
|
||||||
|
if (_indexedChildren.length <= index && createIfNotExist)
|
||||||
|
_indexedChildren.length = !_indexedChildren.length ? 8 : index * 2;
|
||||||
|
Settings res = index < _indexedChildren.length ? _indexedChildren[index] : null;
|
||||||
|
if (res || !createIfNotExist)
|
||||||
|
return res;
|
||||||
|
SettingsImpl newItem = new SettingsImpl(this);
|
||||||
|
_indexedChildren[index] = newItem;
|
||||||
|
if (index < _indexedValues.length)
|
||||||
|
_indexedValues[index] = null;
|
||||||
|
return newItem;
|
||||||
|
}
|
||||||
|
|
||||||
/// remove setting, returns true if removed, false if no such key
|
/// remove setting, returns true if removed, false if no such key
|
||||||
bool remove(string key) {
|
bool remove(string key) {
|
||||||
|
@ -199,20 +259,36 @@ class SettingsImpl : Settings {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// get bool by key, returns defValue if no such key
|
/// get bool by key, returns defValue if no such key
|
||||||
bool getBool(string key, bool defValue = false) {
|
override bool getBool(string key, bool defValue = false) {
|
||||||
return parseBool(getString(key, ""), defValue);
|
return parseBool(getString(key, ""), defValue);
|
||||||
}
|
}
|
||||||
/// set bool for key, returns old value or null if not set
|
/// set bool for key, returns old value or null if not set
|
||||||
bool setBool(string key, bool value) {
|
override bool setBool(string key, bool value) {
|
||||||
return parseBool(setString(key, value ? "1" : "0"), false);
|
return parseBool(setString(key, value ? "1" : "0"), false);
|
||||||
}
|
}
|
||||||
|
/// get bool by index, returns defValue if no such key
|
||||||
|
override bool getBool(int index, bool defValue = false) {
|
||||||
|
return parseBool(getString(index, ""), defValue);
|
||||||
|
}
|
||||||
|
/// set bool for index, returns old value or false if not set
|
||||||
|
override bool setBool(int index, bool value) {
|
||||||
|
return parseBool(setString(index, value ? "1" : "0"), false);
|
||||||
|
}
|
||||||
|
|
||||||
/// get bool by key, returns defValue if no such key
|
/// get bool by key, returns defValue if no such key
|
||||||
int getInt(string key, int defValue = 0) {
|
override int getInt(string key, int defValue = 0) {
|
||||||
return parseInt(getString(key, ""), defValue);
|
return parseInt(getString(key, ""), defValue);
|
||||||
}
|
}
|
||||||
/// set bool for key, returns old value or null if not set
|
/// set bool for key, returns old value or null if not set
|
||||||
int setInt(string key, int value) {
|
override int setInt(string key, int value) {
|
||||||
return parseInt(setString(key, to!string(value)), false);
|
return parseInt(setString(key, to!string(value)), false);
|
||||||
}
|
}
|
||||||
|
/// get bool by index, returns defValue if no such key
|
||||||
|
override int getInt(int index, int defValue = 0) {
|
||||||
|
return parseInt(getString(index, ""), defValue);
|
||||||
|
}
|
||||||
|
/// set bool for index, returns old value or 0 if not set
|
||||||
|
override int setInt(int index, int value) {
|
||||||
|
return parseInt(setString(index, to!string(value)), false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue