From 120193fb0bb30c6c881b0d5e5aee9f62314f5753 Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Sat, 22 Aug 2009 21:57:03 +0200 Subject: [PATCH] fixed shuffling, more chat widget code --- cockatrice/src/chatwidget.cpp | 105 ++++++++++++++++++++++++++++++-- cockatrice/src/chatwidget.h | 18 +++++- cockatrice/src/client.h | 3 + cockatrice/src/player.cpp | 2 + cockatrice/src/window_main.cpp | 3 + servatrice/servatrice.pro | 2 +- servatrice/src/chatchannel.cpp | 2 +- servatrice/src/serversocket.cpp | 5 +- 8 files changed, 131 insertions(+), 9 deletions(-) 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; }