diff options
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/commandhandler.cpp | 10 | ||||
-rw-r--r-- | src/gui/chat.cpp | 38 | ||||
-rw-r--r-- | src/gui/chat.h | 6 | ||||
-rw-r--r-- | src/gui/widgets/chattab.h | 2 | ||||
-rw-r--r-- | src/gui/widgets/whispertab.cpp | 77 | ||||
-rw-r--r-- | src/gui/widgets/whispertab.h | 54 | ||||
-rw-r--r-- | src/net/ea/chathandler.cpp | 11 |
8 files changed, 183 insertions, 17 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index ff2aae3d..4c5893ac 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -25,6 +25,8 @@ tmw_SOURCES = gui/widgets/avatar.cpp \ gui/widgets/tabbedarea.h \ gui/widgets/textpreview.cpp \ gui/widgets/textpreview.h \ + gui/widgets/whispertab.cpp \ + gui/widgets/whispertab.h \ gui/browserbox.cpp \ gui/browserbox.h \ gui/button.cpp \ diff --git a/src/commandhandler.cpp b/src/commandhandler.cpp index 96b66835..833ce718 100644 --- a/src/commandhandler.cpp +++ b/src/commandhandler.cpp @@ -383,15 +383,7 @@ void CommandHandler::handleMsg(const std::string &args) if (tempNick.compare(playerName) == 0 || args.empty()) return; - MessageOut outMsg(mNetwork); - outMsg.writeInt16(CMSG_CHAT_WHISPER); - outMsg.writeInt16(msg.length() + 28); - outMsg.writeString(recvnick, 24); - outMsg.writeString(msg, msg.length()); - - chatWindow->chatLog(strprintf(_("Whispering to %s: %s"), - recvnick.c_str(), msg.c_str()), - BY_PLAYER); + chatWindow->whisper(recvnick, msg, true); } else chatWindow->chatLog("Cannont send empty whispers!"); diff --git a/src/gui/chat.cpp b/src/gui/chat.cpp index 8961b704..174285c9 100644 --- a/src/gui/chat.cpp +++ b/src/gui/chat.cpp @@ -29,6 +29,7 @@ #include "sdlinput.h" #include "widgets/tabbedarea.h" +#include "widgets/whispertab.h" #include "../beingmanager.h" #include "../configuration.h" @@ -96,6 +97,7 @@ ChatWindow::~ChatWindow() delete mRecorder; #endif delete_all(mTabs); + delete_all(mWhispers); delete mItemLinkHandler; } @@ -137,6 +139,12 @@ void ChatWindow::widgetResized(const gcn::Event &event) void ChatWindow::logic() { Window::logic(); + + Tab *tab = getFocused(); + if (tab != currentTab) { + currentTab == tab; + adjustTabSize(); + } } void ChatWindow::chatLog(std::string line, int own, std::string channelName, @@ -394,3 +402,33 @@ void ChatWindow::setRecordingFile(const std::string &msg) { mRecorder->setRecordingFile(msg); } + +void ChatWindow::whisper(std::string nick, std::string mes, bool own) +{ + if (mes.length() == 0) return; + std::string playerName = player_node->getName(); + std::string tempNick = nick; + + toLower(playerName); + toLower(tempNick); + + if (tempNick.compare(playerName) == 0) + if (own) + ; + else + return; + + ChatTab *tab = mWhispers[tempNick]; + + if (!tab) + { + tab = new WhisperTab(tempNick); + mWhispers[tempNick] = tab; + mChatTabs->addTab(tab, tab->mScrollArea); + } + + if (own) + tab->chatSend(mes); + else + tab->chatLog(nick, mes); +} diff --git a/src/gui/chat.h b/src/gui/chat.h index 89bb033e..46358268 100644 --- a/src/gui/chat.h +++ b/src/gui/chat.h @@ -45,6 +45,7 @@ class ItemLinkHandler; #ifdef EATHENA_SUPPORT class Network; #endif +class WhisperTab; enum { @@ -227,8 +228,11 @@ class ChatWindow : public Window, void doPresent(); + void whisper(std::string nick, std::string mes, bool own = false); + protected: friend class ChatTab; + friend class WhisperTab; void adjustTabSize(); @@ -249,10 +253,12 @@ class ChatWindow : public Window, /** Tabbed area for holding each channel. */ TabbedArea *mChatTabs; + Tab *currentTab; typedef std::map<const std::string, ChatTab*> TabMap; /** Map each tab to its browser and scroll area. */ TabMap mTabs; + TabMap mWhispers; typedef std::list<std::string> History; typedef History::iterator HistoryIterator; diff --git a/src/gui/widgets/chattab.h b/src/gui/widgets/chattab.h index d102d7a0..9e2aff6b 100644 --- a/src/gui/widgets/chattab.h +++ b/src/gui/widgets/chattab.h @@ -90,7 +90,7 @@ class ChatTab : public Tab protected: friend class ChatWindow; - void sendChat(std::string &msg); + virtual void sendChat(std::string &msg); ScrollArea *mScrollArea; BrowserBox *mTextOutput; diff --git a/src/gui/widgets/whispertab.cpp b/src/gui/widgets/whispertab.cpp new file mode 100644 index 00000000..b67b74f8 --- /dev/null +++ b/src/gui/widgets/whispertab.cpp @@ -0,0 +1,77 @@ +/* + * The Mana World + * Copyright (C) 2008 The Mana World Development Team + * + * This file is part of The Mana World. + * + * 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include <guichan/widgets/label.hpp> + +#include "whispertab.h" + +#include "../../beingmanager.h" +#include "../../commandhandler.h" +#include "../../channel.h" +#include "../../configuration.h" +#include "../../game.h" +#include "../../localplayer.h" + +#ifdef TMWSERV_SUPPORT +#include "../../net/tmwserv/chatserver/chatserver.h" +#include "../../net/tmwserv/gameserver/player.h" +#else +#include "../../party.h" +#include "../../net/messageout.h" +#include "../../net/ea/protocol.h" +#endif + +#include "../../resources/iteminfo.h" +#include "../../resources/itemdb.h" + +#include "../../utils/dtor.h" +#include "../../utils/gettext.h" +#include "../../utils/strprintf.h" +#include "../../utils/stringutils.h" + +WhisperTab::WhisperTab(std::string nick) : ChatTab(nick), + mNick(nick) +{ +} + +WhisperTab::~WhisperTab() +{ +} + +void WhisperTab::sendChat(std::string &msg) { + if (msg.length() == 0) { + chatLog(_("Cannot send empty chat!"), BY_SERVER, false); + return; + } + +#ifdef TMWSERV_SUPPORT + Net::ChatServer::privMsg(mNick, msg); +#else + MessageOut outMsg(chatWindow->mNetwork); + outMsg.writeInt16(CMSG_CHAT_WHISPER); + outMsg.writeInt16(msg.length() + 28); + outMsg.writeString(mNick, 24); + outMsg.writeString(msg, msg.length()); +#endif + + chatLog(strprintf(_("%s: %s"), player_node->getName().c_str(), + msg.c_str()), BY_PLAYER, false); +} diff --git a/src/gui/widgets/whispertab.h b/src/gui/widgets/whispertab.h new file mode 100644 index 00000000..66ec2720 --- /dev/null +++ b/src/gui/widgets/whispertab.h @@ -0,0 +1,54 @@ +/* + * The Mana World + * Copyright (C) 2009 The Mana World Development Team + * + * This file is part of The Mana World. + * + * 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef WHISPERTAB_H +#define WHISPERTAB_H + +#include "chattab.h" + +class Channel; + +/** + * A tab for whispers from a single nick. + */ +class WhisperTab : public ChatTab +{ + public: + /** + * Constructor. + */ + WhisperTab(std::string nick); + + /** + * Destructor. + */ + ~WhisperTab(); + + std::string getNick() { return mNick; } + + protected: + void sendChat(std::string &msg); + + private: + std::string mNick; +}; + +#endif // CHANNELTAB_H diff --git a/src/net/ea/chathandler.cpp b/src/net/ea/chathandler.cpp index 4842c86f..aaf56555 100644 --- a/src/net/ea/chathandler.cpp +++ b/src/net/ea/chathandler.cpp @@ -89,15 +89,12 @@ void ChatHandler::handleMessage(MessageIn &msg) break; chatMsg = msg.readString(chatMsgLength); - if (nick != SERVER_NAME) - chatMsg = nick + " : " + chatMsg; - if (nick == SERVER_NAME) - chatWindow->chatLog(chatMsg, BY_SERVER); - else { + if (nick != SERVER_NAME) if (player_relations.hasPermission(nick, PlayerRelation::WHISPER)) - chatWindow->chatLog(chatMsg, ACT_WHISPER); - } + chatWindow->whisper(nick, chatMsg); + else + chatWindow->chatLog(chatMsg, BY_SERVER); break; |