X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fmenu%2Fxonotic%2Fmaplist.qc;h=91d8eaa3de36d6bf14896d31cea4895f8aaf3e20;hp=4003a36d78f682a894a3a0ef9596d0f72bfc8f95;hb=c6437cd43edc4489ad69746a30b5532f18c1af74;hpb=1a90cd40e2050abaf5fb3838eee64e7ad6f887e9 diff --git a/qcsrc/menu/xonotic/maplist.qc b/qcsrc/menu/xonotic/maplist.qc index 4003a36d7..91d8eaa3d 100644 --- a/qcsrc/menu/xonotic/maplist.qc +++ b/qcsrc/menu/xonotic/maplist.qc @@ -1,15 +1,17 @@ -#ifdef INTERFACE -CLASS(XonoticMapList) EXTENDS(XonoticListBox) - METHOD(XonoticMapList, configureXonoticMapList, void(entity)) +#ifndef MAPLIST_H +#define MAPLIST_H +#include "listbox.qc" +CLASS(XonoticMapList, XonoticListBox) + METHOD(XonoticMapList, configureXonoticMapList, void(entity)); ATTRIB(XonoticMapList, rowsPerItem, float, 4) - METHOD(XonoticMapList, draw, void(entity)) - METHOD(XonoticMapList, drawListBoxItem, void(entity, int, vector, bool, float)) - METHOD(XonoticMapList, clickListBoxItem, void(entity, float, vector)) - METHOD(XonoticMapList, doubleClickListBoxItem, void(entity, float, vector)) - METHOD(XonoticMapList, resizeNotify, void(entity, vector, vector, vector, vector)) - METHOD(XonoticMapList, refilter, void(entity)) - METHOD(XonoticMapList, refilterCallback, void(entity, entity)) - METHOD(XonoticMapList, keyDown, float(entity, float, float, float)) + METHOD(XonoticMapList, draw, void(entity)); + METHOD(XonoticMapList, drawListBoxItem, void(entity, int, vector, bool, bool)); + METHOD(XonoticMapList, clickListBoxItem, void(entity, float, vector)); + METHOD(XonoticMapList, doubleClickListBoxItem, void(entity, float, vector)); + METHOD(XonoticMapList, resizeNotify, void(entity, vector, vector, vector, vector)); + METHOD(XonoticMapList, refilter, void(entity)); + METHOD(XonoticMapList, refilterCallback, void(entity, entity)); + METHOD(XonoticMapList, keyDown, float(entity, float, float, float)); ATTRIB(XonoticMapList, realFontSize, vector, '0 0 0') ATTRIB(XonoticMapList, columnPreviewOrigin, float, 0) @@ -28,23 +30,30 @@ CLASS(XonoticMapList) EXTENDS(XonoticListBox) ATTRIB(XonoticMapList, itemAbsSize, vector, '0 0 0') ATTRIB(XonoticMapList, g_maplistCache, string, string_null) - METHOD(XonoticMapList, g_maplistCacheToggle, void(entity, float)) - METHOD(XonoticMapList, g_maplistCacheQuery, float(entity, float)) + METHOD(XonoticMapList, g_maplistCacheToggle, void(entity, float)); + METHOD(XonoticMapList, g_maplistCacheQuery, float(entity, float)); + + ATTRIB(XonoticMapList, stringFilter, string, string_null) + ATTRIB(XonoticMapList, stringFilterBox, entity, NULL) ATTRIB(XonoticMapList, startButton, entity, NULL) - METHOD(XonoticMapList, loadCvars, void(entity)) + METHOD(XonoticMapList, loadCvars, void(entity)); ATTRIB(XonoticMapList, typeToSearchString, string, string_null) ATTRIB(XonoticMapList, typeToSearchTime, float, 0) - METHOD(XonoticMapList, destroy, void(entity)) + METHOD(XonoticMapList, destroy, void(entity)); - ATTRIB(XonoticListBox, alphaBG, float, 0) + ATTRIB(XonoticMapList, alphaBG, float, 0) ENDCLASS(XonoticMapList) entity makeXonoticMapList(); -void MapList_All(entity btn, entity me); -void MapList_None(entity btn, entity me); +void MapList_StringFilterBox_Change(entity box, entity me); +float MapList_StringFilterBox_keyDown(entity me, float key, float ascii, float shift); +void MapList_Add_Shown(entity btn, entity me); +void MapList_Remove_Shown(entity btn, entity me); +void MapList_Add_All(entity btn, entity me); +void MapList_Remove_All(entity btn, entity me); void MapList_LoadMap(entity btn, entity me); #endif @@ -57,11 +66,17 @@ void XonoticMapList_destroy(entity me) entity makeXonoticMapList() { entity me; - me = spawnXonoticMapList(); + me = NEW(XonoticMapList); me.configureXonoticMapList(me); return me; } +entity MapList_Set_String_Filter_Box(entity me, entity e) +{ + me.stringFilterBox = e; + return e; +} + void XonoticMapList_configureXonoticMapList(entity me) { me.configureXonoticListBox(me); @@ -73,6 +88,7 @@ void XonoticMapList_loadCvars(entity me) me.refilter(me); } + float XonoticMapList_g_maplistCacheQuery(entity me, float i) { return stof(substring(me.g_maplistCache, i, 1)); @@ -159,7 +175,7 @@ void XonoticMapList_doubleClickListBoxItem(entity me, float i, vector where) } } -void XonoticMapList_drawListBoxItem(entity me, int i, vector absSize, bool isSelected, float highlightedTime) +void XonoticMapList_drawListBoxItem(entity me, int i, vector absSize, bool isSelected, bool isFocused) { // layout: Ping, Map name, Map name, NP, TP, MP string s; @@ -181,8 +197,11 @@ void XonoticMapList_drawListBoxItem(entity me, int i, vector absSize, bool isSel { if(included) draw_Fill('0 0 0', '1 1 0', SKINCOLOR_MAPLIST_INCLUDEDBG, SKINALPHA_MAPLIST_INCLUDEDBG); - if(highlightedTime) - draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_FOCUSED, getHighlightAlpha(SKINALPHA_LISTBOX_FOCUSED, SKINFADEALPHA_LISTBOX_FOCUSED, highlightedTime)); + if(isFocused) + { + me.focusedItemAlpha = getFadedAlpha(me.focusedItemAlpha, SKINALPHA_LISTBOX_FOCUSED, SKINFADEALPHA_LISTBOX_FOCUSED); + draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_FOCUSED, me.focusedItemAlpha); + } } if(draw_PictureSize(strcat("/maps/", MapInfo_Map_bspname)) == '0 0 0') @@ -208,7 +227,10 @@ void XonoticMapList_refilter(entity me) gt = MapInfo_CurrentGametype(); f = MapInfo_CurrentFeatures(); MapInfo_FilterGametype(gt, f, MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 0); + if (me.stringFilter) + MapInfo_FilterString(me.stringFilter); me.nItems = MapInfo_count; + for(i = 0; i < MapInfo_count; ++i) draw_PreloadPicture(strcat("/maps/", MapInfo_BSPName_ByID(i))); if(me.g_maplistCache) @@ -221,11 +243,15 @@ void XonoticMapList_refilter(entity me) { j = MapInfo_FindName(argv(i)); if(j >= 0) - s = strcat( - substring(s, 0, j), - "1", - substring(s, j+1, MapInfo_count - (j+1)) - ); + { + // double check that the two mapnames are "identical", not just share the same prefix + if (strlen(MapInfo_BSPName_ByID(j)) == strlen(argv(i))) + s = strcat( + substring(s, 0, j), + "1", + substring(s, j+1, MapInfo_count - (j+1)) + ); + } } me.g_maplistCache = strzone(s); if(gt != me.lastGametype || f != me.lastFeatures) @@ -241,7 +267,43 @@ void XonoticMapList_refilterCallback(entity me, entity cb) me.refilter(me); } -void MapList_All(entity btn, entity me) +void MapList_StringFilterBox_Change(entity box, entity me) +{ + if(me.stringFilter) + strunzone(me.stringFilter); + if(box.text != "") + me.stringFilter = strzone(box.text); + else + me.stringFilter = string_null; + + me.refilter(me); +} + +void MapList_Add_Shown(entity btn, entity me) +{ + float i, n; + n = strlen(me.g_maplistCache); + for (i = 0 ; i < n; i++) + { + if (!me.g_maplistCacheQuery(me, i)) + me.g_maplistCacheToggle(me, i); + } + me.refilter(me); +} + +void MapList_Remove_Shown(entity btn, entity me) +{ + float i, n; + n = strlen(me.g_maplistCache); + for (i = 0 ; i < n; i++) + { + if (me.g_maplistCacheQuery(me, i)) + me.g_maplistCacheToggle(me, i); + } + me.refilter(me); +} + +void MapList_Add_All(entity btn, entity me) { float i; string s; @@ -253,7 +315,7 @@ void MapList_All(entity btn, entity me) me.refilter(me); } -void MapList_None(entity btn, entity me) +void MapList_Remove_All(entity btn, entity me) { cvar_set("g_maplist", ""); me.refilter(me); @@ -278,7 +340,7 @@ void MapList_LoadMap(entity btn, entity me) m = MapInfo_BSPName_ByID(i); if (!m) { - print(_("Huh? Can't play this (m is NULL). Refiltering so this won't happen again.\n")); + LOG_INFO(_("Huh? Can't play this (m is NULL). Refiltering so this won't happen again.\n")); me.refilter(me); return; } @@ -291,7 +353,7 @@ void MapList_LoadMap(entity btn, entity me) } else { - print(_("Huh? Can't play this (invalid game type). Refiltering so this won't happen again.\n")); + LOG_INFO(_("Huh? Can't play this (invalid game type). Refiltering so this won't happen again.\n")); me.refilter(me); return; } @@ -362,9 +424,38 @@ float XonoticMapList_keyDown(entity me, float scan, float ascii, float shift) if(MapInfo_FindName_firstResult >= 0) me.setSelected(me, MapInfo_FindName_firstResult); } + else if(shift & S_CTRL && scan == 'f') // ctrl-f (as in "F"ind) + { + me.parent.setFocus(me.parent, me.stringFilterBox); + } + else if(shift & S_CTRL && scan == 'u') // ctrl-u (remove stringFilter line + { + me.stringFilterBox.setText(me.stringFilterBox, ""); + MapList_StringFilterBox_Change(me.stringFilterBox, me); + } else return SUPER(XonoticMapList).keyDown(me, scan, ascii, shift); return 1; } +float MapList_StringFilterBox_keyDown(entity me, float scan, float ascii, float shift) +{ + // in this section, note that onChangeEntity has the ref to mapListBox + // we make use of that, instead of extending a class to add one more attrib + switch(scan) + { + case K_KP_ENTER: + case K_ENTER: + // move the focus to the mapListBox + me.onChangeEntity.parent.setFocus(me.onChangeEntity.parent, me.onChangeEntity); + return 1; + case K_KP_UPARROW: + case K_UPARROW: + case K_KP_DOWNARROW: + case K_DOWNARROW: + // pass the event to the mapListBox (to scroll up and down) + return me.onChangeEntity.keyDown(me.onChangeEntity, scan, ascii, shift); + } + return SUPER(XonoticInputBox).keyDown(me, scan, ascii, shift); +} #endif