fixed shuffling, more chat widget code

This commit is contained in:
Max-Wilhelm Bruker 2009-08-22 21:57:03 +02:00
parent 947cd1736c
commit 120193fb0b
8 changed files with 131 additions and 9 deletions

View file

@ -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;
}

View file

@ -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();

View file

@ -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);
};

View file

@ -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);

View file

@ -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;

View file

@ -9,7 +9,7 @@ INCLUDEPATH += . src
MOC_DIR = build
OBJECTS_DIR = build
# CONFIG += qt debug
CONFIG += qt debug
QT += network sql
QT -= gui

View file

@ -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)

View file

@ -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;
}