X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fmenu%2Fxonotic%2Fdatasource.qc;h=57ce0c80c312e73c7826110a6075dc8a6e9b4284;hb=e7419831cfa8df073b3f7d3184ce6914e38791d4;hp=49cc571761885e394686651985b548d98af1f7c7;hpb=c89dfaa4d0342b98c320621557973a65114fbdf4;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/menu/xonotic/datasource.qc b/qcsrc/menu/xonotic/datasource.qc index 49cc57176..57ce0c80c 100644 --- a/qcsrc/menu/xonotic/datasource.qc +++ b/qcsrc/menu/xonotic/datasource.qc @@ -12,12 +12,58 @@ CLASS(DataSource, Object) * 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