00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "gui/partywindow.h"
00023
00024 #include "gui/widgets/chattab.h"
00025
00026 #include "net/net.h"
00027 #include "net/partyhandler.h"
00028
00029 #include "utils/dtor.h"
00030 #include "utils/gettext.h"
00031 #include "utils/strprintf.h"
00032
00033 PartyWindow::PartyWindow() : Window(_("Party"))
00034 {
00035 setWindowName("Party");
00036 setVisible(false);
00037 setResizable(false);
00038 setSaveVisible(true);
00039 setCloseButton(true);
00040 setMinWidth(110);
00041 setMinHeight(200);
00042 setDefaultSize(620, 300, 110, 200);
00043
00044 loadWindowState();
00045 setVisible(false);
00046 }
00047
00048 PartyWindow::~PartyWindow()
00049 {
00050 delete_all(mMembers);
00051 }
00052
00053 void PartyWindow::draw(gcn::Graphics *graphics)
00054 {
00055 Window::draw(graphics);
00056 }
00057
00058 PartyMember *PartyWindow::findMember(int id) const
00059 {
00060 PartyList::const_iterator it = mMembers.find(id);
00061
00062 if (it == mMembers.end())
00063 return NULL;
00064 else
00065 return it->second;
00066 }
00067
00068 PartyMember *PartyWindow::findOrCreateMember(int id)
00069 {
00070 PartyMember *member = findMember(id);
00071
00072 if (!member)
00073 {
00074 member = new PartyMember;
00075 member->avatar = new Avatar("");
00076 mMembers[id] = member;
00077 add(member->avatar, 0, (mMembers.size() - 1) * 14);
00078 }
00079
00080 return member;
00081 }
00082
00083 int PartyWindow::findMember(const std::string &name) const
00084 {
00085 PartyList::const_iterator itr = mMembers.begin(),
00086 itr_end = mMembers.end();
00087
00088 while (itr != itr_end)
00089 {
00090 if ((*itr).second->name == name)
00091 {
00092 return (*itr).first;
00093 }
00094 ++itr;
00095 }
00096
00097 return -1;
00098 }
00099
00100 void PartyWindow::updateMember(int id, const std::string &memberName,
00101 bool leader, bool online)
00102 {
00103 PartyMember *player = findOrCreateMember(id);
00104 player->name = memberName;
00105 player->leader = leader;
00106 player->online = online;
00107 player->avatar->setName(memberName);
00108 player->avatar->setOnline(online);
00109
00110
00111 if (mMembers.size() > 0)
00112 {
00113 setVisible(true);
00114 }
00115 }
00116
00117 void PartyWindow::removeMember(int id)
00118 {
00119 mMembers.erase(id);
00120
00121
00122 if (mMembers.size() < 1)
00123 {
00124 setVisible(false);
00125 }
00126 }
00127
00128 void PartyWindow::removeMember(const std::string &name)
00129 {
00130 removeMember(findMember(name));
00131 }
00132
00133 void PartyWindow::updateOnlne(int id, bool online)
00134 {
00135 PartyMember *player = findMember(id);
00136
00137 if (!player)
00138 return;
00139
00140 player->online = online;
00141 player->avatar->setOnline(online);
00142 }
00143
00144 void PartyWindow::showPartyInvite(const std::string &inviter,
00145 const std::string &partyName)
00146 {
00147
00148 if (mPartyInviter != "")
00149 {
00150 localChatTab->chatLog("Received party request, but one already exists",
00151 BY_SERVER);
00152 return;
00153 }
00154
00155 std::string msg;
00156
00157 if (partyName.empty())
00158 msg = strprintf("%s has invited you to join their party",
00159 inviter.c_str());
00160 else
00161 msg = strprintf("%s has invited you to join the %s party",
00162 inviter.c_str(), partyName.c_str());
00163
00164 localChatTab->chatLog(msg, BY_SERVER);
00165
00166
00167 acceptDialog = new ConfirmDialog("Accept Party Invite", msg, this);
00168 acceptDialog->addActionListener(this);
00169
00170 mPartyInviter = inviter;
00171 }
00172
00173 void PartyWindow::action(const gcn::ActionEvent &event)
00174 {
00175 const std::string &eventId = event.getId();
00176
00177
00178 if (eventId == "yes")
00179 {
00180 localChatTab->chatLog("Accepted invite from " + mPartyInviter);
00181 Net::getPartyHandler()->inviteResponse(mPartyInviter, true);
00182 mPartyInviter = "";
00183 }
00184 else if (eventId == "no")
00185 {
00186 localChatTab->chatLog("Rejected invite from " + mPartyInviter);
00187 Net::getPartyHandler()->inviteResponse(mPartyInviter, false);
00188 mPartyInviter = "";
00189 }
00190 }
00191
00192 void PartyWindow::clear()
00193 {
00194 Window::clear();
00195
00196 mMembers.clear();
00197 }