X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fmenu%2Fxonotic%2Fdemolist.c;h=f2e209ca4d2b38190cdc64ec1f382f4756e4569d;hb=2d826438b2ebd36c678772891253184fc7d483ff;hp=cf0e987c0a475dc34fbe920dfc9fa5cd9b6c3686;hpb=31bf64ba7821ebb5c0aba8a154472810074ed11e;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/menu/xonotic/demolist.c b/qcsrc/menu/xonotic/demolist.c index cf0e987c0..f2e209ca4 100644 --- a/qcsrc/menu/xonotic/demolist.c +++ b/qcsrc/menu/xonotic/demolist.c @@ -6,6 +6,7 @@ CLASS(XonoticDemoList) EXTENDS(XonoticListBox) METHOD(XonoticDemoList, drawListBoxItem, void(entity, float, vector, float)) METHOD(XonoticDemoList, getDemos, void(entity)) METHOD(XonoticDemoList, startDemo, void(entity)) + METHOD(XonoticDemoList, timeDemo, void(entity)) METHOD(XonoticDemoList, demoName, string(entity, float)) METHOD(XonoticDemoList, clickListBoxItem, void(entity, float, vector)) METHOD(XonoticDemoList, keyDown, float(entity, float, float, float)) @@ -25,9 +26,9 @@ CLASS(XonoticDemoList) EXTENDS(XonoticListBox) ATTRIB(XonoticDemoList, filterString, string, string_null) ENDCLASS(XonoticDemoList) +entity demolist; // for reference elsewhere entity makeXonoticDemoList(); -void StartDemo_Click(entity btn, entity me); -void TimeDemo_Click(entity btn, entity me); +void DemoList_Refresh_Click(entity btn, entity me); void DemoList_Filter_Change(entity box, entity me); #endif @@ -47,40 +48,75 @@ void XonoticDemoList_configureXonoticDemoList(entity me) me.getDemos(me); } -string XonoticDemoList_demoName(entity me, float i ) +string XonoticDemoList_demoName(entity me, float i) { string s; - s = search_getfilename(me.listDemo, i); - s = substring(s, 6, strlen(s) - 6 - 4); // demos/, .dem + s = bufstr_get(me.listDemo, i); + + if(substring(s, 0, 1) == "/") + s = substring(s, 1, strlen(s) - 1); // remove the first forward slash + return s; } - -void XonoticDemoList_getDemos(entity me) +// if subdir is TRUE look in subdirectories too (1 level) +void getDemos_for_ext(entity me, string ext, float subdir) { string s; - + if (subdir) + s="demos/*/"; + else + s="demos/"; if(me.filterString) - //subdirectory in filterString allowed - s=strcat("demos/*", me.filterString, "*.dem"); + s=strcat(s, me.filterString, ext); else - s="demos/*.dem"; - - //dprint("Search demos with the pattern ", s, "\n"); - if(me.listDemo >= 0) - search_end(me.listDemo); + s=strcat(s, "*", ext); + + float list, i, n; + list = search_begin(s, FALSE, TRUE); + if(list >= 0) + { + n = search_getsize(list); + for(i = 0; i < n; ++i) + { + s = search_getfilename(list, i); // get initial full file name + s = substring(s, 6, (strlen(s) - 6 - 4)); // remove "demos/" prefix and ".dem" suffix + s = strdecolorize(s); // remove any pre-existing colors + if(subdir) + { + s = strreplace("/", "^7/", s); // clear colors at the forward slash + s = strcat("/", rgb_to_hexcolor(SKINCOLOR_DEMOLIST_SUBDIR), s); // add a forward slash for sorting, then color + bufstr_add(me.listDemo, s, TRUE); + } + else { bufstr_add(me.listDemo, s, TRUE); } + } + search_end(list); + } - me.listDemo = search_begin(s, FALSE, TRUE); + if (subdir) + getDemos_for_ext(me, ext, FALSE); +} - if(me.listDemo < 0) - me.nItems=0; - else - me.nItems=search_getsize(me.listDemo); +void XonoticDemoList_getDemos(entity me) +{ + if (me.listDemo >= 0) + buf_del(me.listDemo); + me.listDemo = buf_create(); + if (me.listDemo < 0) + { + me.nItems = 0; + return; + } + getDemos_for_ext(me, ".dem", TRUE); + me.nItems = buf_getsize(me.listDemo); + if(me.nItems > 0) + buf_sort(me.listDemo, 128, FALSE); } void XonoticDemoList_destroy(entity me) { - search_end(me.listDemo); + if(me.nItems > 0) + buf_del(me.listDemo); } void XonoticDemoList_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize) @@ -104,7 +140,7 @@ void XonoticDemoList_drawListBoxItem(entity me, float i, vector absSize, float i s = me.demoName(me,i); s = draw_TextShortenToWidth(s, me.columnNameSize, 0, me.realFontSize); - draw_Text(me.realUpperMargin * eY + (me.columnNameOrigin + 0.00 * (me.columnNameSize - draw_TextWidth(s, 0, me.realFontSize))) * eX, s, me.realFontSize, SKINCOLOR_TEXT, SKINALPHA_TEXT, 0); + draw_Text(me.realUpperMargin * eY + (me.columnNameOrigin + 0.00 * (me.columnNameSize - draw_TextWidth(s, 0, me.realFontSize))) * eX, s, me.realFontSize, SKINCOLOR_TEXT, SKINALPHA_TEXT, 1); } void XonoticDemoList_showNotify(entity me) @@ -112,13 +148,24 @@ void XonoticDemoList_showNotify(entity me) me.getDemos(me); } +void DemoList_Refresh_Click(entity btn, entity me) +{ + me.getDemos(me); + me.setSelected(me, 0); //always select the first element after a list update +} + void DemoList_Filter_Change(entity box, entity me) { if(me.filterString) strunzone(me.filterString); if(box.text != "") - me.filterString = strzone(box.text); + { + if (strstrofs(box.text, "*", 0) >= 0 || strstrofs(box.text, "?", 0) >= 0) + me.filterString = strzone(box.text); + else + me.filterString = strzone(strcat("*", box.text, "*")); + } else me.filterString = string_null; @@ -128,20 +175,36 @@ void DemoList_Filter_Change(entity box, entity me) void XonoticDemoList_startDemo(entity me) { string s; - s = me.demoName(me,me.selectedItem); + s = me.demoName(me, me.selectedItem); + s = strdecolorize(s); + localcmd("playdemo \"demos/", s, ".dem\" \nwait \ntogglemenu\n"); } -void StartDemo_Click(entity btn, entity me) +void XonoticDemoList_timeDemo(entity me) { - me.startDemo(me); + string s; + s = me.demoName(me, me.selectedItem); + s = strdecolorize(s); + + localcmd("timedemo \"demos/", s, ".dem\" \nwait \ntogglemenu\n"); } -void TimeDemo_Click(entity btn, entity me) +void DemoConfirm_ListClick_Check_Gamestatus(entity me) { - string s; - s = me.demoName(me,me.selectedItem); - localcmd("timedemo \"demos/", s, ".dem\" \nwait \ntogglemenu\n"); + if(!(gamestatus & (GAME_CONNECTED | GAME_ISSERVER))) // we're not in a match, lets watch the demo + { + me.startDemo(me); + } + else // already in a match, player has to confirm + { + DialogOpenButton_Click_withCoords( + me, + main.demostartconfirmDialog, + boxToGlobal(eY * (me.selectedItem * me.itemHeight - me.scrollPos), me.origin, me.size), + boxToGlobalSize(eY * me.itemHeight + eX * (1 - me.controlWidth), me.size) + ); + } } void XonoticDemoList_clickListBoxItem(entity me, float i, vector where) @@ -151,7 +214,7 @@ void XonoticDemoList_clickListBoxItem(entity me, float i, vector where) { // DOUBLE CLICK! me.setSelected(me, i); - me.startDemo(me); + DemoConfirm_ListClick_Check_Gamestatus(me); } me.lastClickedDemo = i; me.lastClickedTime = time; @@ -159,12 +222,15 @@ void XonoticDemoList_clickListBoxItem(entity me, float i, vector where) float XonoticDemoList_keyDown(entity me, float scan, float ascii, float shift) { - if(scan == K_ENTER || scan == K_KP_ENTER) { - me.startDemo(me); + if(scan == K_ENTER || scan == K_KP_ENTER) + { + DemoConfirm_ListClick_Check_Gamestatus(me); return 1; } else + { return SUPER(XonoticDemoList).keyDown(me, scan, ascii, shift); + } } #endif