]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/client/hud/panel/chat.qc
Fix #2674 "Voting screens in demos respond visually to client cursor making them...
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / hud / panel / chat.qc
index 74d4b6d0f49462f522298e276770244dc54e278a..448b9f408f954e2766762a28c0fff2e57ac8f478 100644 (file)
 #include "chat.qh"
 
-#include <client/autocvars.qh>
-#include <client/defs.qh>
-#include <client/miscfunctions.qh>
+#include <client/draw.qh>
 
 // Chat (#12)
 
+void HUD_Chat_Export(int fh)
+{
+       // allow saving cvars that aesthetically change the panel into hud skin files
+}
+
+float chat_maximized_scroll_ofs;
+float chat_maximized_reset_scroll_time;
+float HUD_Panel_Chat_InputEvent(float bInputType, float nPrimary, float nSecondary)
+{
+       if(!autocvar__con_chat_maximized)
+               return false;
+
+       if(bInputType == 3)
+       {
+               mousepos.x = nPrimary;
+               mousepos.y = nSecondary;
+               return true;
+       }
+
+       if(bInputType == 2)
+               return false;
+
+       // at this point bInputType can only be 0 or 1 (key pressed or released)
+       bool key_pressed = (bInputType == 0);
+
+       if(nPrimary == K_MWHEELUP)
+       {
+               if (!key_pressed)
+                       return true;
+               chat_maximized_scroll_ofs += 5 * cvar("con_chatsize");
+               return true;
+       }
+       else if(nPrimary == K_MWHEELDOWN)
+       {
+               if (!key_pressed)
+                       return true;
+               chat_maximized_scroll_ofs -= 5 * cvar("con_chatsize");
+               if (chat_maximized_scroll_ofs < 0)
+                       chat_maximized_scroll_ofs = 0;
+               return true;
+       }
+       else if(nPrimary == K_PGUP)
+       {
+               if (!key_pressed)
+                       return true;
+               chat_maximized_scroll_ofs += vid_conheight / 2;
+               return true;
+       }
+       else if(nPrimary == K_PGDN)
+       {
+               if (!key_pressed)
+                       return true;
+               chat_maximized_scroll_ofs -= vid_conheight / 2;
+               if (chat_maximized_scroll_ofs < 0)
+                       chat_maximized_scroll_ofs = 0;
+               return true;
+       }
+
+       return false;
+}
+
 void HUD_Chat()
 {
        if(!autocvar__hud_configure)
        {
-               if (!autocvar_hud_panel_chat)
+               if (!autocvar_hud_panel_chat && !autocvar__con_chat_maximized)
                {
-                       if (!autocvar_con_chatrect)
+                       if (autocvar_con_chatrect)
                                cvar_set("con_chatrect", "0");
+                       if (autocvar_con_chat != -1)
+                               cvar_set("con_chat", "-1");
                        return;
                }
+
                if(autocvar__con_chat_maximized)
                {
                        if(!hud_draw_maximized) return;
+
+                       chat_maximized_reset_scroll_time = time + 3;
                }
-               else if(chat_panel_modified)
+               else
                {
-                       panel.update_time = time; // forces reload of panel attributes
-                       chat_panel_modified = false;
+                       if(chat_panel_modified)
+                       {
+                               panel.update_time = time; // forces reload of panel attributes
+                               chat_panel_modified = false;
+                       }
+                       if (time > chat_maximized_reset_scroll_time)
+                               chat_maximized_scroll_ofs = 0;
                }
        }
+       else
+               chat_maximized_scroll_ofs = 0;
 
        HUD_Panel_LoadCvars();
 
@@ -48,12 +119,11 @@ void HUD_Chat()
                        panel_bg = strcat(hud_skin_path, "/border_default");
                        if(precache_pic(panel_bg) == "")
                                panel_bg = "gfx/hud/default/border_default";
-                       if(panel.current_panel_bg)
-                               strunzone(panel.current_panel_bg);
-                       panel.current_panel_bg = strzone(panel_bg);
+                       strcpy(panel.current_panel_bg, panel_bg);
                        chat_panel_modified = true;
                }
                panel_bg_alpha = max(0.75, panel_bg_alpha);
+               panel_size.y += chat_maximized_scroll_ofs;
        }
 
        vector pos, mySize;
@@ -73,16 +143,25 @@ void HUD_Chat()
        if (!autocvar_con_chatrect)
                cvar_set("con_chatrect", "1");
 
-       cvar_set("con_chatrect_x", ftos(pos.x/vid_conwidth));
-       cvar_set("con_chatrect_y", ftos(pos.y/vid_conheight));
-
-       cvar_set("con_chatwidth", ftos(mySize.x/vid_conwidth));
-       cvar_set("con_chat", ftos(floor(mySize.y/autocvar_con_chatsize - 0.5)));
+       // can't use a name ending with _x, _y and _z for a float autocvar as for autocvar specs
+       // it prevents ambiguity with component names of vector autocvars
+       if (cvar_string("con_chatrect_x") != ftos(pos.x / vid_conwidth))
+               cvar_set("con_chatrect_x", ftos(pos.x / vid_conwidth));
+       if (cvar_string("con_chatrect_y") != ftos(pos.y / vid_conheight))
+               cvar_set("con_chatrect_y", ftos(pos.y / vid_conheight));
+       // can't use direct comparison here, it would always returns true even if
+       // both arguments are equal because con_chatwidth is saved with cvar_set
+       //if (autocvar_con_chatwidth != mySize.x / vid_conwidth)
+       if (fabs(autocvar_con_chatwidth - mySize.x / vid_conwidth) > 0.00001)
+               cvar_set("con_chatwidth", ftos(mySize.x / vid_conwidth));
+       if (autocvar_con_chat != floor(mySize.y / autocvar_con_chatsize - 0.5))
+               cvar_set("con_chat", ftos(floor(mySize.y / autocvar_con_chatsize - 0.5)));
 
        if(autocvar__hud_configure)
        {
                vector chatsize = '1 1 0' * autocvar_con_chatsize;
-               cvar_set("con_chatrect_x", "9001"); // over 9000, we'll fake it instead for more control over alpha and such
+               if (cvar_string("con_chatrect_x") != "9001")
+                       cvar_set("con_chatrect_x", "9001"); // over 9000, we'll fake it instead for more control over alpha and such
                string str = textShortenToWidth(_("^3Player^7: This is the chat area."), mySize.x, chatsize, stringwidth_colors);
                for(int i = 0; i < autocvar_con_chat; ++i)
                {