* returns `DataSource_false` if out of bounds
* otherwise returns an entity or `DataSource_true`
*/
- METHOD(DataSource, getEntry, entity(int i, void(string name, string icon) returns)) { return DataSource_false; }
+ METHOD(DataSource, getEntry, entity(entity this, int i, void(string name, string icon) returns)) { return DataSource_false; }
/** return the index of the first match for `find`. optional */
- METHOD(DataSource, indexOf, int(string find)) { return -1; }
+ METHOD(DataSource, indexOf, int(entity this, string find)) { return -1; }
/** reload all entries matching `filter` returning how many matches were found */
- METHOD(DataSource, reload, int(string filter)) { return 0; }
+ METHOD(DataSource, reload, int(entity this, string filter)) { return 0; }
/** cleanup on shutdown. optional */
- METHOD(DataSource, destroy, void(entity)) { }
+ METHOD(DataSource, destroy, void(entity this)) { }
ENDCLASS(DataSource)
+
+
+CLASS(StringSource, DataSource)
+ ATTRIB(StringSource, StringSource_str, string, string_null)
+ ATTRIB(StringSource, StringSource_sep, string, string_null)
+ CONSTRUCTOR(StringSource, string str, string sep)
+ {
+ CONSTRUCT(StringSource);
+ this.StringSource_str = str;
+ this.StringSource_sep = sep;
+ }
+ METHOD(StringSource, getEntry, entity(entity this, int i, void(string name, string icon) returns))
+ {
+ int n = tokenizebyseparator(this.StringSource_str, this.StringSource_sep);
+ if (i < 0 || i >= n) return DataSource_false;
+ string s = argv(i);
+ if (returns) returns(s, string_null);
+ return DataSource_true;
+ }
+ METHOD(StringSource, reload, int(entity this, string filter))
+ {
+ return tokenizebyseparator(this.StringSource_str, this.StringSource_sep);
+ }
+ENDCLASS(StringSource)
+
+CLASS(CvarStringSource, StringSource)
+ ATTRIB(CvarStringSource, CvarStringSource_cvar, string, string_null)
+ CONSTRUCTOR(CvarStringSource, string cv, string sep)
+ {
+ CONSTRUCT(CvarStringSource);
+ this.CvarStringSource_cvar = cv;
+ this.StringSource_sep = sep;
+ }
+ METHOD(CvarStringSource, getEntry, entity(entity this, int i, void(string name, string icon) returns))
+ {
+ string s = this.CvarStringSource_cvar;
+ this.StringSource_str = s ? cvar_string(s) : string_null;
+ return super.getEntry(this, i, returns);
+ }
+ METHOD(CvarStringSource, reload, int(entity this, string filter))
+ {
+ string s = this.CvarStringSource_cvar;
+ this.StringSource_str = s ? cvar_string(s) : string_null;
+ return super.reload(this, filter);
+ }
+ENDCLASS(CvarStringSource)
#endif
#include "datasource.qc"
CLASS(SettingSource, DataSource)
- METHOD(SettingSource, getEntry, entity(int i, void(string name, string icon) returns))
+ METHOD(SettingSource, getEntry, entity(entity this, int i, void(string name, string icon) returns))
{
Lazy l = SETTINGS[i];
entity it = l.m_get();
if (returns) returns(it.title, string_null);
return it;
}
- METHOD(SettingSource, reload, int(string filter)) { return SETTINGS_COUNT; }
+ METHOD(SettingSource, reload, int(entity this, string filter)) { return SETTINGS_COUNT; }
ENDCLASS(SettingSource)
#include "listbox.qc"
METHOD(XonoticRegisteredSettingsList, drawListBoxItem, void(entity this, int i, vector absSize, bool isSelected, bool isFocused))
{
if (!this.source) return;
- if (!this.source.getEntry(i, XonoticRegisteredSettingsList_cb)) return;
+ if (!this.source.getEntry(this.source, i, XonoticRegisteredSettingsList_cb)) return;
string name = XonoticRegisteredSettingsList_cb_name;
if (isSelected) {
draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED);
this.nItems = 0;
return;
}
- this.nItems = this.source.reload(this.stringFilter);
+ this.nItems = this.source.reload(this.source, this.stringFilter);
}
METHOD(XonoticRegisteredSettingsList, resizeNotify, void(entity this, vector relOrigin, vector relSize, vector absOrigin, vector absSize))
{
{
entity c = this.currentPanel;
entity removing = this.currentItem;
- entity adding = this.topicList.source.getEntry(this.topicList.selectedItem, func_null);
+ DataSource data = this.topicList.source;
+ entity adding = data.getEntry(data, this.topicList.selectedItem, func_null);
if (removing == adding) return;
if (removing) {
this.currentItem = NULL;