diff --git a/cockatrice/cockatrice.pro b/cockatrice/cockatrice.pro index c9301325..c8700a78 100644 --- a/cockatrice/cockatrice.pro +++ b/cockatrice/cockatrice.pro @@ -25,7 +25,7 @@ HEADERS += src/counter.h \ src/gameview.h \ src/deck_picturecacher.h \ src/decklistmodel.h \ - src/dlg_startgame.h \ + src/dlg_load_remote_deck.h \ src/cardinfowidget.h \ src/messagelogwidget.h \ src/zoneviewzone.h \ @@ -47,6 +47,7 @@ HEADERS += src/counter.h \ src/tab_game.h \ src/tab_deck_storage.h \ src/tab_supervisor.h \ + src/remotedecklist_treewidget.h \ src/deckview.h \ ../common/decklist.h \ ../common/protocol.h \ @@ -72,7 +73,7 @@ SOURCES += src/counter.cpp \ src/gameview.cpp \ src/deck_picturecacher.cpp \ src/decklistmodel.cpp \ - src/dlg_startgame.cpp \ + src/dlg_load_remote_deck.cpp \ src/cardinfowidget.cpp \ src/messagelogwidget.cpp \ src/zoneviewzone.cpp \ @@ -94,6 +95,7 @@ SOURCES += src/counter.cpp \ src/tab_game.cpp \ src/tab_deck_storage.cpp \ src/tab_supervisor.cpp \ + src/remotedecklist_treewidget.cpp \ src/deckview.cpp \ ../common/decklist.cpp \ ../common/protocol.cpp \ diff --git a/cockatrice/src/dlg_load_remote_deck.cpp b/cockatrice/src/dlg_load_remote_deck.cpp new file mode 100644 index 00000000..60c7cf46 --- /dev/null +++ b/cockatrice/src/dlg_load_remote_deck.cpp @@ -0,0 +1,52 @@ +#include +#include +#include +#include "remotedecklist_treewidget.h" +#include "dlg_load_remote_deck.h" +#include "main.h" + +DlgLoadRemoteDeck::DlgLoadRemoteDeck(Client *_client, QWidget *parent) + : QDialog(parent), client(_client) +{ + dirView = new RemoteDeckList_TreeWidget(client); + + okButton = new QPushButton(tr("O&K")); + okButton->setDefault(true); + okButton->setAutoDefault(true); + okButton->setEnabled(false); + cancelButton = new QPushButton(tr("&Cancel")); + + QHBoxLayout *buttonLayout = new QHBoxLayout; + buttonLayout->addStretch(); + buttonLayout->addWidget(okButton); + buttonLayout->addWidget(cancelButton); + + QVBoxLayout *mainLayout = new QVBoxLayout; + mainLayout->addWidget(dirView); + mainLayout->addLayout(buttonLayout); + + setLayout(mainLayout); + + setWindowTitle(tr("Load deck")); + setMinimumWidth(sizeHint().width()); + resize(300, 500); + + connect(dirView, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *))); + connect(okButton, SIGNAL(clicked()), this, SLOT(accept())); + connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject())); +} + +void DlgLoadRemoteDeck::currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem * /*previous*/) +{ + if (!current) + okButton->setEnabled(false); + else if (current->type() == TWIDeckType) + okButton->setEnabled(true); + else + okButton->setEnabled(false); +} + +int DlgLoadRemoteDeck::getDeckId() const +{ + return dirView->currentItem()->data(1, Qt::DisplayRole).toInt(); +} diff --git a/cockatrice/src/dlg_load_remote_deck.h b/cockatrice/src/dlg_load_remote_deck.h new file mode 100644 index 00000000..414d817e --- /dev/null +++ b/cockatrice/src/dlg_load_remote_deck.h @@ -0,0 +1,24 @@ +#ifndef DLG_STARTGAME_H +#define DLG_STARTGAME_H + +#include + +class RemoteDeckList_TreeWidget; +class QTreeWidgetItem; +class Client; +class QPushButton; + +class DlgLoadRemoteDeck: public QDialog { + Q_OBJECT +private: + Client *client; + RemoteDeckList_TreeWidget *dirView; + QPushButton *okButton, *cancelButton; +private slots: + void currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous); +public: + DlgLoadRemoteDeck(Client *_client, QWidget *parent = 0); + int getDeckId() const; +}; + +#endif diff --git a/cockatrice/src/dlg_startgame.cpp b/cockatrice/src/dlg_startgame.cpp deleted file mode 100644 index 8a08fbaf..00000000 --- a/cockatrice/src/dlg_startgame.cpp +++ /dev/null @@ -1,65 +0,0 @@ -#include -#include -#include "dlg_startgame.h" -#include "decklistmodel.h" -#include "carddatabase.h" -#include "main.h" - -DlgStartGame::DlgStartGame(QWidget *parent) - : QDialog(parent) -{ - deckView = new QTreeView; - deckModel = new DeckListModel(this); - deckView->setModel(deckModel); - deckView->setUniformRowHeights(true); - - loadButton = new QPushButton(tr("&Load...")); - okButton = new QPushButton(tr("&OK")); - okButton->setDefault(true); - - QHBoxLayout *buttonLayout = new QHBoxLayout; - buttonLayout->addWidget(loadButton); - buttonLayout->addStretch(); - buttonLayout->addWidget(okButton); - - QVBoxLayout *mainLayout = new QVBoxLayout; - mainLayout->addWidget(deckView); - mainLayout->addLayout(buttonLayout); - - setLayout(mainLayout); - - setWindowTitle(tr("Start game")); - setMinimumWidth(sizeHint().width()); - resize(300, 500); - - connect(loadButton, SIGNAL(clicked()), this, SLOT(actLoad())); - connect(okButton, SIGNAL(clicked()), this, SLOT(accept())); -} - -void DlgStartGame::actLoad() -{ -// if (!deckModel->getDeckList()->loadDialog(this)) -// return; - - deckView->reset(); - deckModel->sort(1); - deckView->expandAll(); - deckView->resizeColumnToContents(0); - - emit newDeckLoaded(getDeckList()); -} - -QStringList DlgStartGame::getDeckList() const -{ - QStringList result; - DeckList *deckList = deckModel->getDeckList(); - for (int i = 0; i < deckList->getRoot()->size(); i++) { - InnerDecklistNode *node = dynamic_cast(deckList->getRoot()->at(i)); - for (int j = 0; j < node->size(); j++) { - DecklistCardNode *card = dynamic_cast(node->at(j)); - for (int k = 0; k < card->getNumber(); k++) - result << QString("%1%2").arg(node->getName() == "side" ? "SB: " : "").arg(card->getName()); - } - } - return result; -} diff --git a/cockatrice/src/dlg_startgame.h b/cockatrice/src/dlg_startgame.h deleted file mode 100644 index 063ad67e..00000000 --- a/cockatrice/src/dlg_startgame.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef DLG_STARTGAME_H -#define DLG_STARTGAME_H - -#include - -class QTreeView; -class QPushButton; -class CardDatabase; -class DeckListModel; - -class DlgStartGame: public QDialog { - Q_OBJECT -public: - DlgStartGame(QWidget *parent = 0); - QStringList getDeckList() const; -signals: - void newDeckLoaded(const QStringList &cards); -private slots: - void actLoad(); -private: - QTreeView *deckView; - DeckListModel *deckModel; - - QPushButton *loadButton, *okButton; -}; - -#endif diff --git a/cockatrice/src/game.cpp b/cockatrice/src/game.cpp index 1062a1c4..08b7781a 100644 --- a/cockatrice/src/game.cpp +++ b/cockatrice/src/game.cpp @@ -8,7 +8,6 @@ #include "tablezone.h" #include "handzone.h" #include "carddatabase.h" -#include "dlg_startgame.h" #include "counter.h" #include "gamescene.h" #include "player.h" @@ -80,10 +79,6 @@ Game::Game(Client *_client, GameScene *_scene, QMenuBar *menuBar, QObject *paren connect(i.key(), SIGNAL(triggered()), this, SLOT(cardMenuAction())); } - dlgStartGame = new DlgStartGame; - connect(dlgStartGame, SIGNAL(newDeckLoaded(const QStringList &)), client, SLOT(submitDeck(const QStringList &))); - connect(dlgStartGame, SIGNAL(finished(int)), this, SLOT(readyStart())); - retranslateUi(); } @@ -259,7 +254,7 @@ void Game::readyStart() void Game::restartGameDialog() { - dlgStartGame->show(); +// dlgStartGame->show(); } /* void Game::gameEvent(const ServerEventData &msg) diff --git a/cockatrice/src/game.h b/cockatrice/src/game.h index 055de354..85f63b6a 100644 --- a/cockatrice/src/game.h +++ b/cockatrice/src/game.h @@ -11,7 +11,6 @@ class GameScene; class Player; class CardDatabase; -class DlgStartGame; class CardItem; class QMenuBar; class CardZone; @@ -28,7 +27,6 @@ private: QAction *aTap, *aUntap, *aDoesntUntap, *aFlip, *aAddCounter, *aRemoveCounter, *aSetCounters, *aMoveToTopLibrary, *aMoveToBottomLibrary, *aMoveToGraveyard, *aMoveToExile, *aNextPhase, *aNextTurn, *aRemoveLocalArrows; - DlgStartGame *dlgStartGame; Client *client; GameScene *scene; diff --git a/cockatrice/src/remotedecklist_treewidget.cpp b/cockatrice/src/remotedecklist_treewidget.cpp new file mode 100644 index 00000000..159fe5a8 --- /dev/null +++ b/cockatrice/src/remotedecklist_treewidget.cpp @@ -0,0 +1,82 @@ +#include +#include +#include "remotedecklist_treewidget.h" +#include "protocol_items.h" +#include "client.h" + +RemoteDeckList_TreeWidget::RemoteDeckList_TreeWidget(Client *_client, QWidget *parent) + : QTreeWidget(parent), client(_client) +{ + header()->setResizeMode(QHeaderView::ResizeToContents); + setColumnCount(3); + + refreshTree(); + retranslateUi(); +} + +void RemoteDeckList_TreeWidget::retranslateUi() +{ + headerItem()->setText(0, tr("Name")); + headerItem()->setText(1, tr("ID")); + headerItem()->setText(2, tr("Upload time")); + headerItem()->setTextAlignment(1, Qt::AlignRight); +} + +void RemoteDeckList_TreeWidget::addFileToTree(DeckList_File *file, QTreeWidgetItem *parent) +{ + QFileIconProvider fip; + QTreeWidgetItem *newDeck = new QTreeWidgetItem(TWIDeckType); + newDeck->setIcon(0, fip.icon(QFileIconProvider::File)); + newDeck->setData(0, Qt::DisplayRole, file->getName()); + newDeck->setData(1, Qt::DisplayRole, file->getId()); + newDeck->setTextAlignment(1, Qt::AlignRight); + newDeck->setData(2, Qt::DisplayRole, file->getUploadTime()); + + parent->addChild(newDeck); +} + +void RemoteDeckList_TreeWidget::addFolderToTree(DeckList_Directory *folder, QTreeWidgetItem *parent) +{ + QFileIconProvider fip; + QTreeWidgetItem *newItem = new QTreeWidgetItem(TWIFolderType); + newItem->setIcon(0, fip.icon(QFileIconProvider::Folder)); + newItem->setText(0, parent ? folder->getName() : "/"); + if (parent) { + parent->addChild(newItem); + + QString path = parent->data(0, Qt::UserRole).toString(); + if (path.isEmpty()) + newItem->setData(0, Qt::UserRole, folder->getName()); + else + newItem->setData(0, Qt::UserRole, path + "/" + folder->getName()); + } else { + addTopLevelItem(newItem); + newItem->setData(0, Qt::UserRole, QString()); + } + + for (int i = 0; i < folder->size(); ++i) { + DeckList_Directory *subFolder = dynamic_cast(folder->at(i)); + if (subFolder) + addFolderToTree(subFolder, newItem); + else + addFileToTree(dynamic_cast(folder->at(i)), newItem); + } +} + +void RemoteDeckList_TreeWidget::refreshTree() +{ + Command_DeckList *command = new Command_DeckList; + connect(command, SIGNAL(finished(ProtocolResponse *)), this, SLOT(deckListFinished(ProtocolResponse *))); + client->sendCommand(command); +} + +void RemoteDeckList_TreeWidget::deckListFinished(ProtocolResponse *r) +{ + Response_DeckList *resp = qobject_cast(r); + if (!resp) + return; + + clear(); + addFolderToTree(resp->getRoot(), 0); + expandAll(); +} diff --git a/cockatrice/src/remotedecklist_treewidget.h b/cockatrice/src/remotedecklist_treewidget.h new file mode 100644 index 00000000..97c1cdb7 --- /dev/null +++ b/cockatrice/src/remotedecklist_treewidget.h @@ -0,0 +1,27 @@ +#ifndef REMOTEDECKLIST_TREEWIDGET_H +#define REMOTEDECKLIST_TREEWIDGET_H + +#include + +class ProtocolResponse; +class Client; +class DeckList_File; +class DeckList_Directory; + +enum { TWIFolderType = QTreeWidgetItem::UserType + 1, TWIDeckType = QTreeWidgetItem::UserType + 2 }; + +class RemoteDeckList_TreeWidget : public QTreeWidget { + Q_OBJECT +private: + Client *client; +private slots: + void deckListFinished(ProtocolResponse *r); +public: + RemoteDeckList_TreeWidget(Client *_client, QWidget *parent = 0); + void retranslateUi(); + void addFileToTree(DeckList_File *file, QTreeWidgetItem *parent); + void addFolderToTree(DeckList_Directory *folder, QTreeWidgetItem *parent); + void refreshTree(); +}; + +#endif diff --git a/cockatrice/src/tab_deck_storage.cpp b/cockatrice/src/tab_deck_storage.cpp index ebb3289b..3a05c1e9 100644 --- a/cockatrice/src/tab_deck_storage.cpp +++ b/cockatrice/src/tab_deck_storage.cpp @@ -1,12 +1,11 @@ #include #include #include "tab_deck_storage.h" +#include "remotedecklist_treewidget.h" #include "client.h" #include "decklist.h" #include "protocol_items.h" -enum { TWIFolderType = QTreeWidgetItem::UserType + 1, TWIDeckType = QTreeWidgetItem::UserType + 2 }; - TabDeckStorage::TabDeckStorage(Client *_client) : QWidget(), client(_client) { @@ -47,9 +46,7 @@ TabDeckStorage::TabDeckStorage(Client *_client) rightToolBarLayout->addWidget(rightToolBar); rightToolBarLayout->addStretch(); - serverDirView = new QTreeWidget; - serverDirView->header()->setResizeMode(QHeaderView::ResizeToContents); - serverDirView->setColumnCount(3); + serverDirView = new RemoteDeckList_TreeWidget(client); QVBoxLayout *rightVbox = new QVBoxLayout; rightVbox->addWidget(serverDirView); @@ -81,8 +78,6 @@ TabDeckStorage::TabDeckStorage(Client *_client) retranslateUi(); setLayout(hbox); - - refreshServerList(); } void TabDeckStorage::retranslateUi() @@ -94,71 +89,8 @@ void TabDeckStorage::retranslateUi() aDownload->setText(tr("Download deck")); aNewFolder->setText(tr("New folder")); aDelete->setText(tr("Delete")); - - QTreeWidgetItem *header = serverDirView->headerItem(); - header->setText(0, tr("Name")); - header->setText(1, tr("ID")); - header->setText(2, tr("Upload time")); - header->setTextAlignment(1, Qt::AlignRight); -} - -void TabDeckStorage::refreshServerList() -{ - Command_DeckList *command = new Command_DeckList; - connect(command, SIGNAL(finished(ProtocolResponse *)), this, SLOT(deckListFinished(ProtocolResponse *))); - client->sendCommand(command); -} - -void TabDeckStorage::addFileToTree(DeckList_File *file, QTreeWidgetItem *parent) -{ - QFileIconProvider fip; - QTreeWidgetItem *newDeck = new QTreeWidgetItem(TWIDeckType); - newDeck->setIcon(0, fip.icon(QFileIconProvider::File)); - newDeck->setData(0, Qt::DisplayRole, file->getName()); - newDeck->setData(1, Qt::DisplayRole, file->getId()); - newDeck->setTextAlignment(1, Qt::AlignRight); - newDeck->setData(2, Qt::DisplayRole, file->getUploadTime()); - - parent->addChild(newDeck); -} - -void TabDeckStorage::populateDeckList(DeckList_Directory *folder, QTreeWidgetItem *parent) -{ - QFileIconProvider fip; - QTreeWidgetItem *newItem = new QTreeWidgetItem(TWIFolderType); - newItem->setIcon(0, fip.icon(QFileIconProvider::Folder)); - newItem->setText(0, parent ? folder->getName() : "/"); - if (parent) { - parent->addChild(newItem); - - QString path = parent->data(0, Qt::UserRole).toString(); - if (path.isEmpty()) - newItem->setData(0, Qt::UserRole, folder->getName()); - else - newItem->setData(0, Qt::UserRole, path + "/" + folder->getName()); - } else { - serverDirView->addTopLevelItem(newItem); - newItem->setData(0, Qt::UserRole, QString()); - } - - for (int i = 0; i < folder->size(); ++i) { - DeckList_Directory *subFolder = dynamic_cast(folder->at(i)); - if (subFolder) - populateDeckList(subFolder, newItem); - else - addFileToTree(dynamic_cast(folder->at(i)), newItem); - } -} - -void TabDeckStorage::deckListFinished(ProtocolResponse *r) -{ - Response_DeckList *resp = qobject_cast(r); - if (!resp) - return; - - serverDirView->clear(); - populateDeckList(resp->getRoot(), 0); - serverDirView->expandAll(); + + serverDirView->retranslateUi(); } void TabDeckStorage::actUpload() @@ -194,7 +126,7 @@ void TabDeckStorage::uploadFinished(ProtocolResponse *r) QTreeWidgetItemIterator it(serverDirView); while (*it) { if ((*it)->data(0, Qt::UserRole) == cmd->getPath()) { - addFileToTree(resp->getFile(), *it); + serverDirView->addFileToTree(resp->getFile(), *it); break; } ++it; diff --git a/cockatrice/src/tab_deck_storage.h b/cockatrice/src/tab_deck_storage.h index 50495776..d2c7555d 100644 --- a/cockatrice/src/tab_deck_storage.h +++ b/cockatrice/src/tab_deck_storage.h @@ -13,6 +13,7 @@ class QTreeWidget; class QTreeWidgetItem; class QGroupBox; class ProtocolResponse; +class RemoteDeckList_TreeWidget; class TabDeckStorage : public QWidget { Q_OBJECT @@ -22,16 +23,11 @@ private: QFileSystemModel *localDirModel; QSortFilterProxyModel *sortFilter; QToolBar *leftToolBar, *rightToolBar; - QTreeWidget *serverDirView; + RemoteDeckList_TreeWidget *serverDirView; QGroupBox *leftGroupBox, *rightGroupBox; QAction *aUpload, *aDownload, *aNewFolder, *aDelete; - void addFileToTree(DeckList_File *file, QTreeWidgetItem *parent); - void populateDeckList(DeckList_Directory *folder, QTreeWidgetItem *parent); - void refreshServerList(); private slots: - void deckListFinished(ProtocolResponse *r); - void actUpload(); void uploadFinished(ProtocolResponse *r); diff --git a/cockatrice/src/tab_game.cpp b/cockatrice/src/tab_game.cpp index 18a46335..e823a2b7 100644 --- a/cockatrice/src/tab_game.cpp +++ b/cockatrice/src/tab_game.cpp @@ -14,6 +14,7 @@ #include "decklist.h" #include "deck_picturecacher.h" #include "protocol_items.h" +#include "dlg_load_remote_deck.h" #include "main.h" TabGame::TabGame(Client *_client, int _gameId) @@ -26,10 +27,12 @@ TabGame::TabGame(Client *_client, int _gameId) loadLocalButton = new QPushButton; loadRemoteButton = new QPushButton; + readyStartButton = new QPushButton; QHBoxLayout *buttonHBox = new QHBoxLayout; buttonHBox->addWidget(loadLocalButton); buttonHBox->addWidget(loadRemoteButton); + buttonHBox->addWidget(readyStartButton); buttonHBox->addStretch(); deckView = new DeckView; QVBoxLayout *deckViewLayout = new QVBoxLayout; @@ -66,6 +69,7 @@ TabGame::TabGame(Client *_client, int _gameId) connect(loadLocalButton, SIGNAL(clicked()), this, SLOT(loadLocalDeck())); connect(loadRemoteButton, SIGNAL(clicked()), this, SLOT(loadRemoteDeck())); + connect(readyStartButton, SIGNAL(clicked()), this, SLOT(readyStart())); connect(sayEdit, SIGNAL(returnPressed()), this, SLOT(actSay())); @@ -93,6 +97,7 @@ void TabGame::retranslateUi() { loadLocalButton->setText(tr("Load &local deck")); loadRemoteButton->setText(tr("Load deck from &server")); + readyStartButton->setText(tr("&Start game")); sayLabel->setText(tr("&Say:")); cardInfo->retranslateUi(); // if (game) @@ -132,7 +137,12 @@ void TabGame::loadLocalDeck() void TabGame::loadRemoteDeck() { - + DlgLoadRemoteDeck dlg(client); + if (dlg.exec()) { + Command_DeckSelect *cmd = new Command_DeckSelect(gameId, 0, dlg.getDeckId()); + connect(cmd, SIGNAL(finished(ProtocolResponse *)), this, SLOT(deckSelectFinished(ProtocolResponse *))); + client->sendCommand(cmd); + } } void TabGame::deckSelectFinished(ProtocolResponse *r) @@ -146,3 +156,8 @@ void TabGame::deckSelectFinished(ProtocolResponse *r) Deck_PictureCacher::cachePictures(resp->getDeck(), this); deckView->setDeck(resp->getDeck()); } + +void TabGame::readyStart() +{ + client->sendCommand(new Command_ReadyStart(gameId)); +} diff --git a/cockatrice/src/tab_game.h b/cockatrice/src/tab_game.h index e00a7626..d55a0795 100644 --- a/cockatrice/src/tab_game.h +++ b/cockatrice/src/tab_game.h @@ -26,7 +26,7 @@ private: Client *client; int gameId; - QPushButton *loadLocalButton, *loadRemoteButton; + QPushButton *loadLocalButton, *loadRemoteButton, *readyStartButton; CardInfoWidget *cardInfo; MessageLogWidget *messageLog; QLabel *sayLabel; @@ -41,6 +41,7 @@ private: private slots: void loadLocalDeck(); void loadRemoteDeck(); + void readyStart(); void deckSelectFinished(ProtocolResponse *r); public: TabGame(Client *_client, int _gameId); diff --git a/common/protocol.h b/common/protocol.h index c5e12af6..fa821ade 100644 --- a/common/protocol.h +++ b/common/protocol.h @@ -257,7 +257,11 @@ public: GameEvent(const QString &_eventName, int _gameId, int _playerId); int getGameId() const { return gameId; } int getPlayerId() const { return playerId; } - void setGameId(int _gameId) { gameId = _gameId; } + void setGameId(int _gameId) + { + gameId = _gameId; + setParameter("game_id", gameId); + } }; class ChatEvent : public ProtocolItem {