]> git.rm.cloudns.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Improve advanced menu tooltips
authork9er <k9wolf@pm.me>
Sun, 19 Jan 2025 11:57:30 +0000 (11:57 +0000)
committerterencehill <piuntn@gmail.com>
Sun, 19 Jan 2025 11:57:30 +0000 (11:57 +0000)
12 files changed:
qcsrc/menu/menu.qc
qcsrc/menu/xonotic/commandbutton.qc
qcsrc/menu/xonotic/dialog_multiplayer_profile.qc
qcsrc/menu/xonotic/dialog_settings_audio.qc
qcsrc/menu/xonotic/dialog_settings_game_weapons.qc
qcsrc/menu/xonotic/dialog_settings_input.qc
qcsrc/menu/xonotic/dialog_settings_misc.qc
qcsrc/menu/xonotic/dialog_settings_misc_reset.qc
qcsrc/menu/xonotic/dialog_settings_video.qc
qcsrc/menu/xonotic/leavematchbutton.qc
qcsrc/menu/xonotic/util.qc
qcsrc/menu/xonotic/util.qh

index 4d2d6d45035b6d892217580dc75fef9202b80e16..2e941e614809880ceb856aad654f5eedac2cc913 100644 (file)
@@ -502,11 +502,20 @@ entity m_findtooltipitem(entity root, vector pos)
 
        return best;
 }
+string gettooltip_dependency_string_numeric(entity e, .string cvarStr, .float cvarMin, .float cvarMax)
+{
+       if (e.(cvarMin) == e.(cvarMax))
+               return sprintf("^3%s^7 \"%s\"",                            e.(cvarStr), ftos_mindecimals(e.(cvarMin)));
+       else if (e.(cvarMin) < e.(cvarMax))
+               return sprintf(_("^3%s^7 in range \"%s\" to \"%s\""),      e.(cvarStr), ftos_mindecimals(e.(cvarMin)), ftos_mindecimals(e.(cvarMax)));
+       else
+               return sprintf(_("^3%s^7 outside range \"%s\" to \"%s\""), e.(cvarStr), ftos_mindecimals(e.(cvarMax)), ftos_mindecimals(e.(cvarMin)));
+}
 string gettooltip()
 {
+       string s;
        if (menu_tooltips == 2)
        {
-               string s;
                if (menuTooltipItem.controlledCvar)
                {
                        string cvar_list = getCvarsMulti(menuTooltipItem);
@@ -514,23 +523,54 @@ string gettooltip()
                                cvar_list = strcat(menuTooltipItem.controlledCvar, " ", cvar_list);
                        else
                                cvar_list = menuTooltipItem.controlledCvar;
-                       s = strcat("[", cvar_list, " \"", cvar_string(menuTooltipItem.controlledCvar), "\"]");
+                       s = strcat("^3", cvar_list,
+                               " ^7\"",    cvar_string(menuTooltipItem.controlledCvar), "^7\" "
+                               "^8[\"", cvar_defstring(menuTooltipItem.controlledCvar), "^8\"]^7");
                }
                else if (menuTooltipItem.onClickCommand)
-               {
-                       s = strcat("<", menuTooltipItem.onClickCommand, ">");
-               }
+                       s = strcat("<", menuTooltipItem.onClickCommand, "^7>");
                else
+                       s = "";
+
+               if (menuTooltipItem.tooltip)
+                       s = strcat(rgb_to_hexcolor(SKINCOLOR_TOOLTIP), (s == "" ? menuTooltipItem.tooltip : strcat(menuTooltipItem.tooltip, "\n\n", s)));
+
+               if (menuTooltipItem.disabled)
                {
-                       return menuTooltipItem.tooltip;
+                       if (menuTooltipItem.func_setDependent)
+                               s = strcat(s, "\n\n", _("Has special requirements"));
+                       else if (menuTooltipItem.cvarString_setDependent)
+                               s = strcat(s, "\n\n",
+                                       sprintf(_("Requires ^3%s^7 not equal to \"%s^7\""), cvar_string(menuTooltipItem.cvarString_setDependent), menuTooltipItem.cvarValue_setDependent));
+                       else if (menuTooltipItem.cvar_setDependent)
+                       {
+                               s = strcat(s, "\n\n");
+                               string cvar1_s, cvar2_s, cvar3_s;
+                               cvar1_s = gettooltip_dependency_string_numeric(menuTooltipItem, cvar_setDependent, cvarMin_setDependent, cvarMax_setDependent);
+                               if (menuTooltipItem.cvar2_setDependent)
+                               {
+                                       cvar2_s = gettooltip_dependency_string_numeric(menuTooltipItem, cvar2_setDependent, cvar2Min_setDependent, cvar2Max_setDependent);
+                                       if (menuTooltipItem.cvar3_setDependent)
+                                       {
+                                               cvar3_s = gettooltip_dependency_string_numeric(menuTooltipItem, cvar3_setDependent, cvar3Min_setDependent, cvar3Max_setDependent);
+                                               s = strcat(s, sprintf(_("Requires %s, %s, and %s"), cvar1_s, cvar2_s, cvar3_s));
+                                       }
+                                       else
+                                               s = strcat(s, sprintf((menuTooltipItem.op_setDependent ? _("Requires %s or %s") : _("Requires %s and %s")), cvar1_s, cvar2_s));
+                               }
+                               else
+                                       s = strcat(s, sprintf(_("Requires %s"), cvar1_s));
+                       }
+                       // if this point is reached, it's disabled for some other unknown reason
                }
-               if (menuTooltipItem.tooltip) return strcat(menuTooltipItem.tooltip, " ", s);
-               return s;
        }
-       return menuTooltipItem.tooltip;
+       else
+               s = menuTooltipItem.tooltip;
+       return s;
 }
 void m_tooltip(vector pos)
 {
+       const float MAX_TOOLTIP_LINES = 16;
        static string prev_tooltip;
        entity it;
        menu_tooltips = cvar("menu_tooltips");
@@ -590,18 +630,27 @@ void m_tooltip(vector pos)
 
                                        strcpy(menuTooltipText, gettooltip());
 
-                                       int i = 0;
                                        float w = 0;
-                                       for (getWrappedLine_remaining = menuTooltipText; getWrappedLine_remaining && i <= 16; ++i)
+                                       float lines = 0;
+                                       int n = tokenizebyseparator(menuTooltipText, "\n");
+                                       for (int k = 0; k < n && lines <= MAX_TOOLTIP_LINES; ++k)
                                        {
-                                               string s = getWrappedLine(SKINWIDTH_TOOLTIP, fontsize, draw_TextWidth_WithoutColors);
-                                               if (i == 16)
-                                                       s = "...";
-                                               float f = draw_TextWidth(s, false, fontsize);
-                                               if (f > w) w = f;
+                                               if (argv(k) == "")
+                                               {
+                                                       lines += 0.5; // insert a half-height separator between paragraphs (marked by 2 newlines)
+                                                       continue;
+                                               }
+                                               for (getWrappedLine_remaining = argv(k); getWrappedLine_remaining && lines <= MAX_TOOLTIP_LINES; ++lines)
+                                               {
+                                                       string s = getWrappedLine(SKINWIDTH_TOOLTIP, fontsize, draw_TextWidth_WithColors);
+                                                       if (lines + 1 > MAX_TOOLTIP_LINES)
+                                                               s = "...";
+                                                       float f = draw_TextWidth_WithColors(s, fontsize);
+                                                       if (f > w) w = f;
+                                               }
                                        }
                                        menuTooltipSize.x = w + 2 * (SKINMARGIN_TOOLTIP_x / conwidth);
-                                       menuTooltipSize.y = i * fontsize.y + 2 * (SKINMARGIN_TOOLTIP_y / conheight);
+                                       menuTooltipSize.y = lines * fontsize.y + 2 * (SKINMARGIN_TOOLTIP_y / conheight);
                                        menuTooltipSize.z = 0;
                                }
                                break;
@@ -662,13 +711,23 @@ void m_tooltip(vector pos)
                        p = menuTooltipOrigin;
                        p.x += SKINMARGIN_TOOLTIP_x / conwidth;
                        p.y += SKINMARGIN_TOOLTIP_y / conheight;
-                       int i = 0;
-                       for (getWrappedLine_remaining = menuTooltipText; getWrappedLine_remaining && i <= 16; ++i, p.y += fontsize.y)
+                       float lines = 0;
+                       int n = tokenizebyseparator(menuTooltipText, "\n");
+                       for (int k = 0; k < n && lines <= MAX_TOOLTIP_LINES; ++k)
                        {
-                               string s = getWrappedLine(SKINWIDTH_TOOLTIP, fontsize, draw_TextWidth_WithoutColors);
-                               if (i == 16)
-                                       s = "...";
-                               draw_Text(p, s, fontsize, SKINCOLOR_TOOLTIP, SKINALPHA_TOOLTIP * menuTooltipAlpha, false);
+                               if (argv(k) == "")
+                               {
+                                       p.y += fontsize.y / 2;
+                                       continue;
+                               }
+                               for (getWrappedLine_remaining = argv(k); getWrappedLine_remaining && lines <= MAX_TOOLTIP_LINES; ++lines)
+                               {
+                                       string s = getWrappedLine(SKINWIDTH_TOOLTIP, fontsize, draw_TextWidth_WithColors);
+                                       if (lines + 1 > MAX_TOOLTIP_LINES)
+                                               s = "...";
+                                       draw_Text(p, s, fontsize, '1 1 1', SKINALPHA_TOOLTIP * menuTooltipAlpha, true);
+                                       p.y += fontsize.y;
+                               }
                        }
                }
        }
index ec03633eb136dc3cc9b4def9d3218034bd824d9d..789f071dfa1d4a56d268fb8e1e9eb34c3166292b 100644 (file)
@@ -17,7 +17,7 @@ void XonoticCommandButton_Click(entity me, entity other)
 {
        //if(me.flags & COMMANDBUTTON_APPLY)
        //      saveAllCvars(me.parent);
-       cmd("\n", me.onClickCommand, "\n");
+       localcmd("\n", me.onClickCommand, "\n");
        //if(me.flags & COMMANDBUTTON_REVERT)
        //      loadAllCvars(me.parent);
        if(me.flags & COMMANDBUTTON_CLOSE)
index ad3a3cbb5dfb0cca21cf0cec582823bb8a28aff6..564a6e9db4c8653b43e7286693546ac41ef85ee1 100644 (file)
@@ -36,10 +36,10 @@ void XonoticProfileTab_fill(entity me)
        entity e, pms, label, box;
        float i;
        entity profileApplyButton = makeXonoticCommandButton(_("Apply immediately"), '0 0 0',
-               "color -1 -1;" // apply colors contained in _cl_color
-               "name \"$_cl_name\";"
-               "playermodel $_cl_playermodel;"
-               "playerskin $_cl_playerskin;"
+               "color -1 -1; " // apply colors contained in _cl_color
+               "name \"$_cl_name\"; "
+               "playermodel $_cl_playermodel; "
+               "playerskin $_cl_playerskin"
                , COMMANDBUTTON_APPLY);
        profileApplyButton.disableOnClick = true;
 
index 7f911c1035b5db571867bdc44dbafbd8684884ee..73181c6d91131e6d4ec3da3f2da3ca1ce5758f13 100644 (file)
@@ -20,8 +20,8 @@ void XonoticAudioSettingsTab_fill(entity me)
 {
        entity e, e2, s;
        entity audioApplyButton = makeXonoticCommandButton(_("Apply immediately"), '0 0 0',
-               "snd_restart;"
-               "snd_attenuation_method_${menu_snd_attenuation_method};"
+               "snd_restart; "
+               "snd_attenuation_method_${menu_snd_attenuation_method}"
                , COMMANDBUTTON_APPLY);
        audioApplyButton.disableOnClick = true;
 
index e5adc9a8048839a2f399cff454997bec28805898..310054b61eb551faf01f9aad8d46a2cf3ea71c37 100644 (file)
@@ -24,7 +24,7 @@ void XonoticGameWeaponsSettingsTab_fill(entity me)
 {
        entity e;
        entity weaponsApplyButton = makeXonoticCommandButton(_("Apply immediately"), '0 0 0',
-               "sendcvar cl_weaponpriority;"
+               "sendcvar cl_weaponpriority"
                , COMMANDBUTTON_APPLY);
        weaponsApplyButton.disableOnClick = true;
 
index 659e41533b098401b610252ebebb719d5edae3aa..535ec2b20dce1c0d86d6c7aa038e214dd1dd4db1 100644 (file)
@@ -57,7 +57,7 @@ entity makeXonoticInputSettingsTab()
 void CheckBox_Click_Redisplay(entity me, entity checkbox)
 {
        CheckBox_Click(me, checkbox);
-       cmd("\ndefer 0.2 \"togglemenu 1\"\n");
+       localcmd("\ndefer 0.2 \"togglemenu 1\"\n");
        //m_display();
 }
 void XonoticInputSettingsTab_fill(entity me)
index 24c4c7ce40f6d9121f938b353b91e834c531a25a..875ef0040fc445649e0745b7042b0fd7951a69c0 100644 (file)
@@ -24,7 +24,7 @@ void XonoticMiscSettingsTab_fill(entity me)
        entity e;
        //entity sk;
 
-       entity miscApplyButton = makeXonoticCommandButton(_("Apply immediately"), '0 0 0', "menu_restart;", COMMANDBUTTON_APPLY);
+       entity miscApplyButton = makeXonoticCommandButton(_("Apply immediately"), '0 0 0', "menu_restart", COMMANDBUTTON_APPLY);
        miscApplyButton.disableOnClick = true;
 
        me.TR(me);
index c0d064a7daf865256118cd52311fa3b75033cdf6..da9b4fe62af33c269e4e4dda935c31bc5f64bcf1 100644 (file)
@@ -13,7 +13,7 @@ void XonoticResetDialog_fill(entity me)
                me.TD(me, 1, 2, makeXonoticTextLabel(0.5, _("This will create a backup config in your data directory")));
        me.TR(me);
        me.TR(me);
-               me.TD(me, 1, 1, e = makeXonoticCommandButton(_("Yes"), '1 0 0', "saveconfig backup.cfg\n;\n exec default.cfg\n", 0));
+               me.TD(me, 1, 1, e = makeXonoticCommandButton(_("Yes"), '1 0 0', "saveconfig backup.cfg; exec default.cfg", 0));
                me.TD(me, 1, 1, e = makeXonoticButton(_("No"), '0 1 0'));
                        e.onClick = Dialog_Close;
                        e.onClickEntity = me;
index ff236bc6938c0c080b3249660d2a41690cd648d6..12786e13dfb076e95110a9c7c1ae721de0c648e5 100644 (file)
@@ -19,13 +19,13 @@ void XonoticVideoSettingsTab_fill(entity me)
 {
        entity e;
        entity videoApplyButton = makeXonoticCommandButton(_("Apply immediately"), '0 0 0',
-               "vid_width $_menu_vid_width;"
-               "vid_height $_menu_vid_height;"
-               "vid_pixelheight $_menu_vid_pixelheight;"
-               "vid_desktopfullscreen $_menu_vid_desktopfullscreen;"
-               "menu_cmd update_conwidths_before_vid_restart;"
-               "vid_restart;"
-               "menu_cmd sync;"
+               "vid_width $_menu_vid_width; "
+               "vid_height $_menu_vid_height; "
+               "vid_pixelheight $_menu_vid_pixelheight; "
+               "vid_desktopfullscreen $_menu_vid_desktopfullscreen; "
+               "menu_cmd update_conwidths_before_vid_restart; "
+               "vid_restart; "
+               "menu_cmd sync"
                , COMMANDBUTTON_APPLY);
        videoApplyButton.disableOnClick = true;
 
index d2117356b8bb91e56db337cae535084e45e09848..d25b1bfdd7655f96e8a111b93fa8ae4090149d5d 100644 (file)
@@ -4,7 +4,7 @@
 // the delay is for allowing listening to the button sound (if enabled), since the disconnect command stops all sounds
 // menu_sync is also useful when leaving Instant Action mode
 // see also m_draw
-const string LEAVEMATCH_CMD = "defer 0.4 disconnect; defer 0.4 wait; defer 0.4 \"g_campaign 0\"; defer 0.4 menu_sync\n";
+const string LEAVEMATCH_CMD = "defer 0.4 disconnect; defer 0.4 wait; defer 0.4 \"g_campaign 0\"; defer 0.4 menu_sync";
 
 string leaveMatchButton_getText(entity me)
 {
index e3bb5085cdd6dd67df97f72b20339602127e915c..937497e6d699090ee53020110ee2a350f25e85e5 100644 (file)
@@ -112,20 +112,6 @@ void makeCallback(entity e, entity cbent, void(entity, entity) cbfunc)
 }
 
 .void(entity) draw_setDependent;
-.string cvar_setDependent;
-.float cvarMin_setDependent;
-.float cvarMax_setDependent;
-.string cvar2_setDependent;
-.float cvar2Min_setDependent;
-.float cvar2Max_setDependent;
-.string cvar3_setDependent;
-.float cvar3Min_setDependent;
-.float cvar3Max_setDependent;
-.float op_setDependent;
-.string cvarString_setDependent;
-.string cvarValue_setDependent;
-.float(entity) func_setDependent;
-.bool disabled;
 void setDependent_Check(entity e)
 {
        bool disabled_prev = e.disabled;
@@ -838,7 +824,7 @@ void CheckSendCvars(entity me, string cvarnamestring)
                if(gamestatus & (GAME_CONNECTED | GAME_ISSERVER))
                {
                        LOG_INFOF("Sending cvar: %s -> %s", cvarnamestring, cvar_string(cvarnamestring));
-                       cmd(sprintf("\nsendcvar %s\n", cvarnamestring));
+                       localcmd(sprintf("\nsendcvar %s\n", cvarnamestring));
                }
        }
 }
index bb5de1b5141e6769068fd473d3b9b63e8ead67d5..d93a7aa89463524f70b734a2f8611229dbe118fe 100644 (file)
@@ -1,5 +1,20 @@
 #pragma once
 
+.string cvar_setDependent;
+.float cvarMin_setDependent;
+.float cvarMax_setDependent;
+.string cvar2_setDependent;
+.float cvar2Min_setDependent;
+.float cvar2Max_setDependent;
+.string cvar3_setDependent;
+.float cvar3Min_setDependent;
+.float cvar3Max_setDependent;
+.float op_setDependent;
+.string cvarString_setDependent;
+.string cvarValue_setDependent;
+.float(entity) func_setDependent;
+.bool disabled;
+
 float GL_CheckExtension(string ext);
 float GL_Have_TextureCompression();