#pragma once

#include "datasource.qh"
CLASS(SettingSource, DataSource)
	METHOD(SettingSource, getEntry, entity(entity this, int i, void(string name, string icon) returns));
	METHOD(SettingSource, getEntryTooltip, entity(entity this, int i, void(string theTooltip) returns));
	METHOD(SettingSource, reload, int(entity this, string filter));
ENDCLASS(SettingSource)

#include "listbox.qh"
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);
	ATTRIB(XonoticRegisteredSettingsList, stringFilter, string);
	ATTRIB(XonoticRegisteredSettingsList, typeToSearchString, string);
	ATTRIB(XonoticRegisteredSettingsList, typeToSearchTime, float, 0);
	ATTRIB(XonoticRegisteredSettingsList, source, DataSource);
	ATTRIB(XonoticRegisteredSettingsList, onChange, void(entity, entity));
	ATTRIB(XonoticRegisteredSettingsList, onChangeEntity, entity);
	METHOD(XonoticRegisteredSettingsList, focusedItemChangeNotify, void(entity));
	METHOD(XonoticRegisteredSettingsList, drawListBoxItem, void(entity this, int i, vector absSize, bool isSelected, bool isFocused));
	METHOD(XonoticRegisteredSettingsList, focusedItemChangeNotify, void(entity this));
	METHOD(XonoticRegisteredSettingsList, refilter, void(entity this));
	METHOD(XonoticRegisteredSettingsList, resizeNotify, void(entity this, vector relOrigin, vector relSize, vector absOrigin, vector absSize));
	METHOD(XonoticRegisteredSettingsList, setSelected, void(entity this, int i));
	CONSTRUCTOR(XonoticRegisteredSettingsList, DataSource _source);
ENDCLASS(XonoticRegisteredSettingsList)

#include "tab.qh"
#include "scrollpanel.qh"
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));
	// XonoticScrollPanel disabled because it's broken, see https://gitlab.com/xonotic/xonotic-data.pk3dir/merge_requests/548
	// It will probably require a different implementation since XonoticScrollPanel should be an instance of Container, not ListBox
	//ATTRIB(XonoticGameSettingsTab, currentPanel, entity, NEW(XonoticScrollPanel));
	ATTRIB(XonoticGameSettingsTab, currentPanel, entity, NEW(XonoticTab));
	ATTRIB(XonoticGameSettingsTab, currentItem, entity);
	METHOD(XonoticGameSettingsTab, topicChangeNotify, void(entity, entity this));
	METHOD(XonoticGameSettingsTab, fill, void(entity this));
	INIT(XonoticGameSettingsTab)
    {
        this.configureDialog(this);
    }
ENDCLASS(XonoticGameSettingsTab)