#ifndef DIALOG_SETTINGS_GAME_H #define DIALOG_SETTINGS_GAME_H #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, getEntryTooltip, entity(int i, void(string theTooltip) returns)) { Lazy l = SETTINGS[i]; entity it = l.m_get(); if (returns) returns(it.tooltip); 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) METHOD(XonoticRegisteredSettingsList, focusedItemChangeNotify, void(entity)); string XonoticRegisteredSettingsList_cb_name; string XonoticRegisteredSettingsList_cb_tooltip; void XonoticRegisteredSettingsList_getNameIcon_cb(string _name, string _icon) { XonoticRegisteredSettingsList_cb_name = _name; } void XonoticRegisteredSettingsList_getTooltip_cb(string _tooltip) { XonoticRegisteredSettingsList_cb_tooltip = _tooltip; } METHOD(XonoticRegisteredSettingsList, drawListBoxItem, void(entity this, int i, vector absSize, bool isSelected, bool isFocused)) { if (!this.source) return; if (!this.source.getEntry(i, XonoticRegisteredSettingsList_getNameIcon_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, focusedItemChangeNotify, void(entity this)) { if (this.focusedItem == -1 || !this.source) { clearTooltip(this); return; } if (!this.source.getEntryTooltip(this.focusedItem, XonoticRegisteredSettingsList_getTooltip_cb)) { clearTooltip(this); return; } string theTooltip = XonoticRegisteredSettingsList_cb_tooltip; if(theTooltip != "") setZonedTooltip(this, theTooltip, string_null); else clearTooltip(this); } 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) #include "tab.qc" CLASS(XonoticGameSettingsTab, XonoticTab) ATTRIB(XonoticGameSettingsTab, intendedWidth, float, 0.9) ATTRIB(XonoticGameSettingsTab, rows, float, 15.5) ATTRIB(XonoticGameSettingsTab, columns, float, 6.5) ATTRIB(XonoticGameSettingsTab, topicList, entity, NEW(XonoticRegisteredSettingsList, NEW(SettingSource))) ATTRIB(XonoticGameSettingsTab, currentPanel, entity, NEW(XonoticTab)) ATTRIB(XonoticGameSettingsTab, currentItem, entity, NULL) METHOD(XonoticGameSettingsTab, topicChangeNotify, void(entity, entity this)) { entity c = this.currentPanel; entity removing = this.currentItem; entity adding = this.topicList.source.getEntry(this.topicList.selectedItem, func_null); if (removing == adding) return; if (removing) { this.currentItem = NULL; c.removeItem(c, removing); } if (adding) { this.currentItem = adding; adding.resizeNotify(adding, '0 0 0', c.size, '0 0 0', c.size); c.addItem(c, adding, '0 0 0', '1 1 0', 1); } } METHOD(XonoticGameSettingsTab, fill, void(entity this)) { entity topics = this.topicList; topics.onChange = this.topicChangeNotify; topics.onChangeEntity = this; int col = 0, width = 1.5; this.gotoRC(this, 0, col); this.TD(this, this.rows, width, topics); col += width, width = this.columns - col; this.gotoRC(this, 0, col); this.setFirstColumn(this, this.currentColumn); this.TD(this, this.rows, width, this.currentPanel); this.topicChangeNotify(topics, this); } INIT(XonoticGameSettingsTab) { this.configureDialog(this); } ENDCLASS(XonoticGameSettingsTab) #endif