From c57d34bc0b3ee16ca894caf27887b55c20adb123 Mon Sep 17 00:00:00 2001 From: div0 Date: Sun, 26 Oct 2008 18:27:00 +0000 Subject: [PATCH] improve skin selector git-svn-id: svn://svn.icculus.org/nexuiz/trunk@4892 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/qcsrc/menu/menu.qc | 38 ++++- data/qcsrc/menu/nexuiz/dialog_settings.c | 1 - data/qcsrc/menu/nexuiz/dialog_settings_misc.c | 12 +- data/qcsrc/menu/nexuiz/mainwindow.c | 3 +- data/qcsrc/menu/nexuiz/skinlist.c | 139 ++++++++++-------- 5 files changed, 116 insertions(+), 77 deletions(-) diff --git a/data/qcsrc/menu/menu.qc b/data/qcsrc/menu/menu.qc index 97cd407d8..c7299be3e 100644 --- a/data/qcsrc/menu/menu.qc +++ b/data/qcsrc/menu/menu.qc @@ -408,6 +408,33 @@ void() m_shutdown = } }; +void m_activate_window(entity wnd) +{ + entity par; + par = wnd.parent; + if(par) + m_activate_window(par); + + if(par.instanceOfModalController) + { + // tabs + par.initializeDialog(par, wnd); + } + else if(par.instanceOfNexposee) + { + // nexposee (sorry for violating abstraction here) + par.selectedChild = wnd; + par.animationState = 1; + setFocusContainer(par, NULL); + } + else if(par.instanceOfContainer) + { + // other containers + if(par.focused) + par.setFocus(par, wnd); + } +} + void(string itemname) m_goto = { entity e; @@ -419,17 +446,17 @@ void(string itemname) m_goto = m_hide(); else { - main.initializeDialog(main, main.firstChild); + m_activate_window(main.mainNexposee); m_display(); } } else { e = findstring(NULL, name, itemname); - if(e && e.parent == main) + if(e) { m_hide(); - main.initializeDialog(main, e); + m_activate_window(e); m_display(); } } @@ -440,8 +467,5 @@ void() m_goto_skin_selector = if(!menuInitialized) return; // TODO add code to switch back to the skin selector (no idea how to do it now) - m_hide(); - //main.initializeDialog(main, main.firstChild); - //main.firstChild.setFocus(main.firstChild, findstring(NULL, name, "__skinselect_window")); - m_display(); + m_goto("skinselector"); } diff --git a/data/qcsrc/menu/nexuiz/dialog_settings.c b/data/qcsrc/menu/nexuiz/dialog_settings.c index 4d59e69c6..d4f897b15 100644 --- a/data/qcsrc/menu/nexuiz/dialog_settings.c +++ b/data/qcsrc/menu/nexuiz/dialog_settings.c @@ -6,7 +6,6 @@ CLASS(NexuizSettingsDialog) EXTENDS(NexuizDialog) ATTRIB(NexuizSettingsDialog, intendedWidth, float, 0.96) ATTRIB(NexuizSettingsDialog, rows, float, 17) ATTRIB(NexuizSettingsDialog, columns, float, 6) - ATTRIB(NexuizSettingsDialog, name, string, "__skinselect_window") ENDCLASS(NexuizSettingsDialog) #endif diff --git a/data/qcsrc/menu/nexuiz/dialog_settings_misc.c b/data/qcsrc/menu/nexuiz/dialog_settings_misc.c index f6f76e0f8..67c96db38 100644 --- a/data/qcsrc/menu/nexuiz/dialog_settings_misc.c +++ b/data/qcsrc/menu/nexuiz/dialog_settings_misc.c @@ -5,7 +5,6 @@ CLASS(NexuizMiscSettingsTab) EXTENDS(NexuizTab) ATTRIB(NexuizMiscSettingsTab, intendedWidth, float, 0.9) ATTRIB(NexuizMiscSettingsTab, rows, float, 15) ATTRIB(NexuizMiscSettingsTab, columns, float, 6.5) - ENDCLASS(NexuizMiscSettingsTab) entity makeNexuizMiscSettingsTab(); #endif @@ -28,16 +27,11 @@ void fillNexuizMiscSettingsTab(entity me) me.TR(me); me.TD(me, me.rows - 2, 3, sk = makeNexuizSkinList()); me.gotoRC(me, me.rows - 1, 0); - me.TDempty(me, 0.5); - me.TD(me, 1, 2, e = makeNexuizButton("Apply", '0 0 0')); - e.onClick = setSkin; + me.TD(me, 1, 3, e = makeNexuizButton("Apply immediately", '0 0 0')); + e.onClick = SetSkin_Click; e.onClickEntity = sk; - me.TDempty(me, 0.5); - - me.gotoRC(me, 0, 3.5); me.setFirstColumn(me, me.currentColumn); - me.TD(me, 1, 3, e = makeNexuizCheckBox(0, "cl_autodemo", "Demo recording")); me.TR(me); me.TR(me); @@ -58,7 +52,5 @@ void fillNexuizMiscSettingsTab(entity me) me.TD(me, 1, 2.8/3, e = makeNexuizRadioButton(1, "showspeed", "3", "km/h")); me.TD(me, 1, 2.8/3, e = makeNexuizRadioButton(1, "showspeed", "4", "mph")); me.TD(me, 1, 2.8/3, e = makeNexuizRadioButton(1, "showspeed", "5", "knots")); - - } #endif diff --git a/data/qcsrc/menu/nexuiz/mainwindow.c b/data/qcsrc/menu/nexuiz/mainwindow.c index ed915feb5..0d506d5bd 100644 --- a/data/qcsrc/menu/nexuiz/mainwindow.c +++ b/data/qcsrc/menu/nexuiz/mainwindow.c @@ -7,6 +7,7 @@ CLASS(MainWindow) EXTENDS(ModalController) ATTRIB(MainWindow, userbindEditDialog, entity, NULL) ATTRIB(MainWindow, winnerDialog, entity, NULL) ATTRIB(MainWindow, radarDialog, entity, NULL) + ATTRIB(MainWindow, mainNexposee, entity, NULL) ATTRIB(MainWindow, fadedAlpha, float, SKINALPHA_BEHIND) ENDCLASS(MainWindow) #endif @@ -53,7 +54,7 @@ void configureMainWindowMainWindow(entity me) i.configureDialog(i); me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z); - n = spawnNexuizNexposee(); + me.mainNexposee = n = spawnNexuizNexposee(); /* if(checkextension("DP_GECKO_SUPPORT")) { diff --git a/data/qcsrc/menu/nexuiz/skinlist.c b/data/qcsrc/menu/nexuiz/skinlist.c index 423dd53f2..f16ee8395 100644 --- a/data/qcsrc/menu/nexuiz/skinlist.c +++ b/data/qcsrc/menu/nexuiz/skinlist.c @@ -2,27 +2,34 @@ CLASS(NexuizSkinList) EXTENDS(NexuizListBox) METHOD(NexuizSkinList, configureNexuizSkinList, void(entity)) ATTRIB(NexuizSkinList, rowsPerItem, float, 4) - METHOD(NexuizMapList, resizeNotify, void(entity, vector, vector, vector, vector)) - METHOD(NexuizSkinList, draw, void(entity)) + METHOD(NexuizSkinList, resizeNotify, void(entity, vector, vector, vector, vector)) METHOD(NexuizSkinList, drawListBoxItem, void(entity, float, vector, float)) METHOD(NexuizSkinList, getSkins, void(entity)) + METHOD(NexuizSkinList, setSkin, void(entity)) + METHOD(NexuizSkinList, loadCvars, void(entity)) + METHOD(NexuizSkinList, saveCvars, void(entity)) + METHOD(NexuizSkinList, skinName, string(entity, float)) + METHOD(NexuizSkinList, clickListBoxItem, void(entity, float, vector)) + METHOD(NexuizSkinList, keyDown, float(entity, float, float, float)) - ATTRIB(NexuizSkinList, currentskin, string, "") - ATTRIB(NexuizSkinList, skinlist, string, "") + ATTRIB(NexuizSkinList, skinlist, float, -1) ATTRIB(NexuizSkinList, realFontSize, vector, '0 0 0') ATTRIB(NexuizSkinList, columnPreviewOrigin, float, 0) ATTRIB(NexuizSkinList, columnPreviewSize, float, 0) ATTRIB(NexuizSkinList, columnNameOrigin, float, 0) ATTRIB(NexuizSkinList, columnNameSize, float, 0) - ATTRIB(NexuizSkinList, checkMarkOrigin, vector, '0 0 0') - ATTRIB(NexuizSkinList, checkMarkSize, vector, '0 0 0') - ATTRIB(NexuizSkinList, realUpperMargin1, float, 0) + ATTRIB(NexuizSkinList, realUpperMargin, float, 0) ATTRIB(NexuizSkinList, origin, vector, '0 0 0') ATTRIB(NexuizSkinList, itemAbsSize, vector, '0 0 0') + + ATTRIB(NexuizSkinList, lastClickedSkin, float, -1) + ATTRIB(NexuizSkinList, lastClickedTime, float, 0) + + ATTRIB(NexuizMiscSettingsTab, name, string, "skinselector") ENDCLASS(NexuizSkinList) entity makeNexuizSkinList(); -void setSkin(entity btn, entity me); +void SetSkin_Click(entity btn, entity me); #endif #ifdef IMPLEMENTATION @@ -39,30 +46,44 @@ void configureNexuizSkinListNexuizSkinList(entity me) { me.configureNexuizListBox(me); me.getSkins(me); - me.currentskin = strzone(cvar_string("menu_skin")); + me.loadCvars(me); } -void getSkinsNexuizSkinList(entity me) +void loadCvarsNexuizSkinList(entity me) { - float glob,i; - string s,_skinlist; - - glob = search_begin("gfx/menu/*/skinvalues.txt", TRUE, TRUE); - if(glob < 0) - return; - for (i=0 ; i < search_getsize(glob) ; ++i) + string s; + float i, n; + s = cvar_string("menu_skin"); + n = me.nItems; + for(i = 0; i < n; ++i) { - s=search_getfilename(glob, i); - // s contain gfx/menu/skinname/skinvalues.txt - if ( tokenizebyseparator(s, "/") == 4 ) - // add skinname to _skinlist, manage skinname with separates words - _skinlist=strcat(_skinlist, "\"", argv(2), "\"", " "); + if(me.skinName(me, i) == s) + { + me.selectedItem = i; + break; + } } +} + +void saveCvarsNexuizSkinList(entity me) +{ + cvar_set("menu_skin", me.skinName(me, me.selectedItem)); +} - me.nItems = i; - me.skinlist = strzone(_skinlist); +string skinNameNexuizSkinList(entity me, float i) +{ + string s; + s = search_getfilename(me.skinlist, i); + s = substring(s, 9, strlen(s) - 9 - 15); // gfx/menu/, skinvalues.txt + return s; +} + +void getSkinsNexuizSkinList(entity me) +{ + float glob,i; - search_end(glob); + me.skinlist = search_begin("gfx/menu/*/skinvalues.txt", TRUE, TRUE); + me.nItems = search_getsize(me.skinlist); } void resizeNotifyNexuizSkinList(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize) @@ -73,58 +94,60 @@ void resizeNotifyNexuizSkinList(entity me, vector relOrigin, vector relSize, vec me.realFontSize_y = me.fontSize / (me.itemAbsSize_y = (absSize_y * me.itemHeight)); me.realFontSize_x = me.fontSize / (me.itemAbsSize_x = (absSize_x * (1 - me.controlWidth))); - me.realUpperMargin1 = 0.5 * (1 - 2.5 * me.realFontSize_y); - me.realUpperMargin2 = me.realUpperMargin1 + 1.5 * me.realFontSize_y; + me.realUpperMargin = 0.5 * (1 - me.realFontSize_y); me.columnPreviewOrigin = 0; me.columnPreviewSize = me.itemAbsSize_y / me.itemAbsSize_x * 4 / 3; me.columnNameOrigin = me.columnPreviewOrigin + me.columnPreviewSize + me.realFontSize_x; me.columnNameSize = 1 - me.columnPreviewSize - 2 * me.realFontSize_x; - - me.checkMarkSize = (eX * (me.itemAbsSize_y / me.itemAbsSize_x) + eY) * 0.5; - me.checkMarkOrigin = eY + eX * (me.columnPreviewOrigin + me.columnPreviewSize) - me.checkMarkSize; -} - -void drawNexuizSkinList(entity me) -{ - drawListBox(me); } void drawListBoxItemNexuizSkinList(entity me, float i, vector absSize, float isSelected) { - string s; float theAlpha; - tokenize_sane(me.skinlist); - if(isSelected) draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED); - if( me.currentskin == argv(i) ) - draw_Fill('0 0 0', '1 1 0', SKINCOLOR_MAPLIST_INCLUDEDBG, SKINALPHA_MAPLIST_INCLUDEDBG); - - theAlpha = SKINALPHA_MAPLIST_INCLUDEDFG; - - draw_Picture(me.columnPreviewOrigin * eX, strcat("/gfx/menu/", argv(i), "/skinpreview"), me.columnPreviewSize * eX + eY, '1 1 1', theAlpha); - - s = draw_TextShortenToWidth(argv(i), me.columnNameSize / me.realFontSize_x, 0); - draw_Text(me.realUpperMargin1 * eY + (me.columnNameOrigin + 0.00 * (me.columnNameSize - draw_TextWidth(s, 0) * me.realFontSize_x)) * eX, s, me.realFontSize, SKINCOLOR_MAPLIST_TITLE, theAlpha, 0); + s = me.skinName(me, i); + draw_Picture(me.columnPreviewOrigin * eX, strcat("/gfx/menu/", s, "/skinpreview"), me.columnPreviewSize * eX + eY, '1 1 1', 1); + s = draw_TextShortenToWidth(s, me.columnNameSize / me.realFontSize_x, 0); + draw_Text(me.realUpperMargin * eY + (me.columnNameOrigin + 0.00 * (me.columnNameSize - draw_TextWidth(s, 0) * me.realFontSize_x)) * eX, s, me.realFontSize, '1 1 1', SKINALPHA_TEXT, 0); } -void setSkin(entity btn, entity me) +void setSkinNexuizSkinList(entity me) { - float i; - - i = me.selectedItem; - - if(i >= me.nItems || i < 0) - return; - - tokenize_sane(me.skinlist); - cvar_set("menu_skin", argv(i)); - localcmd("\nmenu_restart\ntogglemenu\ndefer 1 \"menu_cmd skinselect\"\n"); + me.saveCvars(me); + localcmd("\nmenu_restart\ntogglemenu\ndefer 0.1 \"menu_cmd skinselect\"\n"); +} +void SetSkin_Click(entity btn, entity me) +{ + me.setSkin(me); +} + +void clickListBoxItemNexuizSkinList(entity me, float i, vector where) +{ + if(i == me.lastClickedSkin) + if(time < me.lastClickedTime + 0.3) + { + // DOUBLE CLICK! + me.setSelected(me, i); + me.setSkin(me); + } + me.lastClickedSkin = i; + me.lastClickedTime = time; +} + +float keyDownNexuizSkinList(entity me, float scan, float ascii, float shift) +{ + if(scan == K_ENTER) { + me.setSkin(me); + return 1; + } + else + return keyDownListBox(me, scan, ascii, shift); } #endif -- 2.39.2