diff --git a/cockatrice/src/chatwidget.cpp b/cockatrice/src/chatwidget.cpp
index 3d044d58..22ff1469 100644
--- a/cockatrice/src/chatwidget.cpp
+++ b/cockatrice/src/chatwidget.cpp
@@ -2,8 +2,8 @@
#include "chatwidget.h"
#include "client.h"
-ChannelWidget::ChannelWidget(QWidget *parent)
- : QWidget(parent)
+ChannelWidget::ChannelWidget(const QString &_name, QWidget *parent)
+ : QWidget(parent), name(_name)
{
playerList = new QListWidget;
@@ -15,20 +15,56 @@ ChannelWidget::ChannelWidget(QWidget *parent)
vbox->addWidget(sayEdit);
QHBoxLayout *hbox = new QHBoxLayout;
- hbox->addLayout(vbox);
+ hbox->addLayout(vbox, 1);
hbox->addWidget(playerList);
setLayout(hbox);
}
+void ChannelWidget::joinEvent(const QString &playerName)
+{
+ textEdit->append(tr("%1 has joined the channel.").arg(playerName));
+ playerList->addItem(playerName);
+}
+
+void ChannelWidget::listPlayersEvent(const QString &playerName)
+{
+ playerList->addItem(playerName);
+}
+
+void ChannelWidget::leaveEvent(const QString &playerName)
+{
+ textEdit->append(tr("%1 has left the channel.").arg(playerName));
+ for (int i = 0; i < playerList->count(); ++i)
+ if (playerList->item(i)->text() == playerName) {
+ delete playerList->takeItem(i);
+ break;
+ }
+}
+
+void ChannelWidget::sayEvent(const QString &playerName, const QString &s)
+{
+ textEdit->append(QString("%1: %2").arg(playerName).arg(s));
+}
+
ChatWidget::ChatWidget(Client *_client, QWidget *parent)
: QWidget(parent), client(_client)
{
channelList = new QTreeWidget;
+
+ joinButton = new QPushButton;
+ connect(joinButton, SIGNAL(clicked()), this, SLOT(joinClicked()));
+ QHBoxLayout *buttonLayout = new QHBoxLayout;
+ buttonLayout->addStretch();
+ buttonLayout->addWidget(joinButton);
+ QVBoxLayout *leftLayout = new QVBoxLayout;
+ leftLayout->addWidget(channelList);
+ leftLayout->addLayout(buttonLayout);
+
tab = new QTabWidget;
QHBoxLayout *hbox = new QHBoxLayout;
- hbox->addWidget(channelList);
+ hbox->addLayout(leftLayout);
hbox->addWidget(tab, 1);
retranslateUi();
@@ -37,6 +73,8 @@ ChatWidget::ChatWidget(Client *_client, QWidget *parent)
void ChatWidget::retranslateUi()
{
+ joinButton->setText(tr("Joi&n"));
+
QTreeWidgetItem *header = channelList->headerItem();
Q_ASSERT(header != 0);
header->setText(0, tr("Channel"));
@@ -68,18 +106,77 @@ void ChatWidget::chatEvent(const ChatEventData &data)
break;
}
case eventChatJoinChannel: {
+ if (msg.size() != 2)
+ break;
+ ChannelWidget *w = getChannel(msg[0]);
+ if (!w)
+ break;
+ w->joinEvent(msg[1]);
break;
}
case eventChatListPlayers: {
+ if (msg.size() != 2)
+ break;
+ ChannelWidget *w = getChannel(msg[0]);
+ if (!w)
+ break;
+ w->listPlayersEvent(msg[1]);
break;
}
case eventChatLeaveChannel: {
+ if (msg.size() != 2)
+ break;
+ ChannelWidget *w = getChannel(msg[0]);
+ if (!w)
+ break;
+ w->leaveEvent(msg[1]);
break;
}
case eventChatSay: {
+ if (msg.size() != 3)
+ break;
+ ChannelWidget *w = getChannel(msg[0]);
+ if (!w)
+ break;
+ w->sayEvent(msg[1], msg[2]);
break;
}
default: {
}
}
}
+
+void ChatWidget::joinClicked()
+{
+ QTreeWidgetItem *twi = channelList->currentItem();
+ if (!twi)
+ return;
+ QString channelName = twi->text(0);
+ if (getChannel(channelName))
+ return;
+
+ PendingCommand *pc = client->chatJoinChannel(channelName);
+ pc->setExtraData(channelName);
+ connect(pc, SIGNAL(finished(ServerResponse)), this, SLOT(joinFinished(ServerResponse)));
+}
+
+void ChatWidget::joinFinished(ServerResponse resp)
+{
+ if (resp != RespOk)
+ return;
+
+ PendingCommand *pc = qobject_cast(sender());
+ QString channelName = pc->getExtraData();
+ ChannelWidget *cw = new ChannelWidget(channelName);
+ tab->addTab(cw, channelName);
+}
+
+ChannelWidget *ChatWidget::getChannel(const QString &name)
+{
+ for (int i = 0; i < tab->count(); ++i) {
+ ChannelWidget *cw = qobject_cast(tab->widget(i));
+ if (cw->getName() == name)
+ return cw;
+ }
+ return 0;
+}
diff --git a/cockatrice/src/chatwidget.h b/cockatrice/src/chatwidget.h
index 3f1a6353..12178cdb 100644
--- a/cockatrice/src/chatwidget.h
+++ b/cockatrice/src/chatwidget.h
@@ -3,31 +3,45 @@
#include
#include "servereventdata.h"
+#include "client.h"
class QListWidget;
class QTextEdit;
class QLineEdit;
class QTreeWidget;
class QTabWidget;
-class Client;
+class QPushButton;
class ChannelWidget : public QWidget {
+ Q_OBJECT
private:
QListWidget *playerList;
QTextEdit *textEdit;
QLineEdit *sayEdit;
+ QString name;
public:
- ChannelWidget(QWidget *parent = 0);
+ ChannelWidget(const QString &_name, QWidget *parent = 0);
+ const QString &getName() const { return name; }
+
+ void joinEvent(const QString &playerName);
+ void listPlayersEvent(const QString &playerName);
+ void leaveEvent(const QString &playerName);
+ void sayEvent(const QString &playerName, const QString &s);
};
class ChatWidget : public QWidget {
Q_OBJECT
private:
QTreeWidget *channelList;
+ QPushButton *joinButton;
QTabWidget *tab;
Client *client;
+
+ ChannelWidget *getChannel(const QString &name);
private slots:
void chatEvent(const ChatEventData &data);
+ void joinClicked();
+ void joinFinished(ServerResponse resp);
public:
ChatWidget(Client *_client, QWidget *parent = 0);
void retranslateUi();
diff --git a/cockatrice/src/client.h b/cockatrice/src/client.h
index 4abde05e..9aac7c76 100644
--- a/cockatrice/src/client.h
+++ b/cockatrice/src/client.h
@@ -33,6 +33,7 @@ private:
QString cmd;
int msgid;
int time;
+ QString extraData;
signals:
void finished(ServerResponse resp);
void timeout();
@@ -42,6 +43,8 @@ public slots:
public:
int getMsgId() const { return msgid; }
QString getCmd() const { return cmd; }
+ const QString &getExtraData() const { return extraData; }
+ void setExtraData(const QString &_extraData) { extraData = _extraData; }
PendingCommand(const QString &_cmd, int _msgid, QObject *parent = 0);
};
diff --git a/cockatrice/src/player.cpp b/cockatrice/src/player.cpp
index 22c66602..36b039d0 100644
--- a/cockatrice/src/player.cpp
+++ b/cockatrice/src/player.cpp
@@ -64,6 +64,8 @@ Player::Player(const QString &_name, int _id, QPointF _base, bool _local, CardDa
libraryMenu->addAction(aDrawCard);
libraryMenu->addAction(aDrawCards);
libraryMenu->addSeparator();
+ libraryMenu->addAction(aShuffle);
+ libraryMenu->addSeparator();
libraryMenu->addAction(aViewLibrary);
libraryMenu->addAction(aViewTopCards);
zones.findZone("deck")->setMenu(libraryMenu, aDrawCard);
diff --git a/cockatrice/src/window_main.cpp b/cockatrice/src/window_main.cpp
index 4e1b1f54..412e8d44 100644
--- a/cockatrice/src/window_main.cpp
+++ b/cockatrice/src/window_main.cpp
@@ -87,12 +87,15 @@ void MainWindow::statusChanged(ProtocolStatus _status)
phasesToolbar->setActivePhase(-1);
phasesToolbar->setEnabled(false);
+ view->hide();
gameSelector->enableGameList();
chatWidget->enableChat();
break;
}
case StatusPlaying:
+ chatWidget->disableChat();
phasesToolbar->setEnabled(true);
+ view->show();
break;
default:
break;
diff --git a/servatrice/servatrice.pro b/servatrice/servatrice.pro
index 89d87379..120d7a42 100755
--- a/servatrice/servatrice.pro
+++ b/servatrice/servatrice.pro
@@ -9,7 +9,7 @@ INCLUDEPATH += . src
MOC_DIR = build
OBJECTS_DIR = build
-# CONFIG += qt debug
+CONFIG += qt debug
QT += network sql
QT -= gui
diff --git a/servatrice/src/chatchannel.cpp b/servatrice/src/chatchannel.cpp
index f8f1528e..5f33793b 100644
--- a/servatrice/src/chatchannel.cpp
+++ b/servatrice/src/chatchannel.cpp
@@ -11,7 +11,7 @@ void ChatChannel::addPlayer(ServerSocket *player)
QString str = QString("chat|join_channel|%1|%2").arg(name).arg(player->getPlayerName());
for (int i = 0; i < size(); ++i)
at(i)->msg(str);
-
+
append(player);
for (int i = 0; i < size(); ++i)
diff --git a/servatrice/src/serversocket.cpp b/servatrice/src/serversocket.cpp
index dbc393b9..824f6d90 100644
--- a/servatrice/src/serversocket.cpp
+++ b/servatrice/src/serversocket.cpp
@@ -48,6 +48,8 @@ ServerSocket::~ServerSocket()
server->removePlayer(this);
if (game)
game->removePlayer(this);
+ for (int i = 0; i < chatChannels.size(); ++i)
+ chatChannels[i]->removePlayer(this);
}
int ServerSocket::newCardId()
@@ -256,9 +258,10 @@ ReturnMessage::ReturnCode ServerSocket::cmdChatJoinChannel(const QList
QList allChannels = server->getChatChannelList();
for (int i = 0; i < allChannels.size(); ++i)
if (allChannels[i]->getName() == params[0]) {
+ remsg->send(ReturnMessage::ReturnOk);
allChannels[i]->addPlayer(this);
chatChannels << allChannels[i];
- return ReturnMessage::ReturnOk;
+ return ReturnMessage::ReturnNothing;
}
return ReturnMessage::ReturnNameNotFound;
}