diff options
author | Thorbjørn Lindeijer <thorbjorn@lindeijer.nl> | 2012-01-15 23:56:26 +0100 |
---|---|---|
committer | Thorbjørn Lindeijer <thorbjorn@lindeijer.nl> | 2012-01-16 19:42:45 +0100 |
commit | 81306cf16bd4660b868f24a74b1e731c8a00af95 (patch) | |
tree | db3c905969884600792055d330851561bcf17384 /src/gui/chat.cpp | |
parent | bdb66839ca480fdfa51a7253fb8f95c3657381c1 (diff) | |
download | mana-client-81306cf16bd4660b868f24a74b1e731c8a00af95.tar.gz mana-client-81306cf16bd4660b868f24a74b1e731c8a00af95.tar.bz2 mana-client-81306cf16bd4660b868f24a74b1e731c8a00af95.tar.xz mana-client-81306cf16bd4660b868f24a74b1e731c8a00af95.zip |
Renamed some file names for consistency with the class names
This was already done by ManaPlus. It's a good idea anyway and it makes
comparing the code a little easier.
Reviewed-by: Yohann Ferreira
Diffstat (limited to 'src/gui/chat.cpp')
-rw-r--r-- | src/gui/chat.cpp | 543 |
1 files changed, 0 insertions, 543 deletions
diff --git a/src/gui/chat.cpp b/src/gui/chat.cpp deleted file mode 100644 index 92386e76..00000000 --- a/src/gui/chat.cpp +++ /dev/null @@ -1,543 +0,0 @@ -/* - * The Mana Client - * Copyright (C) 2004-2009 The Mana World Development Team - * Copyright (C) 2009-2010 The Mana Developers - * - * This file is part of The Mana Client. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "chat.h" - -#include "actorspritemanager.h" -#include "channel.h" -#include "channelmanager.h" -#include "configuration.h" -#include "localplayer.h" -#include "party.h" -#include "playerrelations.h" - -#include "gui/recorder.h" -#include "gui/setup.h" -#include "gui/sdlinput.h" - -#include "gui/widgets/channeltab.h" -#include "gui/widgets/chattab.h" -#include "gui/widgets/itemlinkhandler.h" -#include "gui/widgets/scrollarea.h" -#include "gui/widgets/tabbedarea.h" -#include "gui/widgets/textfield.h" -#include "gui/widgets/whispertab.h" - -#include "net/chathandler.h" -#include "net/net.h" - -#include "utils/dtor.h" -#include "utils/gettext.h" -#include "utils/stringutils.h" - -#include <guichan/focushandler.hpp> -#include <guichan/focuslistener.hpp> - -#include <sstream> - -/** - * The chat input hides when it loses focus. It is also invisible by default. - */ -class ChatInput : public TextField, public gcn::FocusListener -{ - public: - ChatInput(): - TextField("", false) - { - setVisible(false); - addFocusListener(this); - } - - /** - * Called if the chat input loses focus. It will set itself to - * invisible as result. - */ - void focusLost(const gcn::Event &event) - { - setVisible(false); - } -}; - -class ChatAutoComplete : public AutoCompleteLister -{ - void getAutoCompleteList(std::vector<std::string> &list) const - { - ChatTab *tab = static_cast<ChatTab*>(chatWindow->mChatTabs - ->getSelectedTab()); - - return tab->getAutoCompleteList(list); - } -}; - -ChatWindow::ChatWindow(): - Window(_("Chat")), - mHistory(new TextHistory()), - mAutoComplete(new ChatAutoComplete), - mTmpVisible(false) -{ - listen(Event::ChatChannel); - listen(Event::NoticesChannel); - - setWindowName("Chat"); - - setupWindow->registerWindowForReset(this); - - // no title presented, title bar is padding so window can be moved. - gcn::Window::setTitleBarHeight(gcn::Window::getPadding() + 4); - setShowTitle(false); - setResizable(true); - setDefaultVisible(true); - setSaveVisible(true); - setDefaultSize(600, 123, ImageRect::LOWER_LEFT); - setMinWidth(150); - setMinHeight(90); - - mItemLinkHandler = new ItemLinkHandler; - - mChatInput = new ChatInput; - mChatInput->setActionEventId("chatinput"); - mChatInput->addActionListener(this); - - mChatTabs = new TabbedArea; - - place(0, 0, mChatTabs, 3, 3); - place(0, 3, mChatInput, 3); - - loadWindowState(); - - mChatInput->setHistory(mHistory); - mChatInput->setAutoComplete(mAutoComplete); - - mReturnToggles = config.getBoolValue("ReturnToggles"); - - mRecorder = new Recorder(this); -} - -ChatWindow::~ChatWindow() -{ - config.setValue("ReturnToggles", mReturnToggles); - delete mRecorder; - removeAllWhispers(); - delete mItemLinkHandler; - delete mHistory; - delete mAutoComplete; -} - -void ChatWindow::resetToDefaultSize() -{ - mRecorder->resetToDefaultSize(); - Window::resetToDefaultSize(); -} - -ChatTab *ChatWindow::getFocused() const -{ - return static_cast<ChatTab*>(mChatTabs->getSelectedTab()); -} - -void ChatWindow::clearTab(ChatTab *tab) -{ - if (tab) - tab->clearText(); -} - -void ChatWindow::clearTab() -{ - clearTab(getFocused()); -} - -void ChatWindow::prevTab() -{ - int tab = mChatTabs->getSelectedTabIndex(); - - if (tab == 0) - tab = mChatTabs->getNumberOfTabs(); - tab--; - - mChatTabs->setSelectedTab(tab); -} - -void ChatWindow::nextTab() -{ - int tab = mChatTabs->getSelectedTabIndex(); - - tab++; - if (tab == mChatTabs->getNumberOfTabs()) - tab = 0; - - mChatTabs->setSelectedTab(tab); -} - -void ChatWindow::action(const gcn::ActionEvent &event) -{ - if (event.getId() == "chatinput") - { - std::string message = mChatInput->getText(); - - if (!message.empty()) - { - // Send the message to the server - chatInput(message); - - // Clear the text from the chat input - mChatInput->setText(""); - } - - if (message.empty() || !mReturnToggles) - { - // Remove focus and hide input - mFocusHandler->focusNone(); - - // If the chatWindow is shown up because you want to send a message - // It should hide now - if (mTmpVisible) - setVisible(false); - } - } -} - -bool ChatWindow::requestChatFocus() -{ - // Make sure chatWindow is visible - if (!isVisible()) - { - setVisible(true); - - /* - * This is used to hide chatWindow after sending the message. There is - * a trick here, because setVisible will set mTmpVisible to false, you - * have to put this sentence *after* setVisible, not before it - */ - mTmpVisible = true; - } - - // Don't do anything else if the input is already visible and has focus - if (mChatInput->isVisible() && mChatInput->isFocused()) - return false; - - // Give focus to the chat input - mChatInput->setVisible(true); - mChatInput->requestFocus(); - return true; -} - -bool ChatWindow::isInputFocused() const -{ - return mChatInput->isFocused(); -} - -void ChatWindow::removeTab(ChatTab *tab) -{ - mChatTabs->removeTab(tab); -} - -void ChatWindow::addTab(ChatTab *tab) -{ - // Make sure we don't end up with duplicates in the gui - // TODO - - mChatTabs->addTab(tab, tab->mScrollArea); - - // Update UI - logic(); -} - -void ChatWindow::removeWhisper(const std::string &nick) -{ - std::string tempNick = nick; - toLower(tempNick); - mWhispers.erase(tempNick); -} - -void ChatWindow::removeAllWhispers() -{ - TabMap::iterator iter; - std::list<ChatTab*> tabs; - - for (iter = mWhispers.begin(); iter != mWhispers.end(); ++iter) - { - tabs.push_back(iter->second); - } - - for (std::list<ChatTab*>::iterator it = tabs.begin(); - it != tabs.end(); ++it) - { - delete *it; - } - - mWhispers.clear(); -} - -void ChatWindow::chatInput(const std::string &msg) -{ - ChatTab *tab = getFocused(); - tab->chatInput(msg); -} - -void ChatWindow::doPresent() -{ - const ActorSprites &actors = actorSpriteManager->getAll(); - std::string response = ""; - int playercount = 0; - - for (ActorSpritesConstIterator it = actors.begin(), it_end = actors.end(); - it != it_end; it++) - { - if ((*it)->getType() == ActorSprite::PLAYER) - { - if (!response.empty()) - { - response += ", "; - } - response += static_cast<Being*>(*it)->getName(); - ++playercount; - } - } - - std::string log = strprintf(_("Present: %s; %d players are present."), - response.c_str(), playercount); - - if (mRecorder->isRecording()) - { - // Get the current system time - time_t t; - time(&t); - - // Format the time string properly - std::ostringstream timeStr; - timeStr << "[" << ((((t / 60) / 60) % 24 < 10) ? "0" : "") - << (int) (((t / 60) / 60) % 24) - << ":" << (((t / 60) % 60 < 10) ? "0" : "") - << (int) ((t / 60) % 60) - << "] "; - - mRecorder->record(timeStr.str() + log); - getFocused()->chatLog(_("Attendance written to record log."), - BY_SERVER, true); - } - else - { - getFocused()->chatLog(log, BY_SERVER); - } -} - -void ChatWindow::scroll(int amount) -{ - if (!isVisible()) - return; - - ChatTab *tab = getFocused(); - if (tab) - tab->scroll(amount); -} - -void ChatWindow::mousePressed(gcn::MouseEvent &event) -{ - Window::mousePressed(event); - - if (event.isConsumed()) - return; - - mMoved = event.getY() <= getFocused()->getHeight(); - mDragOffsetX = event.getX(); - mDragOffsetY = event.getY(); - -} - -void ChatWindow::mouseDragged(gcn::MouseEvent &event) -{ - Window::mouseDragged(event); - - if (event.isConsumed()) - return; - - if (isMovable() && mMoved) - { - int newX = std::max(0, getX() + event.getX() - mDragOffsetX); - int newY = std::max(0, getY() + event.getY() - mDragOffsetY); - newX = std::min(graphics->getWidth() - getWidth(), newX); - newY = std::min(graphics->getHeight() - getHeight(), newY); - setPosition(newX, newY); - } -} - -void ChatWindow::event(Event::Channel channel, const Event &event) -{ - if (channel == Event::NoticesChannel) - { - if (event.getType() == Event::ServerNotice) - localChatTab->chatLog(event.getString("message"), BY_SERVER); - } - else if (channel == Event::ChatChannel) - { - if (event.getType() == Event::Whisper) - { - whisper(event.getString("nick"), event.getString("message")); - } - else if (event.getType() == Event::WhisperError) - { - whisper(event.getString("nick"), - event.getString("error"), BY_SERVER); - } - else if (event.getType() == Event::Player) - { - localChatTab->chatLog(event.getString("message"), BY_PLAYER); - } - else if (event.getType() == Event::Announcement) - { - // Show on local tab - localChatTab->chatLog(event.getString("message"), BY_GM); - // Spread over channels - for (std::list<Channel*>::iterator - it = channelManager->mChannels.begin(), - it_end = channelManager->mChannels.end(); - it != it_end; ++it) - { - if (*it) - (*it)->getTab()->chatLog(event.getString("message"), BY_GM); - } - // Spread over whispers - for (TabMap::const_iterator it = mWhispers.begin(), - it_end = mWhispers.end(); it != it_end; ++it) - { - if (it->second) - it->second->chatLog(event.getString("message"), BY_GM); - } - } - else if (event.getType() == Event::Being) - { - if (event.getInt("permissions") & PlayerRelation::SPEECH_LOG) - localChatTab->chatLog(event.getString("message"), BY_OTHER); - } - } -} - -void ChatWindow::addInputText(const std::string &text) -{ - const int caretPos = mChatInput->getCaretPosition(); - const std::string inputText = mChatInput->getText(); - - std::ostringstream ss; - ss << inputText.substr(0, caretPos) << text << " "; - ss << inputText.substr(caretPos); - - mChatInput->setText(ss.str()); - mChatInput->setCaretPosition(caretPos + text.length() + 1); - requestChatFocus(); -} - -void ChatWindow::addItemText(const std::string &item) -{ - std::ostringstream text; - text << "[" << item << "]"; - addInputText(text.str()); -} - -void ChatWindow::setVisible(bool isVisible) -{ - Window::setVisible(isVisible); - - /* - * For whatever reason, if setVisible is called, the mTmpVisible effect - * should be disabled. - */ - mTmpVisible = false; -} - -void ChatWindow::setRecordingFile(const std::string &msg) -{ - mRecorder->setRecordingFile(msg); -} - -void ChatWindow::whisper(const std::string &nick, - const std::string &mes, Own own) -{ - if (mes.empty()) - return; - - std::string playerName = local_player->getName(); - std::string tempNick = nick; - - toLower(playerName); - toLower(tempNick); - - if (tempNick.compare(playerName) == 0) - return; - - ChatTab *tab = 0; - TabMap::const_iterator i = mWhispers.find(tempNick); - - if (i != mWhispers.end()) - tab = i->second; - else if (config.getBoolValue("whispertab")) - tab = addWhisperTab(nick); - - if (tab) - { - if (own == BY_PLAYER) - { - tab->chatInput(mes); - } - else if (own == BY_SERVER) - { - tab->chatLog(mes); - } - else - { - tab->chatLog(nick, mes); - local_player->afkRespond(tab, nick); - } - } - else - { - if (own == BY_PLAYER) - { - Net::getChatHandler()->privateMessage(nick, mes); - - localChatTab->chatLog(strprintf(_("Whispering to %s: %s"), - nick.c_str(), mes.c_str()), BY_PLAYER); - } - else - { - localChatTab->chatLog(nick + " : " + mes, ACT_WHISPER, false); - } - } -} - -ChatTab *ChatWindow::addWhisperTab(const std::string &nick, bool switchTo) -{ - std::string playerName = local_player->getName(); - std::string tempNick = nick; - - toLower(playerName); - toLower(tempNick); - - if (mWhispers.find(tempNick) != mWhispers.end() - || tempNick.compare(playerName) == 0) - return NULL; - - ChatTab *ret = new WhisperTab(nick); - mWhispers[tempNick] = ret; - - if (switchTo) - mChatTabs->setSelectedTab(ret); - - return ret; -} |