]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/menu/menu.qc
Merge branch 'master' into terencehill/menu_gametype_tooltips_2
[xonotic/xonotic-data.pk3dir.git] / qcsrc / menu / menu.qc
index 70f4249d038436088a5d5b05ab19aefdf23208a5..8f522d42da5779049ca5ce5f79f27ceeddd543f0 100644 (file)
@@ -2,8 +2,10 @@
 #include "oo/classes.qc"
 #include "xonotic/util.qh"
 
+#include "../common/items/all.qh"
 #include "../common/weapons/all.qh"
 #include "../common/mapinfo.qh"
+#include "../common/mutators/base.qh"
 
 ///////////////////////////////////////////////
 // Menu Source File
@@ -61,7 +63,7 @@ void m_init()
        cvar_set("_menu_prvm_language", prvm_language);
 
 #ifdef WATERMARK
-       dprintf("^4MQC Build information: ^1%s\n", WATERMARK);
+       LOG_TRACEF("^4MQC Build information: ^1%s\n", WATERMARK);
 #endif
 
        // list all game dirs (TEST)
@@ -74,13 +76,12 @@ void m_init()
                        s = getgamedirinfo(i, GETGAMEDIRINFO_NAME);
                        if (!s)
                                break;
-                       dprint(s, ": ", getgamedirinfo(i, GETGAMEDIRINFO_DESCRIPTION));
+                       LOG_TRACE(s, ": ", getgamedirinfo(i, GETGAMEDIRINFO_DESCRIPTION));
                }
        }
 
        // needs to be done so early because of the constants they create
-       CALL_ACCUMULATED_FUNCTION(RegisterWeapons);
-       CALL_ACCUMULATED_FUNCTION(RegisterGametypes);
+       static_init();
 
        RegisterSLCategories();
 
@@ -212,10 +213,8 @@ void m_init_delayed()
 
        draw_setMousePointer(SKINGFX_CURSOR, SKINSIZE_CURSOR, SKINOFFSET_CURSOR);
 
-       loadTooltips();
        anim = NEW(AnimHost);
        main = NEW(MainWindow); main.configureMainWindow(main);
-       unloadTooltips();
 
        main.resizeNotify(main, '0 0 0', eX * conwidth + eY * conheight, '0 0 0', eX * conwidth + eY * conheight);
        main.focused = 1;
@@ -251,7 +250,7 @@ void m_keyup (float key, float ascii)
                if(mouseButtonsPressed < 0)
                {
                        mouseButtonsPressed = 0;
-                       dprint("Warning: released an already released button\n");
+                       LOG_TRACE("Warning: released an already released button\n");
                }
        }
        if(key == K_ALT) menuShiftState -= (menuShiftState & S_ALT);
@@ -302,7 +301,7 @@ void m_keydown(float key, float ascii)
                if(mouseButtonsPressed > 10)
                {
                        mouseButtonsPressed = 10;
-                       dprint("Warning: pressed an already pressed button\n");
+                       LOG_TRACE("Warning: pressed an already pressed button\n");
                }
        }
        if(key == K_ALT) menuShiftState |= S_ALT;
@@ -408,7 +407,7 @@ vector menuTooltipOrigin;
 vector menuTooltipSize;
 float menuTooltipAlpha;
 string menuTooltipText;
-float menuTooltipState; // 0: static, 1: fading in, 2: fading out
+float menuTooltipState; // 0: static, 1: fading in, 2: fading out, 3: forced fading out
 float m_testmousetooltipbox(vector pos)
 {
        if(pos.x >= menuTooltipOrigin.x && pos.x < menuTooltipOrigin.x + menuTooltipSize.x)
@@ -479,7 +478,7 @@ entity m_findtooltipitem(entity root, vector pos)
        entity it;
        entity best;
 
-       best = world;
+       best = NULL;
        it = root;
 
        while(it.instanceOfContainer)
@@ -496,7 +495,7 @@ entity m_findtooltipitem(entity root, vector pos)
                                best = it;
                        else if(menu_tooltips == 2 && (it.cvarName || it.onClickCommand))
                                best = it;
-                       it = world;
+                       it = NULL;
                }
                else if(it.instanceOfModalController)
                        it = it.focusedChild;
@@ -535,6 +534,7 @@ string gettooltip()
        }
        return menuTooltipItem.tooltip;
 }
+string prev_tooltip;
 void m_tooltip(vector pos)
 {
        float f, i, w;
@@ -546,9 +546,9 @@ void m_tooltip(vector pos)
        if (!menu_tooltips)
        {
                // don't return immediately, fade out the active tooltip first
-               if (menuTooltipItem == world)
+               if (menuTooltipItem == NULL)
                        return;
-               it = world;
+               it = NULL;
                menu_tooltips_old = menu_tooltips;
        }
        else
@@ -557,13 +557,30 @@ void m_tooltip(vector pos)
                menuTooltipAveragedMousePos = menuTooltipAveragedMousePos * (1 - f) + pos * f;
                f = vlen(pos - menuTooltipAveragedMousePos);
                if(f < 0.01)
+               {
                        it = m_findtooltipitem(main, pos);
+
+                       if(it.instanceOfListBox && it.isScrolling(it))
+                               it = world;
+
+                       if(it && prev_tooltip != it.tooltip)
+                       {
+                               // fade out if tooltip of a certain item has changed
+                               menuTooltipState = 3;
+                               if(prev_tooltip)
+                                       strunzone(prev_tooltip);
+                               prev_tooltip = strzone(it.tooltip);
+                       }
+                       else if(menuTooltipItem && !m_testmousetooltipbox(pos))
+                               menuTooltipState = 3; // fade out if mouse touches it
+
+               }
                else
-                       it = world;
+                       it = NULL;
        }
        fontsize = '1 0 0' * (SKINFONTSIZE_TOOLTIP / conwidth) + '0 1 0' * (SKINFONTSIZE_TOOLTIP / conheight);
 
-       // float menuTooltipState; // 0: static, 1: fading in, 2: fading out
+       // float menuTooltipState; // 0: static, 1: fading in, 2: fading out, 3: forced fading out
        if(it != menuTooltipItem)
        {
                switch(menuTooltipState)
@@ -614,28 +631,25 @@ void m_tooltip(vector pos)
        else if(menuTooltipState == 2) // re-fade in?
                menuTooltipState = 1;
 
-       if(menuTooltipItem)
-               if(!m_testmousetooltipbox(pos))
-                       menuTooltipState = 2; // fade out if mouse touches it
-
        switch(menuTooltipState)
        {
-               case 1:
+               case 1: // fade in
                        menuTooltipAlpha = bound(0, menuTooltipAlpha + 5 * frametime, 1);
                        if(menuTooltipAlpha == 1)
                                menuTooltipState = 0;
                        break;
-               case 2:
+               case 2: // fade out
+               case 3: // forced fade out
                        menuTooltipAlpha = bound(0, menuTooltipAlpha - 2 * frametime, 1);
                        if(menuTooltipAlpha == 0)
                        {
                                menuTooltipState = 0;
-                               menuTooltipItem = world;
+                               menuTooltipItem = NULL;
                        }
                        break;
        }
 
-       if(menuTooltipItem == world)
+       if(menuTooltipItem == NULL)
        {
                if (menuTooltipText)
                {
@@ -649,7 +663,7 @@ void m_tooltip(vector pos)
                if(menu_tooltips != menu_tooltips_old)
                {
                        if (menu_tooltips != 0 && menu_tooltips_old != 0)
-                               menuTooltipItem = world; // reload tooltip next frame
+                               menuTooltipItem = NULL; // reload tooltip next frame
                        menu_tooltips_old = menu_tooltips;
                }
                else if(menuTooltipOrigin.x < 0) // unallocated?