diff --git a/cockatrice/src/chatwidget.cpp b/cockatrice/src/chatwidget.cpp index 22ff1469..ad1f3b34 100644 --- a/cockatrice/src/chatwidget.cpp +++ b/cockatrice/src/chatwidget.cpp @@ -2,13 +2,15 @@ #include "chatwidget.h" #include "client.h" -ChannelWidget::ChannelWidget(const QString &_name, QWidget *parent) - : QWidget(parent), name(_name) +ChannelWidget::ChannelWidget(Client *_client, const QString &_name, QWidget *parent) + : QWidget(parent), client(_client), name(_name) { playerList = new QListWidget; textEdit = new QTextEdit; + textEdit->setReadOnly(true); sayEdit = new QLineEdit; + connect(sayEdit, SIGNAL(returnPressed()), this, SLOT(sendMessage())); QVBoxLayout *vbox = new QVBoxLayout; vbox->addWidget(textEdit); @@ -21,6 +23,14 @@ ChannelWidget::ChannelWidget(const QString &_name, QWidget *parent) setLayout(hbox); } +void ChannelWidget::sendMessage() +{ + if (sayEdit->text().isEmpty()) + return; + client->chatSay(name, sayEdit->text()); + sayEdit->clear(); +} + void ChannelWidget::joinEvent(const QString &playerName) { textEdit->append(tr("%1 has joined the channel.").arg(playerName)); @@ -102,6 +112,14 @@ void ChatWidget::chatEvent(const ChatEventData &data) case eventChatListChannels: { if (msg.size() != 3) break; + for (int i = 0; i < channelList->topLevelItemCount(); ++i) { + QTreeWidgetItem *twi = channelList->topLevelItem(i); + if (twi->text(0) == msg[0]) { + twi->setText(1, msg[1]); + twi->setText(2, msg[2]); + return; + } + } channelList->addTopLevelItem(new QTreeWidgetItem(QStringList() << msg[0] << msg[1] << msg[2])); break; } @@ -167,7 +185,7 @@ void ChatWidget::joinFinished(ServerResponse resp) PendingCommand *pc = qobject_cast(sender()); QString channelName = pc->getExtraData(); - ChannelWidget *cw = new ChannelWidget(channelName); + ChannelWidget *cw = new ChannelWidget(client, channelName); tab->addTab(cw, channelName); } diff --git a/cockatrice/src/chatwidget.h b/cockatrice/src/chatwidget.h index 12178cdb..94bb8944 100644 --- a/cockatrice/src/chatwidget.h +++ b/cockatrice/src/chatwidget.h @@ -18,9 +18,12 @@ private: QListWidget *playerList; QTextEdit *textEdit; QLineEdit *sayEdit; + Client *client; QString name; +private slots: + void sendMessage(); public: - ChannelWidget(const QString &_name, QWidget *parent = 0); + ChannelWidget(Client *_client, const QString &_name, QWidget *parent = 0); const QString &getName() const { return name; } void joinEvent(const QString &playerName); diff --git a/cockatrice/src/window_main.cpp b/cockatrice/src/window_main.cpp index 412e8d44..d6c6af69 100644 --- a/cockatrice/src/window_main.cpp +++ b/cockatrice/src/window_main.cpp @@ -70,7 +70,7 @@ void MainWindow::statusChanged(ProtocolStatus _status) aRestartGame->setEnabled(false); aLeaveGame->setEnabled(false); phasesToolbar->setActivePhase(-1); - phasesToolbar->setEnabled(false); + phasesToolbar->hide(); emit logDisconnected(); break; case StatusLoggingIn: @@ -85,7 +85,7 @@ void MainWindow::statusChanged(ProtocolStatus _status) aRestartGame->setEnabled(false); aLeaveGame->setEnabled(false); phasesToolbar->setActivePhase(-1); - phasesToolbar->setEnabled(false); + phasesToolbar->hide(); view->hide(); gameSelector->enableGameList(); @@ -94,7 +94,7 @@ void MainWindow::statusChanged(ProtocolStatus _status) } case StatusPlaying: chatWidget->disableChat(); - phasesToolbar->setEnabled(true); + phasesToolbar->show(); view->show(); break; default: @@ -313,7 +313,7 @@ MainWindow::MainWindow(QTranslator *_translator, QWidget *parent) viewLayout->addWidget(view); phasesToolbar = new PhasesToolbar; - phasesToolbar->setEnabled(false); + phasesToolbar->hide(); QHBoxLayout *mainLayout = new QHBoxLayout; mainLayout->addWidget(phasesToolbar); diff --git a/servatrice/src/chatchannel.cpp b/servatrice/src/chatchannel.cpp index 5f33793b..fc621013 100644 --- a/servatrice/src/chatchannel.cpp +++ b/servatrice/src/chatchannel.cpp @@ -37,3 +37,8 @@ void ChatChannel::say(ServerSocket *player, const QString &s) for (int i = 0; i < size(); ++i) at(i)->msg(str); } + +QString ChatChannel::getChannelListLine() const +{ + return QString("chat|list_channels|%1|%2|%3").arg(name).arg(description).arg(size()); +} \ No newline at end of file diff --git a/servatrice/src/chatchannel.h b/servatrice/src/chatchannel.h index 822b8489..fdf254f4 100644 --- a/servatrice/src/chatchannel.h +++ b/servatrice/src/chatchannel.h @@ -20,6 +20,7 @@ public: void addPlayer(ServerSocket *player); void removePlayer(ServerSocket *player); void say(ServerSocket *player, const QString &s); + QString getChannelListLine() const; }; #endif diff --git a/servatrice/src/server.cpp b/servatrice/src/server.cpp index 3b477a69..30a0cd53 100644 --- a/servatrice/src/server.cpp +++ b/servatrice/src/server.cpp @@ -39,6 +39,9 @@ Server::Server(QObject *parent) chatChannelList << new ChatChannel("channel1", "testchannel 1"); chatChannelList << new ChatChannel("channel2", "testchannel 2"); + + for (int i = 0; i < chatChannelList.size(); ++i) + connect(chatChannelList[i], SIGNAL(channelInfoChanged()), this, SLOT(broadcastChannelUpdate())); } Server::~Server() @@ -163,6 +166,14 @@ void Server::broadcastGameListUpdate(ServerGame *game) players[i]->msg(line); } +void Server::broadcastChannelUpdate() +{ + QString line = qobject_cast(sender())->getChannelListLine(); + for (int i = 0; i < players.size(); ++i) + if (players[i]->getAcceptsChatChannelListChanges()) + players[i]->msg(line); +} + void Server::addClientToGame(int gameId, ServerSocket *client) { ServerGame *game = getGame(gameId); diff --git a/servatrice/src/server.h b/servatrice/src/server.h index 299a0d7a..62ac25f1 100644 --- a/servatrice/src/server.h +++ b/servatrice/src/server.h @@ -38,6 +38,7 @@ private slots: void addGame(const QString description, const QString password, const int maxPlayers, ServerSocket *creator); void addClientToGame(int gameId, ServerSocket *client); void gameClosing(); + void broadcastChannelUpdate(); public: Server(QObject *parent = 0); ~Server(); diff --git a/servatrice/src/serversocket.cpp b/servatrice/src/serversocket.cpp index 824f6d90..934eb74d 100644 --- a/servatrice/src/serversocket.cpp +++ b/servatrice/src/serversocket.cpp @@ -243,7 +243,7 @@ ReturnMessage::ReturnCode ServerSocket::cmdChatListChannels(const QList chatChannelList = server->getChatChannelList(); for (int i = 0; i < chatChannelList.size(); ++i) - msg(QString("chat|list_channels|%1|%2|%3").arg(chatChannelList[i]->getName()).arg(chatChannelList[i]->getDescription()).arg(chatChannelList[i]->size())); + msg(chatChannelList[i]->getChannelListLine()); acceptsChatChannelListChanges = true; return ReturnMessage::ReturnOk; @@ -306,6 +306,7 @@ ReturnMessage::ReturnCode ServerSocket::cmdCreateGame(const QList &par QString password = params[1].toString(); int maxPlayers = params[2].toInt(); acceptsGameListChanges = false; + acceptsChatChannelListChanges = false; leaveGame(); emit createGame(description, password, maxPlayers, this); return ReturnMessage::ReturnOk; @@ -318,6 +319,7 @@ ReturnMessage::ReturnCode ServerSocket::cmdJoinGame(const QList ¶m if (!server->checkGamePassword(gameId, password)) return ReturnMessage::ReturnPasswordWrong; acceptsGameListChanges = false; + acceptsChatChannelListChanges = false; leaveGame(); emit joinGame(gameId, this); return ReturnMessage::ReturnOk; diff --git a/servatrice/src/serversocket.h b/servatrice/src/serversocket.h index 5aee3148..08b1404b 100644 --- a/servatrice/src/serversocket.h +++ b/servatrice/src/serversocket.h @@ -123,6 +123,7 @@ public: void setPlayerId(int _id) { playerId = _id; } QString getPlayerName() const { return playerName; } bool getAcceptsGameListChanges() const { return acceptsGameListChanges; } + bool getAcceptsChatChannelListChanges() const { return acceptsChatChannelListChanges; } QStringList listCounters() const; QStringList listZones() const; void setupZones();