diff options
author | sapier <Sapier at GMX dot net> | 2014-08-22 17:40:11 +0200 |
---|---|---|
committer | sapier <Sapier at GMX dot net> | 2014-08-23 00:23:14 +0200 |
commit | 7940a4264ad19863f7fc7a32a665303ba766eed5 (patch) | |
tree | 0812d1284c2f62474c429b8341c08d4896ba9687 | |
parent | 55c646c5c2b40931d24be8541b3056ab3322a70f (diff) | |
download | minetest-7940a4264ad19863f7fc7a32a665303ba766eed5.tar.gz minetest-7940a4264ad19863f7fc7a32a665303ba766eed5.tar.bz2 minetest-7940a4264ad19863f7fc7a32a665303ba766eed5.zip |
Fix chat messages capturing mouse interactions for menu/formspecs
-rw-r--r-- | src/game.cpp | 107 |
1 files changed, 61 insertions, 46 deletions
diff --git a/src/game.cpp b/src/game.cpp index 6c16372cc..7f15362ab 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -1064,6 +1064,52 @@ static void show_pause_menu(GUIFormSpecMenu** cur_formspec, } /******************************************************************************/ +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, std::string playername, std::string password, @@ -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 @@ -3389,6 +3397,13 @@ void the_game(bool &kill, bool random_input, InputHandler *input, } /* + make sure menu is on top + */ + if ((!noMenuActive()) && (current_formspec)) { + guiroot->bringToFront(current_formspec); + } + + /* Drawing begins */ TimeTaker tt_draw("mainloop: draw"); |