#ifndef DIALOG_SETTINGS_GAME_H #define DIALOG_SETTINGS_GAME_H #include "../gamesettings.qh" #include "datasource.qc" CLASS(SettingSource, DataSource) 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(entity this, 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(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); } 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.source, 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, source, DataSource, NEW(SettingSource)) ATTRIB(XonoticGameSettingsTab, topicList, entity, NEW(XonoticRegisteredSettingsList, this.source)) 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; DataSource data = this.topicList.source; entity adding = data.getEntry(data, 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