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 "chatwidget.h"
|
||||||
#include "client.h"
|
#include "client.h"
|
||||||
|
|
||||||
ChannelWidget::ChannelWidget(QWidget *parent)
|
ChannelWidget::ChannelWidget(const QString &_name, QWidget *parent)
|
||||||
: QWidget(parent)
|
: QWidget(parent), name(_name)
|
||||||
{
|
{
|
||||||
playerList = new QListWidget;
|
playerList = new QListWidget;
|
||||||
|
|
||||||
|
@ -15,20 +15,56 @@ ChannelWidget::ChannelWidget(QWidget *parent)
|
||||||
vbox->addWidget(sayEdit);
|
vbox->addWidget(sayEdit);
|
||||||
|
|
||||||
QHBoxLayout *hbox = new QHBoxLayout;
|
QHBoxLayout *hbox = new QHBoxLayout;
|
||||||
hbox->addLayout(vbox);
|
hbox->addLayout(vbox, 1);
|
||||||
hbox->addWidget(playerList);
|
hbox->addWidget(playerList);
|
||||||
|
|
||||||
setLayout(hbox);
|
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)
|
ChatWidget::ChatWidget(Client *_client, QWidget *parent)
|
||||||
: QWidget(parent), client(_client)
|
: QWidget(parent), client(_client)
|
||||||
{
|
{
|
||||||
channelList = new QTreeWidget;
|
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;
|
tab = new QTabWidget;
|
||||||
|
|
||||||
QHBoxLayout *hbox = new QHBoxLayout;
|
QHBoxLayout *hbox = new QHBoxLayout;
|
||||||
hbox->addWidget(channelList);
|
hbox->addLayout(leftLayout);
|
||||||
hbox->addWidget(tab, 1);
|
hbox->addWidget(tab, 1);
|
||||||
|
|
||||||
retranslateUi();
|
retranslateUi();
|
||||||
|
@ -37,6 +73,8 @@ ChatWidget::ChatWidget(Client *_client, QWidget *parent)
|
||||||
|
|
||||||
void ChatWidget::retranslateUi()
|
void ChatWidget::retranslateUi()
|
||||||
{
|
{
|
||||||
|
joinButton->setText(tr("Joi&n"));
|
||||||
|
|
||||||
QTreeWidgetItem *header = channelList->headerItem();
|
QTreeWidgetItem *header = channelList->headerItem();
|
||||||
Q_ASSERT(header != 0);
|
Q_ASSERT(header != 0);
|
||||||
header->setText(0, tr("Channel"));
|
header->setText(0, tr("Channel"));
|
||||||
|
@ -68,18 +106,77 @@ void ChatWidget::chatEvent(const ChatEventData &data)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case eventChatJoinChannel: {
|
case eventChatJoinChannel: {
|
||||||
|
if (msg.size() != 2)
|
||||||
|
break;
|
||||||
|
ChannelWidget *w = getChannel(msg[0]);
|
||||||
|
if (!w)
|
||||||
|
break;
|
||||||
|
w->joinEvent(msg[1]);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case eventChatListPlayers: {
|
case eventChatListPlayers: {
|
||||||
|
if (msg.size() != 2)
|
||||||
|
break;
|
||||||
|
ChannelWidget *w = getChannel(msg[0]);
|
||||||
|
if (!w)
|
||||||
|
break;
|
||||||
|
w->listPlayersEvent(msg[1]);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case eventChatLeaveChannel: {
|
case eventChatLeaveChannel: {
|
||||||
|
if (msg.size() != 2)
|
||||||
|
break;
|
||||||
|
ChannelWidget *w = getChannel(msg[0]);
|
||||||
|
if (!w)
|
||||||
|
break;
|
||||||
|
w->leaveEvent(msg[1]);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case eventChatSay: {
|
case eventChatSay: {
|
||||||
|
if (msg.size() != 3)
|
||||||
|
break;
|
||||||
|
ChannelWidget *w = getChannel(msg[0]);
|
||||||
|
if (!w)
|
||||||
|
break;
|
||||||
|
w->sayEvent(msg[1], msg[2]);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default: {
|
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 <QWidget>
|
||||||
#include "servereventdata.h"
|
#include "servereventdata.h"
|
||||||
|
#include "client.h"
|
||||||
|
|
||||||
class QListWidget;
|
class QListWidget;
|
||||||
class QTextEdit;
|
class QTextEdit;
|
||||||
class QLineEdit;
|
class QLineEdit;
|
||||||
class QTreeWidget;
|
class QTreeWidget;
|
||||||
class QTabWidget;
|
class QTabWidget;
|
||||||
class Client;
|
class QPushButton;
|
||||||
|
|
||||||
class ChannelWidget : public QWidget {
|
class ChannelWidget : public QWidget {
|
||||||
|
Q_OBJECT
|
||||||
private:
|
private:
|
||||||
QListWidget *playerList;
|
QListWidget *playerList;
|
||||||
QTextEdit *textEdit;
|
QTextEdit *textEdit;
|
||||||
QLineEdit *sayEdit;
|
QLineEdit *sayEdit;
|
||||||
|
QString name;
|
||||||
public:
|
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 {
|
class ChatWidget : public QWidget {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
private:
|
private:
|
||||||
QTreeWidget *channelList;
|
QTreeWidget *channelList;
|
||||||
|
QPushButton *joinButton;
|
||||||
QTabWidget *tab;
|
QTabWidget *tab;
|
||||||
Client *client;
|
Client *client;
|
||||||
|
|
||||||
|
ChannelWidget *getChannel(const QString &name);
|
||||||
private slots:
|
private slots:
|
||||||
void chatEvent(const ChatEventData &data);
|
void chatEvent(const ChatEventData &data);
|
||||||
|
void joinClicked();
|
||||||
|
void joinFinished(ServerResponse resp);
|
||||||
public:
|
public:
|
||||||
ChatWidget(Client *_client, QWidget *parent = 0);
|
ChatWidget(Client *_client, QWidget *parent = 0);
|
||||||
void retranslateUi();
|
void retranslateUi();
|
||||||
|
|
|
@ -33,6 +33,7 @@ private:
|
||||||
QString cmd;
|
QString cmd;
|
||||||
int msgid;
|
int msgid;
|
||||||
int time;
|
int time;
|
||||||
|
QString extraData;
|
||||||
signals:
|
signals:
|
||||||
void finished(ServerResponse resp);
|
void finished(ServerResponse resp);
|
||||||
void timeout();
|
void timeout();
|
||||||
|
@ -42,6 +43,8 @@ public slots:
|
||||||
public:
|
public:
|
||||||
int getMsgId() const { return msgid; }
|
int getMsgId() const { return msgid; }
|
||||||
QString getCmd() const { return cmd; }
|
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);
|
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(aDrawCard);
|
||||||
libraryMenu->addAction(aDrawCards);
|
libraryMenu->addAction(aDrawCards);
|
||||||
libraryMenu->addSeparator();
|
libraryMenu->addSeparator();
|
||||||
|
libraryMenu->addAction(aShuffle);
|
||||||
|
libraryMenu->addSeparator();
|
||||||
libraryMenu->addAction(aViewLibrary);
|
libraryMenu->addAction(aViewLibrary);
|
||||||
libraryMenu->addAction(aViewTopCards);
|
libraryMenu->addAction(aViewTopCards);
|
||||||
zones.findZone("deck")->setMenu(libraryMenu, aDrawCard);
|
zones.findZone("deck")->setMenu(libraryMenu, aDrawCard);
|
||||||
|
|
|
@ -87,12 +87,15 @@ void MainWindow::statusChanged(ProtocolStatus _status)
|
||||||
phasesToolbar->setActivePhase(-1);
|
phasesToolbar->setActivePhase(-1);
|
||||||
phasesToolbar->setEnabled(false);
|
phasesToolbar->setEnabled(false);
|
||||||
|
|
||||||
|
view->hide();
|
||||||
gameSelector->enableGameList();
|
gameSelector->enableGameList();
|
||||||
chatWidget->enableChat();
|
chatWidget->enableChat();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case StatusPlaying:
|
case StatusPlaying:
|
||||||
|
chatWidget->disableChat();
|
||||||
phasesToolbar->setEnabled(true);
|
phasesToolbar->setEnabled(true);
|
||||||
|
view->show();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -9,7 +9,7 @@ INCLUDEPATH += . src
|
||||||
MOC_DIR = build
|
MOC_DIR = build
|
||||||
OBJECTS_DIR = build
|
OBJECTS_DIR = build
|
||||||
|
|
||||||
# CONFIG += qt debug
|
CONFIG += qt debug
|
||||||
QT += network sql
|
QT += network sql
|
||||||
QT -= gui
|
QT -= gui
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ void ChatChannel::addPlayer(ServerSocket *player)
|
||||||
QString str = QString("chat|join_channel|%1|%2").arg(name).arg(player->getPlayerName());
|
QString str = QString("chat|join_channel|%1|%2").arg(name).arg(player->getPlayerName());
|
||||||
for (int i = 0; i < size(); ++i)
|
for (int i = 0; i < size(); ++i)
|
||||||
at(i)->msg(str);
|
at(i)->msg(str);
|
||||||
|
|
||||||
append(player);
|
append(player);
|
||||||
|
|
||||||
for (int i = 0; i < size(); ++i)
|
for (int i = 0; i < size(); ++i)
|
||||||
|
|
|
@ -48,6 +48,8 @@ ServerSocket::~ServerSocket()
|
||||||
server->removePlayer(this);
|
server->removePlayer(this);
|
||||||
if (game)
|
if (game)
|
||||||
game->removePlayer(this);
|
game->removePlayer(this);
|
||||||
|
for (int i = 0; i < chatChannels.size(); ++i)
|
||||||
|
chatChannels[i]->removePlayer(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ServerSocket::newCardId()
|
int ServerSocket::newCardId()
|
||||||
|
@ -256,9 +258,10 @@ ReturnMessage::ReturnCode ServerSocket::cmdChatJoinChannel(const QList<QVariant>
|
||||||
QList<ChatChannel *> allChannels = server->getChatChannelList();
|
QList<ChatChannel *> allChannels = server->getChatChannelList();
|
||||||
for (int i = 0; i < allChannels.size(); ++i)
|
for (int i = 0; i < allChannels.size(); ++i)
|
||||||
if (allChannels[i]->getName() == params[0]) {
|
if (allChannels[i]->getName() == params[0]) {
|
||||||
|
remsg->send(ReturnMessage::ReturnOk);
|
||||||
allChannels[i]->addPlayer(this);
|
allChannels[i]->addPlayer(this);
|
||||||
chatChannels << allChannels[i];
|
chatChannels << allChannels[i];
|
||||||
return ReturnMessage::ReturnOk;
|
return ReturnMessage::ReturnNothing;
|
||||||
}
|
}
|
||||||
return ReturnMessage::ReturnNameNotFound;
|
return ReturnMessage::ReturnNameNotFound;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue