+
+#include "../gamesettings.qh"
+
+#include "datasource.qc"
+CLASS(SettingSource, DataSource)
+ METHOD(SettingSource, getEntry, entity(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; }
+ENDCLASS(SettingSource)
+
+#include "listbox.qc"
+CLASS(XonoticRegisteredSettingsList, XonoticListBox)
+ ATTRIB(XonoticRegisteredSettingsList, alphaBG, float, 0)
+ ATTRIB(XonoticRegisteredSettingsList, itemAbsSize, vector, '0 0 0')
+ ATTRIB(XonoticRegisteredSettingsList, origin, vector, '0 0 0')
+ ATTRIB(XonoticRegisteredSettingsList, realFontSize, vector, '0 0 0')
+ ATTRIB(XonoticRegisteredSettingsList, realUpperMargin, float, 0)
+ ATTRIB(XonoticRegisteredSettingsList, rowsPerItem, float, 2)
+ ATTRIB(XonoticRegisteredSettingsList, stringFilterBox, entity, NULL)
+ ATTRIB(XonoticRegisteredSettingsList, stringFilter, string, string_null)
+ ATTRIB(XonoticRegisteredSettingsList, typeToSearchString, string, string_null)
+ ATTRIB(XonoticRegisteredSettingsList, typeToSearchTime, float, 0)
+ ATTRIB(XonoticRegisteredSettingsList, source, DataSource, NULL)
+ ATTRIB(XonoticRegisteredSettingsList, onChange, void(entity, entity), func_null)
+ ATTRIB(XonoticRegisteredSettingsList, onChangeEntity, entity, NULL)
+ string XonoticRegisteredSettingsList_cb_name;
+ void XonoticRegisteredSettingsList_cb(string _name, string _icon)
+ {
+ XonoticRegisteredSettingsList_cb_name = _name;
+ }
+ 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;
+ string name = XonoticRegisteredSettingsList_cb_name;
+ if (isSelected) {
+ draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED);
+ } else if (isFocused) {
+ this.focusedItemAlpha = getFadedAlpha(this.focusedItemAlpha, SKINALPHA_LISTBOX_FOCUSED, SKINFADEALPHA_LISTBOX_FOCUSED);
+ draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_FOCUSED, this.focusedItemAlpha);
+ }
+ string s = draw_TextShortenToWidth(strdecolorize(name), 1, 0, this.realFontSize);
+ draw_Text(this.realUpperMargin * eY + (0.5 * this.realFontSize.x) * eX, s, this.realFontSize, '1 1 1', SKINALPHA_TEXT, 0);
+ }
+ METHOD(XonoticRegisteredSettingsList, refilter, void(entity this))
+ {
+ if (!this.source) {
+ this.nItems = 0;
+ return;
+ }
+ this.nItems = this.source.reload(this.stringFilter);
+ }
+ METHOD(XonoticRegisteredSettingsList, resizeNotify, void(entity this, vector relOrigin, vector relSize, vector absOrigin, vector absSize))
+ {
+ super.resizeNotify(this, relOrigin, relSize, absOrigin, absSize);
+
+ this.itemAbsSize = '0 0 0';
+ this.realFontSize_y = this.fontSize / (this.itemAbsSize_y = (absSize.y * this.itemHeight));
+ this.realFontSize_x = this.fontSize / (this.itemAbsSize_x = (absSize.x * (1 - this.controlWidth)));
+ this.realUpperMargin = 0.5 * (1 - this.realFontSize.y);
+ }
+ METHOD(XonoticRegisteredSettingsList, setSelected, void(entity this, int i))
+ {
+ super.setSelected(this, i);
+ this.onChange(this, this.onChangeEntity);
+ }
+ CONSTRUCTOR(XonoticRegisteredSettingsList, DataSource _source) {
+ CONSTRUCT(XonoticRegisteredSettingsList);
+ this.source = _source;
+ this.configureXonoticListBox(this);
+ this.refilter(this);
+ }
+ENDCLASS(XonoticRegisteredSettingsList)
+