diff options
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/partywindow.cpp | 81 | ||||
-rw-r--r-- | src/gui/partywindow.h | 33 |
2 files changed, 97 insertions, 17 deletions
diff --git a/src/gui/partywindow.cpp b/src/gui/partywindow.cpp index db066910..5ec1e6bf 100644 --- a/src/gui/partywindow.cpp +++ b/src/gui/partywindow.cpp @@ -22,43 +22,71 @@ */ #include "partywindow.h" +#include "chat.h" #include "../utils/gettext.h" +#include "../net/chatserver/party.h" PartyWindow::PartyWindow() : Window(_("Party")) { setVisible(false); } +PartyWindow::~PartyWindow() +{ + PartyList::iterator itr = mPartyMembers.begin(), + itr_end = mPartyMembers.end(); + + while (itr != itr_end) + { + delete (*itr); + } + + mPartyMembers.clear(); +} + void PartyWindow::draw(gcn::Graphics *graphics) { } -void PartyWindow::addPartyMember(Player *player) +void PartyWindow::addPartyMember(const std::string &memberName) { - PartyList::iterator itr = std::find(mPartyMembers.begin(), - mPartyMembers.end(), - player); - if (itr == mPartyMembers.end()) + PartyMember *player = new PartyMember; + PartyList::iterator itr = mPartyMembers.begin(), + itr_end = mPartyMembers.end(); + + while (itr != itr_end) { - mPartyMembers.push_back(player); + if ((*itr)->name == memberName) + { + return; + } + ++itr; } + player->name = memberName; + mPartyMembers.push_back(player); + if (mPartyMembers.size() > 1) { setVisible(true); } } -void PartyWindow::removePartyMember(Player *player) +void PartyWindow::removePartyMember(const std::string &memberName) { - PartyList::iterator itr = std::find(mPartyMembers.begin(), - mPartyMembers.end(), - player); - if (itr != mPartyMembers.end()) + PartyList::iterator itr = mPartyMembers.begin(), + itr_end = mPartyMembers.end(); + + while (itr != itr_end) { - mPartyMembers.erase(itr); + if ((*itr)->name == memberName) + { + mPartyMembers.erase(itr); + break; + } + ++itr; } if (mPartyMembers.size() < 1) @@ -69,5 +97,34 @@ void PartyWindow::removePartyMember(Player *player) void PartyWindow::showPartyInvite(const std::string &inviter) { + if (mPartyInviter != "") + { + chatWindow->chatLog("Received party request, but one already exists", + BY_SERVER); + return; + } + std::string msg = inviter + " has invited you to join their party"; + chatWindow->chatLog(msg, BY_SERVER); + + acceptDialog = new ConfirmDialog("Accept Party Invite", msg, this); + acceptDialog->addActionListener(this); + + mPartyInviter = inviter; +} + +void PartyWindow::action(const gcn::ActionEvent &event) +{ + const std::string &eventId = event.getId(); + if (eventId == "yes") + { + Net::ChatServer::Party::acceptInvite(mPartyInviter); + mPartyInviter = ""; + delete acceptDialog; + } + else if (eventId == "no") + { + mPartyInviter = ""; + delete acceptDialog; + } } diff --git a/src/gui/partywindow.h b/src/gui/partywindow.h index b74b1411..fe126c2e 100644 --- a/src/gui/partywindow.h +++ b/src/gui/partywindow.h @@ -25,18 +25,29 @@ #define _TMW_PARTYWINDOW_H #include "window.h" +#include "confirm_dialog.h" #include <string> #include <vector> -class Player; +#include <guichan/actionevent.hpp> +#include <guichan/actionlistener.hpp> + +/** + * Party Member + * Used for storing players in the party + */ +struct PartyMember +{ + std::string name; +}; /** * Party Window. * * \ingroup Interface */ -class PartyWindow : public Window +class PartyWindow : public Window, gcn::ActionListener { public: /** @@ -45,6 +56,11 @@ class PartyWindow : public Window PartyWindow(); /** + * Release all the players created + */ + ~PartyWindow(); + + /** * Draws the party window */ void draw(gcn::Graphics *graphics); @@ -52,21 +68,28 @@ class PartyWindow : public Window /** * Add party member */ - void addPartyMember(Player *player); + void addPartyMember(const std::string &memberName); /** * Remove party member */ - void removePartyMember(Player *player); + void removePartyMember(const std::string &memberName); /** * Show party invite */ void showPartyInvite(const std::string &inviter); + /** + * Handle events + */ + void action(const gcn::ActionEvent &event); + private: - typedef std::vector<Player*> PartyList; + typedef std::vector<PartyMember*> PartyList; PartyList mPartyMembers; + std::string mPartyInviter; + ConfirmDialog *acceptDialog; }; extern PartyWindow *partyWindow; |