]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'master' into terencehill/menu_listbox_changes
authorterencehill <piuntn@gmail.com>
Sat, 1 Aug 2015 20:18:20 +0000 (22:18 +0200)
committerterencehill <piuntn@gmail.com>
Sat, 1 Aug 2015 20:18:20 +0000 (22:18 +0200)
qcsrc/menu/item/listbox.qc
qcsrc/menu/xonotic/campaign.qc
qcsrc/menu/xonotic/credits.qc
qcsrc/menu/xonotic/dialog_singleplayer.qc
qcsrc/menu/xonotic/languagelist.qc
qcsrc/menu/xonotic/playerlist.qc
qcsrc/menu/xonotic/screenshotlist.qc
qcsrc/menu/xonotic/serverlist.qc
qcsrc/menu/xonotic/skinlist.qc
qcsrc/menu/xonotic/statslist.qc
qcsrc/menu/xonotic/weaponslist.qc

index f7c17fa6bd888a73e580f825c81c077467d230a5..1940e324f27b0fa3174bbaf1db2652cf13292c25 100644 (file)
@@ -14,11 +14,15 @@ CLASS(ListBox, Item)
        ATTRIB(ListBox, focusable, float, 1)
        ATTRIB(ListBox, focusedItem, int, -1)
        ATTRIB(ListBox, focusedItemAlpha, float, 0.3)
+       ATTRIB(ListBox, mouseMoveOffset, float, -1) // let know where the cursor is when the list scrolls without moving the cursor
        ATTRIB(ListBox, allowFocusSound, float, 1)
        ATTRIB(ListBox, selectedItem, int, 0)
        ATTRIB(ListBox, size, vector, '0 0 0')
        ATTRIB(ListBox, origin, vector, '0 0 0')
        ATTRIB(ListBox, scrollPos, float, 0) // measured in window heights, fixed when needed
+       ATTRIB(ListBox, scrollPosTarget, float, 0)
+       ATTRIB(ListBox, needScrollToItem, float, -1)
+       METHOD(ListBox, scrollToItem, void(entity, int))
        ATTRIB(ListBox, previousValue, float, 0)
        ATTRIB(ListBox, pressed, float, 0) // 0 = normal, 1 = scrollbar dragging, 2 = item dragging, 3 = released
        ATTRIB(ListBox, pressOffset, float, 0)
@@ -27,8 +31,8 @@ CLASS(ListBox, Item)
        ATTRIB(ListBox, controlTop, float, 0)
        ATTRIB(ListBox, controlBottom, float, 0)
        ATTRIB(ListBox, controlWidth, float, 0)
-       ATTRIB(ListBox, dragScrollTimer, float, 0)
        ATTRIB(ListBox, dragScrollPos, vector, '0 0 0')
+       ATTRIB(ListBox, selectionDoesntMatter, bool, false) // improves scrolling by keys for lists that don't need to show an active selection
 
        ATTRIB(ListBox, src, string, string_null) // scrollbar
        ATTRIB(ListBox, color, vector, '1 1 1')
@@ -80,9 +84,40 @@ ENDCLASS(ListBox)
 #endif
 
 #ifdef IMPLEMENTATION
+void ListBox_scrollToItem(entity me, int i)
+{
+       // scroll doesn't work properly until itemHeight is set to the correct value
+       // at the first resizeNotify call
+       if(me.itemHeight == 1) // initial temporary value of itemHeight is 1
+       {
+               me.needScrollToItem = i;
+               return;
+       }
+
+       i = bound(0, i, me.nItems - 1);
+
+       // scroll the list to make sure the selected item is visible
+       // (even if the selected item doesn't change).
+       if(i < me.getFirstFullyVisibleItemAtScrollPos(me, me.scrollPos))
+       {
+               // above visible area
+               me.scrollPosTarget = me.getItemStart(me, i);
+       }
+       else if(i > me.getLastFullyVisibleItemAtScrollPos(me, me.scrollPos))
+       {
+               // below visible area
+               if(i == me.nItems - 1)
+                       me.scrollPosTarget = me.getTotalHeight(me) - 1;
+               else
+                       me.scrollPosTarget = me.getItemStart(me, i + 1) - 1;
+       }
+}
+
 void ListBox_setSelected(entity me, float i)
 {
-       me.selectedItem = bound(0, i, me.nItems - 1);
+       i = bound(0, i, me.nItems - 1);
+       me.scrollToItem(me, i);
+       me.selectedItem = i;
 }
 void ListBox_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
 {
@@ -114,27 +149,30 @@ float ListBox_getItemHeight(entity me, float i)
 
 float ListBox_getLastFullyVisibleItemAtScrollPos(entity me, float pos)
 {
-       return me.getItemAtPos(me, pos + 1.001) - 1;
+       return me.getItemAtPos(me, pos + 0.999) - 1;
 }
 float ListBox_getFirstFullyVisibleItemAtScrollPos(entity me, float pos)
 {
-       return me.getItemAtPos(me, pos - 0.001) + 1;
+       return me.getItemAtPos(me, pos + 0.001) + 1;
 }
 float ListBox_keyDown(entity me, float key, float ascii, float shift)
 {
-       me.dragScrollTimer = time;
        if(key == K_MWHEELUP)
        {
-               me.scrollPos = max(me.scrollPos - 0.5, 0);
-               me.setSelected(me, min(me.selectedItem, me.getLastFullyVisibleItemAtScrollPos(me, me.scrollPos)));
+               me.scrollPosTarget = max(me.scrollPosTarget - 0.5, 0);
        }
        else if(key == K_MWHEELDOWN)
        {
-               me.scrollPos = min(me.scrollPos + 0.5, me.getTotalHeight(me) - 1);
-               me.setSelected(me, max(me.selectedItem, me.getFirstFullyVisibleItemAtScrollPos(me, me.scrollPos)));
+               me.scrollPosTarget = min(me.scrollPosTarget + 0.5, me.getTotalHeight(me) - 1);
        }
        else if(key == K_PGUP || key == K_KP_PGUP)
        {
+               if(me.selectionDoesntMatter)
+               {
+                       me.scrollPosTarget = max(me.scrollPosTarget - 0.5, 0);
+                       return 1;
+               }
+
                float i = me.selectedItem;
                float a = me.getItemHeight(me, i);
                for (;;)
@@ -150,6 +188,12 @@ float ListBox_keyDown(entity me, float key, float ascii, float shift)
        }
        else if(key == K_PGDN || key == K_KP_PGDN)
        {
+               if(me.selectionDoesntMatter)
+               {
+                       me.scrollPosTarget = min(me.scrollPosTarget + 0.5, me.nItems * me.itemHeight - 1);
+                       return 1;
+               }
+
                float i = me.selectedItem;
                float a = me.getItemHeight(me, i);
                for (;;)
@@ -164,43 +208,52 @@ float ListBox_keyDown(entity me, float key, float ascii, float shift)
                me.setSelected(me, i - 1);
        }
        else if(key == K_UPARROW || key == K_KP_UPARROW)
+       {
+               if(me.selectionDoesntMatter)
+               {
+                       me.scrollPosTarget = max(me.scrollPosTarget - me.itemHeight, 0);
+                       return 1;
+               }
+
                me.setSelected(me, me.selectedItem - 1);
+       }
        else if(key == K_DOWNARROW || key == K_KP_DOWNARROW)
+       {
+               if(me.selectionDoesntMatter)
+               {
+                       me.scrollPosTarget = min(me.scrollPosTarget + me.itemHeight, me.nItems * me.itemHeight - 1);
+                       return 1;
+               }
+
                me.setSelected(me, me.selectedItem + 1);
+       }
        else if(key == K_HOME || key == K_KP_HOME)
-       {
-               me.scrollPos = 0;
                me.setSelected(me, 0);
-       }
        else if(key == K_END || key == K_KP_END)
-       {
-               me.scrollPos = max(0, me.getTotalHeight(me) - 1);
                me.setSelected(me, me.nItems - 1);
-       }
        else
                return 0;
        return 1;
 }
 float ListBox_mouseMove(entity me, vector pos)
 {
+       me.mouseMoveOffset = -1;
        if(pos_x < 0) return 0;
        if(pos_y < 0) return 0;
        if(pos_x >= 1) return 0;
        if(pos_y >= 1) return 0;
        if(pos_x < 1 - me.controlWidth)
+               me.mouseMoveOffset = pos.y;
+       else
        {
-               float x;
-               x = me.focusedItem;
-               me.focusedItem = me.getItemAtPos(me, me.scrollPos + pos.y);
-               if(x != me.focusedItem)
-                       me.focusedItemAlpha = SKINALPHA_LISTBOX_FOCUSED;
+               me.focusedItem = -1;
+               me.mouseMoveOffset = -1;
        }
        return 1;
 }
 float ListBox_mouseDrag(entity me, vector pos)
 {
        float hit;
-       float i;
        me.updateControlTopBottom(me);
        me.dragScrollPos = pos;
        if(me.pressed == 1)
@@ -215,19 +268,18 @@ float ListBox_mouseDrag(entity me, vector pos)
                        // calculate new pos to v
                        float d;
                        d = (pos.y - me.pressOffset) / (1 - (me.controlBottom - me.controlTop)) * (me.getTotalHeight(me) - 1);
-                       me.scrollPos = me.previousValue + d;
+                       me.scrollPosTarget = me.previousValue + d;
                }
                else
-                       me.scrollPos = me.previousValue;
-               me.scrollPos = min(me.scrollPos, me.getTotalHeight(me) - 1);
-               me.scrollPos = max(me.scrollPos, 0);
-               i = min(me.selectedItem, me.getLastFullyVisibleItemAtScrollPos(me, me.scrollPos));
-               i = max(i, ListBox_getFirstFullyVisibleItemAtScrollPos(me, me.scrollPos));
-               me.setSelected(me, i);
+                       me.scrollPosTarget = me.previousValue;
+               me.scrollPosTarget = min(me.scrollPosTarget, me.getTotalHeight(me) - 1);
+               me.scrollPosTarget = max(me.scrollPosTarget, 0);
        }
        else if(me.pressed == 2)
        {
                me.setSelected(me, me.getItemAtPos(me, me.scrollPos + pos.y));
+               me.focusedItem = me.selectedItem;
+               me.mouseMoveOffset = -1;
        }
        return 1;
 }
@@ -239,21 +291,18 @@ float ListBox_mousePress(entity me, vector pos)
        if(pos.y >= 1) return 0;
        me.dragScrollPos = pos;
        me.updateControlTopBottom(me);
-       me.dragScrollTimer = time;
        if(pos.x >= 1 - me.controlWidth)
        {
                // if hit, set me.pressed, otherwise scroll by one page
                if(pos.y < me.controlTop)
                {
                        // page up
-                       me.scrollPos = max(me.scrollPos - 1, 0);
-                       me.setSelected(me, min(me.selectedItem, ListBox_getLastFullyVisibleItemAtScrollPos(me, me.scrollPos)));
+                       me.scrollPosTarget = max(me.scrollPosTarget - 1, 0);
                }
                else if(pos.y > me.controlBottom)
                {
                        // page down
-                       me.scrollPos = min(me.scrollPos + 1, me.getTotalHeight(me) - 1);
-                       me.setSelected(me, max(me.selectedItem, ListBox_getFirstFullyVisibleItemAtScrollPos(me, me.scrollPos)));
+                       me.scrollPosTarget = min(me.scrollPosTarget + 1, me.getTotalHeight(me) - 1);
                }
                else
                {
@@ -268,6 +317,7 @@ float ListBox_mousePress(entity me, vector pos)
                me.pressed = 2;
                // an item has been clicked. Select it, ...
                me.setSelected(me, me.getItemAtPos(me, me.scrollPos + pos.y));
+               me.focusedItem = me.selectedItem;
        }
        return 1;
 }
@@ -284,6 +334,7 @@ float ListBox_mouseRelease(entity me, vector pos)
                // item dragging mode
                // select current one one last time...
                me.setSelected(me, me.getItemAtPos(me, me.scrollPos + pos.y));
+               me.focusedItem = me.selectedItem;
                // and give it a nice click event
                if(me.nItems > 0)
                {
@@ -308,6 +359,7 @@ void ListBox_focusLeave(entity me)
        // for example showing a dialog on right click
        me.pressed = 0;
        me.focusedItem = -1;
+       me.mouseMoveOffset = -1;
 }
 void ListBox_updateControlTopBottom(entity me)
 {
@@ -322,20 +374,6 @@ void ListBox_updateControlTopBottom(entity me)
        }
        else
        {
-               if(frametime) // only do this in draw frames
-               {
-                       if(me.dragScrollTimer < time)
-                       {
-                               float save;
-                               save = me.scrollPos;
-                               // if selected item is below listbox, increase scrollpos so it is in
-                               me.scrollPos = max(me.scrollPos, me.getItemStart(me, me.selectedItem) + me.getItemHeight(me, me.selectedItem) - 1);
-                               // if selected item is above listbox, decrease scrollpos so it is in
-                               me.scrollPos = min(me.scrollPos, me.getItemStart(me, me.selectedItem));
-                               if(me.scrollPos != save)
-                                       me.dragScrollTimer = time + 0.2;
-                       }
-               }
                // if scroll pos is below end of list, fix it
                me.scrollPos = min(me.scrollPos, me.getTotalHeight(me) - 1);
                // if scroll pos is above beginning of list, fix it
@@ -364,6 +402,33 @@ void ListBox_draw(entity me)
        float i;
        vector absSize, fillSize = '0 0 0';
        vector oldshift, oldscale;
+
+       // we can't do this in mouseMove as the list can scroll without moving the cursor
+       float focusedItem_save = me.focusedItem;
+       if(me.mouseMoveOffset != -1)
+               me.focusedItem = me.getItemAtPos(me, me.scrollPos + me.mouseMoveOffset);
+       if(me.focusedItem >= 0)
+       if(focusedItem_save != me.focusedItem)
+               me.focusedItemAlpha = SKINALPHA_LISTBOX_FOCUSED;
+
+       if(me.needScrollToItem >= 0)
+       {
+               me.scrollToItem(me, me.needScrollToItem);
+               me.needScrollToItem = -1;
+       }
+       if(me.scrollPos != me.scrollPosTarget)
+       {
+               float PI = 3.1415926535897932384626433832795028841971693993751058209749445923;
+               float exp_factor = 0.65;
+               if(me.pressed == 1)
+                       exp_factor = 0.45; // scroll faster while dragging the scrollbar
+               // this formula works with whatever framerate
+               float f = sin(PI / 2 * pow(frametime, exp_factor));
+               me.scrollPos = me.scrollPos * (1 - f) + me.scrollPosTarget * f;
+               if(fabs(me.scrollPos - me.scrollPosTarget) < 0.001)
+                       me.scrollPos = me.scrollPosTarget;
+       }
+
        if(me.pressed == 2)
                me.mouseDrag(me, me.dragScrollPos); // simulate mouseDrag event
        me.updateControlTopBottom(me);
index e30c038a01b5b14e2dea5e241698ca1e05b0c5fc..2387735165ca70229a5797ded781fe6acc3b5261 100644 (file)
@@ -129,8 +129,9 @@ void XonoticCampaignList_loadCvars(entity me)
        if(me.columnNameSize)
                rewrapCampaign(me.columnNameSize, me.rowsPerItem - 3, me.emptyLineHeight, me.realFontSize);
        me.nItems = min(me.campaignIndex + 2, campaign_entries);
-       me.selectedItem = min(me.campaignIndex, me.nItems - 1);
-       me.scrollPos = me.nItems * me.itemHeight - 1;
+       me.setSelected(me, min(me.campaignIndex, me.nItems - 1));
+       if(me.nItems - 1 > me.campaignIndex)
+               me.scrollToItem(me, me.nItems - 1);
        if(me.labelTitle)
                me.labelTitle.setText(me.labelTitle, campaign_title);
 }
index 57320a018240e3ac47bf8eae814280674004b705..e3bc1c3399f048a5a8968e9d60c8597c4f68c582 100644 (file)
@@ -9,6 +9,7 @@ CLASS(XonoticCreditsList, XonoticListBox)
        METHOD(XonoticCreditsList, resizeNotify, void(entity, vector, vector, vector, vector))
        METHOD(XonoticCreditsList, keyDown, float(entity, float, float, float))
        METHOD(XonoticCreditsList, destroy, void(entity))
+       ATTRIB(XonoticCreditsList, selectionDoesntMatter, bool, true)
 
        ATTRIB(XonoticCreditsList, realFontSize, vector, '0 0 0')
        ATTRIB(XonoticCreditsList, realUpperMargin, float, 0)
@@ -41,13 +42,10 @@ void XonoticCreditsList_destroy(entity me)
 }
 void XonoticCreditsList_draw(entity me)
 {
-       float i;
        if(me.scrolling)
        {
                me.scrollPos = bound(0, (time - me.scrolling) * me.itemHeight, me.nItems * me.itemHeight - 1);
-               i = min(me.selectedItem, floor((me.scrollPos + 1) / me.itemHeight - 1));
-               i = max(i, ceil(me.scrollPos / me.itemHeight));
-               me.setSelected(me, i);
+               me.scrollPosTarget = me.scrollPos;
        }
        SUPER(XonoticCreditsList).draw(me);
 }
@@ -91,24 +89,7 @@ void XonoticCreditsList_drawListBoxItem(entity me, int i, vector absSize, bool i
 
 float XonoticCreditsList_keyDown(entity me, float key, float ascii, float shift)
 {
-       float i;
-       me.dragScrollTimer = time;
        me.scrolling = 0;
-       if(key == K_PGUP || key == K_KP_PGUP)
-               me.scrollPos = max(me.scrollPos - 0.5, 0);
-       else if(key == K_PGDN || key == K_KP_PGDN)
-               me.scrollPos = min(me.scrollPos + 0.5, me.nItems * me.itemHeight - 1);
-       else if(key == K_UPARROW || key == K_KP_UPARROW)
-               me.scrollPos = max(me.scrollPos - me.itemHeight, 0);
-       else if(key == K_DOWNARROW || key == K_KP_DOWNARROW)
-               me.scrollPos = min(me.scrollPos + me.itemHeight, me.nItems * me.itemHeight - 1);
-       else
-               return SUPER(XonoticCreditsList).keyDown(me, key, ascii, shift);
-
-       i = min(me.selectedItem, floor((me.scrollPos + 1) / me.itemHeight - 1));
-       i = max(i, ceil(me.scrollPos / me.itemHeight));
-       me.setSelected(me, i);
-
-       return 1;
+       return SUPER(XonoticCreditsList).keyDown(me, key, ascii, shift);
 }
 #endif
index 1620349bf58864aea5f1f462c90853469d6180a4..aa00d8fe8e5d56eab97a5ed16c6246b7f9d289de 100644 (file)
@@ -133,7 +133,6 @@ void XonoticSingleplayerDialog_fill(entity me)
                        me.campaignBox.buttonNext = btnNext;
                        me.campaignBox.buttonPrev = btnPrev;
                        me.campaignBox.labelTitle = lblTitle;
-                       me.campaignBox.campaignGo(me.campaignBox, 0);
 
        me.gotoRC(me, me.rows - 2, 0);
                me.TD(me, 1, 2, e = makeXonoticTextLabel(0.5, _("Campaign Difficulty:")));
index af9d75211b3987809ec4bedb3eff1e85d3813990..4ff17755679258c1404b25954ad56ba0fe0df925 100644 (file)
@@ -121,17 +121,17 @@ void XonoticLanguageList_loadCvars(entity me)
        {
                if(me.languageParameter(me, i, LANGPARM_ID) == "en")
                {
-                       me.selectedItem = i;
+                       SUPER(XonoticLanguageList).setSelected(me, i);
                        break;
                }
        }
 
-        // otherwise, find the language
+       // otherwise, find the language
        for(i = 0; i < n; ++i)
        {
                if(me.languageParameter(me, i, LANGPARM_ID) == s)
                {
-                       me.selectedItem = i;
+                       SUPER(XonoticLanguageList).setSelected(me, i);
                        break;
                }
        }
index db3ac8a207aae1b99524a3cc11c1aa40adfed1f1..72fe69e116ee4402a875bb6abf47fb5fae470877 100644 (file)
@@ -17,6 +17,7 @@ CLASS(XonoticPlayerList, XonoticListBox)
        METHOD(XonoticPlayerList, setPlayerList, void(entity, string))
        METHOD(XonoticPlayerList, getPlayerList, string(entity, float, float))
        ATTRIB(XonoticPlayerList, playerList, float, -1)
+       ATTRIB(XonoticPlayerList, selectionDoesntMatter, bool, true)
 ENDCLASS(XonoticPlayerList)
 entity makeXonoticPlayerList();
 #endif
index d6fcaf86e3d0d97b0494e823ac311df0fb2183af..99780ed832c4c3970041c74eeb3ed6774165da2a 100644 (file)
@@ -29,7 +29,6 @@ CLASS(XonoticScreenshotList, XonoticListBox)
 
        ATTRIB(XonoticScreenshotList, newScreenshotTime, float, 0)
        ATTRIB(XonoticScreenshotList, newSlideShowScreenshotTime, float, 0)
-       ATTRIB(XonoticScreenshotList, prevSelectedItem, float, 0)
 
        ATTRIB(XonoticScreenshotList, screenshotBrowserDialog, entity, NULL)
        ATTRIB(XonoticScreenshotList, screenshotPreview, entity, NULL)
@@ -152,13 +151,12 @@ void XonoticScreenshotList_setSelected(entity me, float i)
 {
        if (me.newSlideShowScreenshotTime)
                me.startSlideShow(me);
-       me.prevSelectedItem = me.selectedItem;
+       float selectedItem_save = me.selectedItem;
        SUPER(XonoticScreenshotList).setSelected(me, i);
-       if (me.pressed && me.selectedItem != me.prevSelectedItem)
+       if (me.pressed && me.selectedItem != selectedItem_save)
        {
-               // while dragging the scrollbar (or an item)
-               // for a smooth mouse movement do not load immediately the new selected images
-               me.newScreenshotTime = time + 0.22; // dragging an item we need a delay > 0.2 (from listbox: me.dragScrollTimer = time + 0.2;)
+               // avoid immediate image loading on quick repeated selection changes
+               me.newScreenshotTime = time + 0.22;
        }
        else if (time > me.newScreenshotTime)
        {
@@ -296,8 +294,6 @@ float XonoticScreenshotList_keyDown(entity me, float scan, float ascii, float sh
                me.startScreenshot(me);
                return 1;
        }
-       if(scan == K_MWHEELUP || scan == K_MWHEELDOWN)
-               me.newScreenshotTime = time + 0.2;
        return SUPER(XonoticScreenshotList).keyDown(me, scan, ascii, shift);
 }
 #endif
index 33203c52b9dc72c10f80ad23183b609494d3310a..8d53be8fb5d5a0a9d4c0e47efc01c14627773e06 100644 (file)
@@ -27,6 +27,7 @@ CLASS(XonoticServerList, XonoticListBox)
        ATTRIB(XonoticServerList, columnTypeSize, float, 0)
        ATTRIB(XonoticServerList, columnPlayersOrigin, float, 0)
        ATTRIB(XonoticServerList, columnPlayersSize, float, 0)
+       ATTRIB(XonoticServerList, lockedSelectedItem, bool, true) // initially keep selected the first item of the list, avoiding an unwanted scrolling
 
        ATTRIB(XonoticServerList, selectedServer, string, string_null) // to restore selected server when needed
        METHOD(XonoticServerList, setSelected, void(entity, float))
@@ -460,6 +461,7 @@ void XonoticServerList_configureXonoticServerList(entity me)
 }
 void XonoticServerList_setSelected(entity me, int i)
 {
+       me.lockedSelectedItem = false;
        //int save = me.selectedItem;
        SUPER(XonoticServerList).setSelected(me, i);
        /*
@@ -717,12 +719,26 @@ void XonoticServerList_draw(entity me)
        me.infoButton.disabled = ((me.nItems == 0) || !owned);
        me.favoriteButton.disabled = ((me.nItems == 0) && (me.ipAddressBox.text == ""));
 
-       if(me.selectedServer)
+       if(me.lockedSelectedItem)
+       {
+               if(me.nItems > 0)
+               {
+                       if(gethostcachestring(SLIST_FIELD_CNAME, me.selectedItem) != me.selectedServer)
+                       {
+                               if(me.selectedServer)
+                                       strunzone(me.selectedServer);
+                               me.selectedServer = strzone(gethostcachestring(SLIST_FIELD_CNAME, me.selectedItem));
+                       }
+                       found = true;
+               }
+       }
+       else if(me.selectedServer)
        {
                for(i = 0; i < me.nItems; ++i)
                {
                        if(gethostcachestring(SLIST_FIELD_CNAME, i) == me.selectedServer)
                        {
+                               // don't follow the selected item with SUPER(XonoticServerList).setSelected(me, i);
                                me.selectedItem = i;
                                found = true;
                                break;
@@ -733,8 +749,9 @@ void XonoticServerList_draw(entity me)
        {
                if(me.nItems > 0)
                {
+                       // selected server disappeared, select the last server (scrolling to it)
                        if(me.selectedItem >= me.nItems)
-                               me.selectedItem = me.nItems - 1;
+                               SUPER(XonoticServerList).setSelected(me, me.nItems - 1);
                        if(me.selectedServer)
                                strunzone(me.selectedServer);
                        me.selectedServer = strzone(gethostcachestring(SLIST_FIELD_CNAME, me.selectedItem));
index 7400b379f6c52fca110bb8387b7b9b21ef4845df..d505a2894e4790050dfba4cce9c85d368cc31641 100644 (file)
@@ -66,7 +66,7 @@ void XonoticSkinList_loadCvars(entity me)
        {
                if(me.skinParameter(me, i, SKINPARM_NAME) == s)
                {
-                       me.selectedItem = i;
+                       me.setSelected(me, i);
                        break;
                }
        }
index d9a22ec6e78f1a8e71aeadf9d3824f44069664c1..bfa050abdbfed30d803b9f88c57dcb1392af8c60 100644 (file)
@@ -14,6 +14,7 @@ CLASS(XonoticStatsList, XonoticListBox)
        METHOD(XonoticStatsList, keyDown, float(entity, float, float, float))
        METHOD(XonoticStatsList, destroy, void(entity))
        METHOD(XonoticStatsList, showNotify, void(entity))
+       ATTRIB(XonoticStatsList, selectionDoesntMatter, bool, true)
 
        ATTRIB(XonoticStatsList, listStats, float, -1)
        ATTRIB(XonoticStatsList, realFontSize, vector, '0 0 0')
@@ -317,9 +318,7 @@ void XonoticStatsList_resizeNotify(entity me, vector relOrigin, vector relSize,
 
 void XonoticStatsList_drawListBoxItem(entity me, int i, vector absSize, bool isSelected, bool isFocused)
 {
-       if(isSelected)
-               draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED);
-       else if(isFocused)
+       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);
index adc7fc2115bb4634dbae79b6fab9236d286fa05b..f4bcf4feae2e15d09504cd0dbb7e21fbe089e4ea 100644 (file)
@@ -46,7 +46,7 @@ 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;
+               me.setSelected(me, me.selectedItem - 1);
        }
 }
 void WeaponsList_MoveDown_Click(entity box, entity me)
@@ -54,7 +54,7 @@ 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;
+               me.setSelected(me, me.selectedItem + 1);
        }
 }
 void XonoticWeaponsList_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)