--- /dev/null
+#ifdef INTERFACE
+CLASS(XonoticWeaponsList) EXTENDS(XonoticListBox)
+ METHOD(XonoticWeaponsList, configureXonoticWeaponsList, void(entity))
+ METHOD(XonoticWeaponsList, toString, string(entity))
+ ATTRIB(XonoticWeaponsList, rowsPerItem, float, 1)
+ METHOD(XonoticWeaponsList, draw, void(entity))
+ METHOD(XonoticWeaponsList, drawListBoxItem, void(entity, float, vector, float))
+ METHOD(XonoticWeaponsList, resizeNotify, void(entity, vector, vector, vector, vector))
+ METHOD(XonoticWeaponsList, keyDown, float(entity, float, float, float))
+ ATTRIB(XonoticWeaponsList, realFontSize, vector, '0 0 0')
+ ATTRIB(XonoticWeaponsList, realUpperMargin, float, 0)
+ METHOD(XonoticWeaponsList, mouseDrag, float(entity, vector))
+ ATTRIB(XonoticWeaponsList, scrollbarWidth, float, 0)
+ENDCLASS(XonoticWeaponsList)
+entity makeXonoticWeaponsList();
+void WeaponsList_MoveUp_Click(entity btn, entity me);
+void WeaponsList_MoveDown_Click(entity box, entity me);
+#endif
+
+#ifdef IMPLEMENTATION
+entity makeXonoticWeaponsList()
+{
+ entity me;
+ me = spawnXonoticWeaponsList();
+ me.configureXonoticWeaponsList(me);
+ return me;
+}
+void configureXonoticWeaponsListXonoticWeaponsList(entity me)
+{
+ me.configureXonoticListBox(me);
+}
+void drawXonoticWeaponsList(entity me)
+{
+ // read in cvar?
+ string s, t;
+ s = W_NumberWeaponOrder(cvar_string("cl_weaponpriority"));
+ t = W_FixWeaponOrder(s, 1);
+ if(t != s)
+ {
+ print("AUTOFIXED\n");
+ cvar_set("cl_weaponpriority", W_NameWeaponOrder(t));
+ }
+ me.nItems = tokenize_console(t);
+ drawListBox(me);
+}
+void WeaponsList_MoveUp_Click(entity box, entity me)
+{
+ if(me.selectedItem > 0)
+ {
+ cvar_set("cl_weaponpriority", swapInPriorityList(cvar_string("cl_weaponpriority"), me.selectedItem - 1, me.selectedItem));
+ me.selectedItem -= 1;
+ }
+}
+void WeaponsList_MoveDown_Click(entity box, entity me)
+{
+ if(me.selectedItem < me.nItems - 1)
+ {
+ cvar_set("cl_weaponpriority", swapInPriorityList(cvar_string("cl_weaponpriority"), me.selectedItem, me.selectedItem + 1));
+ me.selectedItem += 1;
+ }
+}
+void resizeNotifyXonoticWeaponsList(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
+{
+ resizeNotifyXonoticListBox(me, relOrigin, relSize, absOrigin, absSize);
+
+ me.realFontSize_y = me.fontSize / (absSize_y * me.itemHeight);
+ me.realFontSize_x = me.fontSize / (absSize_x * (1 - me.controlWidth));
+ me.realUpperMargin = 0.5 * (1 - me.realFontSize_y);
+}
+float mouseDragXonoticWeaponsList(entity me, vector pos)
+{
+ float f, i;
+ i = me.selectedItem;
+ f = mouseDragListBox(me, pos);
+ if(me.selectedItem != i)
+ cvar_set("cl_weaponpriority", swapInPriorityList(cvar_string("cl_weaponpriority"), me.selectedItem, i));
+ return f;
+}
+string toStringXonoticWeaponsList(entity me)
+{
+ float n, i;
+ string s;
+ entity e;
+ n = tokenize_console(W_NumberWeaponOrder(cvar_string("cl_weaponpriority")));
+ s = "";
+ for(i = 0; i < n; ++i)
+ {
+ e = get_weaponinfo(stof(argv(i)));
+ s = strcat(s, e.message, ", ");
+ }
+ return substring(s, 0, strlen(s) - 2);
+}
+void drawListBoxItemXonoticWeaponsList(entity me, float i, vector absSize, float isSelected)
+{
+ entity e;
+ if(isSelected)
+ draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED);
+ e = get_weaponinfo(stof(argv(i)));
+ draw_Text(me.realUpperMargin * eY, e.message, me.realFontSize, '1 1 1', SKINALPHA_TEXT, 0);
+}
+
+float keyDownXonoticWeaponsList(entity me, float scan, float ascii, float shift)
+{
+ if(ascii == 43) // +
+ {
+ WeaponsList_MoveUp_Click(NULL, me);
+ return 1;
+ }
+ else if(scan == 45) // -
+ {
+ WeaponsList_MoveDown_Click(NULL, me);
+ return 1;
+ }
+ else if(keyDownListBox(me, scan, ascii, shift))
+ return 1;
+ return 0;
+}
+#endif