fixed shuffling, more chat widget code
This commit is contained in:
parent
947cd1736c
commit
120193fb0b
8 changed files with 131 additions and 9 deletions
|
@ -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("<font color=\"red\">%1:</font> %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<PendingCommand *>(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<ChannelWidget *>(tab->widget(i));
|
||||
if (cw->getName() == name)
|
||||
return cw;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -3,31 +3,45 @@
|
|||
|
||||
#include <QWidget>
|
||||
#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();
|
||||
|
|
|
@ -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);
|
||||
};
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -9,7 +9,7 @@ INCLUDEPATH += . src
|
|||
MOC_DIR = build
|
||||
OBJECTS_DIR = build
|
||||
|
||||
# CONFIG += qt debug
|
||||
CONFIG += qt debug
|
||||
QT += network sql
|
||||
QT -= gui
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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<QVariant>
|
|||
QList<ChatChannel *> 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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue