Fix chat messages capturing mouse interactions for menu/formspecs 1574/head
authorsapier <Sapier at GMX dot net>
Fri, 22 Aug 2014 15:40:11 +0000 (17:40 +0200)
committersapier <Sapier at GMX dot net>
Fri, 22 Aug 2014 22:23:14 +0000 (00:23 +0200)
src/game.cpp

index 6c16372cc4bdc30f958b3a2c5927cfbcd3f5ee55..7f15362abcc168ebd49161e009017ca1ff851070 100644 (file)
@@ -1063,6 +1063,52 @@ static void show_pause_menu(GUIFormSpecMenu** cur_formspec,
        (*cur_formspec)->doPause = true;
 }
 
+/******************************************************************************/
+static void updateChat(Client& client, f32 dtime, bool show_debug,
+               const v2u32& screensize, bool show_chat, u32 show_profiler,
+               ChatBackend& chat_backend, gui::IGUIStaticText* guitext_chat,
+               gui::IGUIFont* font)
+{
+       // Add chat log output for errors to be shown in chat
+       static LogOutputBuffer chat_log_error_buf(LMT_ERROR);
+
+       // Get new messages from error log buffer
+       while(!chat_log_error_buf.empty()) {
+               chat_backend.addMessage(L"", narrow_to_wide(chat_log_error_buf.get()));
+       }
+
+       // Get new messages from client
+       std::wstring message;
+       while (client.getChatMessage(message)) {
+               chat_backend.addUnparsedMessage(message);
+       }
+
+       // Remove old messages
+       chat_backend.step(dtime);
+
+       // Display all messages in a static text element
+       unsigned int recent_chat_count = chat_backend.getRecentBuffer().getLineCount();
+       std::wstring recent_chat       = chat_backend.getRecentChat();
+
+       // TODO replace by fontengine fcts
+       unsigned int line_height       = font->getDimension(L"Ay").Height + font->getKerningHeight();
+
+       guitext_chat->setText(recent_chat.c_str());
+
+       // Update gui element size and position
+       s32 chat_y = 5 + line_height;
+       if (show_debug)
+               chat_y += line_height;
+
+       core::rect<s32> rect(10, chat_y, font->getDimension(recent_chat.c_str()).Width +10,
+                       chat_y + (recent_chat_count * line_height));
+
+       guitext_chat->setRelativePosition(rect);
+       // Don't show chat if disabled or empty or profiler is enabled
+       guitext_chat->setVisible(
+                       show_chat && recent_chat_count != 0 && !show_profiler);
+}
+
 /******************************************************************************/
 void the_game(bool &kill, bool random_input, InputHandler *input,
        IrrlichtDevice *device, gui::IGUIFont* font, std::string map_dir,
@@ -1133,9 +1179,6 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
        SoundMaker soundmaker(sound, nodedef);
        soundmaker.registerReceiver(&eventmgr);
 
-       // Add chat log output for errors to be shown in chat
-       LogOutputBuffer chat_log_error_buf(LMT_ERROR);
-
        // Create UI for modifying quicktune values
        QuicktuneShortcutter quicktune;
 
@@ -1527,24 +1570,24 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
        gui::IGUIStaticText *guitext = guienv->addStaticText(
                        L"Minetest",
                        core::rect<s32>(0, 0, 0, 0),
-                       false, false);
+                       false, false, guiroot);
        // Second line of debug text
        gui::IGUIStaticText *guitext2 = guienv->addStaticText(
                        L"",
                        core::rect<s32>(0, 0, 0, 0),
-                       false, false);
+                       false, false, guiroot);
        // At the middle of the screen
        // Object infos are shown in this
        gui::IGUIStaticText *guitext_info = guienv->addStaticText(
                        L"",
                        core::rect<s32>(0,0,400,text_height*5+5) + v2s32(100,200),
-                       false, true);
+                       false, true, guiroot);
 
        // Status text (displays info when showing and hiding GUI stuff, etc.)
        gui::IGUIStaticText *guitext_status = guienv->addStaticText(
                        L"<Status>",
                        core::rect<s32>(0,0,0,0),
-                       false, false);
+                       false, false, guiroot);
        guitext_status->setVisible(false);
 
        std::wstring statustext;
@@ -1555,7 +1598,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                        L"",
                        core::rect<s32>(0,0,0,0),
                        //false, false); // Disable word wrap as of now
-                       false, true);
+                       false, true, guiroot);
        // Remove stale "recent" chat messages from previous connections
        chat_backend.clearRecentChat();
        // Chat backend and console
@@ -1565,7 +1608,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
        gui::IGUIStaticText *guitext_profiler = guienv->addStaticText(
                        L"<Profiler>",
                        core::rect<s32>(0,0,0,0),
-                       false, false);
+                       false, false, guiroot);
        guitext_profiler->setBackgroundColor(video::SColor(120,0,0,0));
        guitext_profiler->setVisible(false);
        guitext_profiler->setWordWrap(true);
@@ -3311,43 +3354,8 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                /*
                        Get chat messages from client
                */
-               {
-                       // Get new messages from error log buffer
-                       while(!chat_log_error_buf.empty())
-                       {
-                               chat_backend.addMessage(L"", narrow_to_wide(
-                                               chat_log_error_buf.get()));
-                       }
-                       // Get new messages from client
-                       std::wstring message;
-                       while(client.getChatMessage(message))
-                       {
-                               chat_backend.addUnparsedMessage(message);
-                       }
-                       // Remove old messages
-                       chat_backend.step(dtime);
-
-                       // Display all messages in a static text element
-                       u32 recent_chat_count = chat_backend.getRecentBuffer().getLineCount();
-                       std::wstring recent_chat = chat_backend.getRecentChat();
-                       guitext_chat->setText(recent_chat.c_str());
-
-                       // Update gui element size and position
-                       s32 chat_y = 5+(text_height+5);
-                       if(show_debug)
-                               chat_y += (text_height+5);
-                       core::rect<s32> rect(
-                               10,
-                               chat_y,
-                               screensize.X - 10,
-                               chat_y + guitext_chat->getTextHeight()
-                       );
-                       guitext_chat->setRelativePosition(rect);
-
-                       // Don't show chat if disabled or empty or profiler is enabled
-                       guitext_chat->setVisible(show_chat && recent_chat_count != 0
-                                       && !show_profiler);
-               }
+               updateChat(client, dtime, show_debug, screensize, show_chat,
+                               show_profiler, chat_backend, guitext_chat, font);
 
                /*
                        Inventory
@@ -3388,6 +3396,13 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
                        update_draw_list_last_cam_dir = camera_direction;
                }
 
+               /*
+                       make sure menu is on top
+               */
+               if ((!noMenuActive()) && (current_formspec)) {
+                               guiroot->bringToFront(current_formspec);
+               }
+
                /*
                        Drawing begins
                */