From b0ce837b66ddc34a9b2a9346291b252f748c577f Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Thu, 29 Mar 2012 01:18:21 +0300 Subject: Add option to auto hide chat window (chat window visible by default) Option in chat \ Auto hide chat window. --- src/defaults.cpp | 1 + src/game.cpp | 1 + src/gui/chatwindow.cpp | 65 ++++++++++++++++++++++++++++++++++++++++++++- src/gui/chatwindow.h | 21 ++++++++++++++- src/gui/setup_chat.cpp | 6 +++++ src/gui/widgets/chattab.cpp | 8 ++++++ 6 files changed, 100 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/defaults.cpp b/src/defaults.cpp index 8b62f6d02..9451ff2ff 100644 --- a/src/defaults.cpp +++ b/src/defaults.cpp @@ -240,6 +240,7 @@ DefaultsData* getConfigDefaults() AddDEF(configData, "soundrequest", "attention"); AddDEF(configData, "soundguild", "newmessage"); AddDEF(configData, "autohideButtons", true); + AddDEF(configData, "autohideChat", false); return configData; } diff --git a/src/game.cpp b/src/game.cpp index b17646730..e20b6c5df 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -191,6 +191,7 @@ static void createGuiWindows() // Create dialogs chatWindow = new ChatWindow; + chatWindow->updateVisibility(); tradeWindow = new TradeWindow; equipmentWindow = new EquipmentWindow(PlayerInfo::getEquipment(), player_node); diff --git a/src/gui/chatwindow.cpp b/src/gui/chatwindow.cpp index 674c34039..528c1e39e 100644 --- a/src/gui/chatwindow.cpp +++ b/src/gui/chatwindow.cpp @@ -94,6 +94,8 @@ class ChatInput : public TextField, public gcn::FocusListener void focusLost(const gcn::Event &event A_UNUSED) { processVisible(false); + if (chatWindow) + chatWindow->updateVisibility(); } void processVisible(bool n) @@ -157,7 +159,9 @@ ChatWindow::ChatWindow(): Window(_("Chat"), false, nullptr, "chat.xml"), mTmpVisible(false), mChatHistoryIndex(0), - mGMLoaded(false) + mGMLoaded(false), + mHaveMouse(false), + mAutoHide(false) { listen(CHANNEL_NOTICES); listen(CHANNEL_ATTRIBUTES); @@ -222,10 +226,14 @@ ChatWindow::ChatWindow(): initTradeFilter(); loadCustomList(); parseHighlights(); + + config.addListener("autohideChat", this); + mAutoHide = config.getBoolValue("autohideChat"); } ChatWindow::~ChatWindow() { + config.removeListener("autohideChat", this); saveState(); config.setValue("ReturnToggles", mReturnToggles); removeAllWhispers(); @@ -535,6 +543,7 @@ bool ChatWindow::requestChatFocus() // Give focus to the chat input mChatInput->processVisible(true); + unHideWindow(); mChatInput->requestFocus(); return true; } @@ -1607,3 +1616,57 @@ void ChatWindow::copyToClipboard(int x, int y) std::string str = text->getTextAtPos(x, y); sendBuffer(str); } + +void ChatWindow::optionChanged(const std::string &name) +{ + if (name == "autohideChat") + mAutoHide = config.getBoolValue("autohideChat"); +} + +void ChatWindow::mouseMoved(gcn::MouseEvent &event) +{ + mHaveMouse = true; + gcn::Window::mouseMoved(event); +} + +void ChatWindow::mouseEntered(gcn::MouseEvent& mouseEvent) +{ + mHaveMouse = true; + gcn::Window::mouseEntered(mouseEvent); +} + +void ChatWindow::mouseExited(gcn::MouseEvent& mouseEvent) +{ + updateVisibility(); + gcn::Window::mouseExited(mouseEvent); +} + +void ChatWindow::draw(gcn::Graphics* graphics) +{ + if (!mAutoHide || mHaveMouse) + Window::draw(graphics); +} + +void ChatWindow::updateVisibility() +{ + int mouseX = 0; + int mouseY = 0; + int x = 0; + int y = 0; + SDL_GetMouseState(&mouseX, &mouseY); + getAbsolutePosition(x, y); + if (mChatInput->isVisible()) + { + mHaveMouse = true; + } + else + { + mHaveMouse = mouseX >= x && mouseX <= x + getWidth() + && mouseY >= y && mouseY <= y + getHeight(); + } +} + +void ChatWindow::unHideWindow() +{ + mHaveMouse = true; +} diff --git a/src/gui/chatwindow.h b/src/gui/chatwindow.h index aa56237a2..df452f9a7 100644 --- a/src/gui/chatwindow.h +++ b/src/gui/chatwindow.h @@ -25,6 +25,8 @@ #include "listener.h" +#include "configlistener.h" + #include "gui/widgets/window.h" #include @@ -80,7 +82,8 @@ struct CHATLOG class ChatWindow : public Window, public gcn::ActionListener, public gcn::KeyListener, - public Listener + public Listener, + public ConfigListener { public: /** @@ -262,6 +265,20 @@ class ChatWindow : public Window, void copyToClipboard(int x, int y); + void optionChanged(const std::string &name); + + void mouseEntered(gcn::MouseEvent& mouseEvent); + + void mouseMoved(gcn::MouseEvent &event); + + void mouseExited(gcn::MouseEvent& mouseEvent A_UNUSED); + + void draw(gcn::Graphics* graphics); + + void updateVisibility(); + + void unHideWindow(); + protected: friend class ChatTab; friend class WhisperTab; @@ -333,6 +350,8 @@ class ChatWindow : public Window, std::list mAwayLog; std::vector mHighlights; bool mGMLoaded; + bool mHaveMouse; + bool mAutoHide; }; extern ChatWindow *chatWindow; diff --git a/src/gui/setup_chat.cpp b/src/gui/setup_chat.cpp index 4bfb8928e..9cd164839 100644 --- a/src/gui/setup_chat.cpp +++ b/src/gui/setup_chat.cpp @@ -51,6 +51,12 @@ Setup_Chat::Setup_Chat() ContainerPlacer place = h.getPlacer(0, 0); place(0, 0, mScroll, 10, 10); + new SetupItemLabel(_("Window"), "", this); + + new SetupItemCheckBox(_("Auto hide chat window."), "", + "autohideChat", this, "autohideChatEvent"); + + new SetupItemLabel(_("Colors"), "", this); new SetupItemCheckBox(_("Remove colors from received chat messages"), "", diff --git a/src/gui/widgets/chattab.cpp b/src/gui/widgets/chattab.cpp index be6a31164..5f1b02d98 100644 --- a/src/gui/widgets/chattab.cpp +++ b/src/gui/widgets/chattab.cpp @@ -311,9 +311,17 @@ void ChatTab::chatLog(std::string line, Own own, && !Client::getInputFocused())))) { if (own == BY_GM) + { + if (chatWindow) + chatWindow->unHideWindow(); sound.playGuiSound(SOUND_GLOBAL); + } else if (own != BY_SERVER) + { + if (chatWindow) + chatWindow->unHideWindow(); playNewMessageSound(); + } } } } -- cgit v1.2.3-70-g09d2