diff --git a/cockatrice/cockatrice.qrc b/cockatrice/cockatrice.qrc index 8d3ef904..d58a31bd 100644 --- a/cockatrice/cockatrice.qrc +++ b/cockatrice/cockatrice.qrc @@ -16,6 +16,7 @@ resources/icon_phase_main2.svg resources/icon_phase_cleanup.svg resources/icon_nextturn.svg + resources/pencil.svg resources/hr.jpg translations/cockatrice_de.qm translations/cockatrice_en.qm diff --git a/cockatrice/resources/pencil.svg b/cockatrice/resources/pencil.svg new file mode 100644 index 00000000..f940ab73 --- /dev/null +++ b/cockatrice/resources/pencil.svg @@ -0,0 +1,123 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + diff --git a/cockatrice/src/abstractcarditem.cpp b/cockatrice/src/abstractcarditem.cpp index 7444d946..edc0df04 100644 --- a/cockatrice/src/abstractcarditem.cpp +++ b/cockatrice/src/abstractcarditem.cpp @@ -137,6 +137,17 @@ void AbstractCardItem::mousePressEvent(QGraphicsSceneMouseEvent *event) event->accept(); } +void AbstractCardItem::processHoverEvent() +{ + emit hovered(this); +} + +void AbstractCardItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event) +{ + processHoverEvent(); + QGraphicsItem::hoverEnterEvent(event); +} + QVariant AbstractCardItem::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value) { if (change == ItemSelectedHasChanged) { diff --git a/cockatrice/src/abstractcarditem.h b/cockatrice/src/abstractcarditem.h index 6ed76b62..79666606 100644 --- a/cockatrice/src/abstractcarditem.h +++ b/cockatrice/src/abstractcarditem.h @@ -23,6 +23,8 @@ protected: bool tapped; private slots: void pixmapUpdated(); +signals: + void hovered(AbstractCardItem *card); public: enum { Type = typeCard }; int type() const { return Type; } @@ -35,8 +37,10 @@ public: void setName(const QString &_name = QString()); bool getTapped() const { return tapped; } void setTapped(bool _tapped); + void processHoverEvent(); protected: void mousePressEvent(QGraphicsSceneMouseEvent *event); + void hoverEnterEvent(QGraphicsSceneHoverEvent *event); QVariant itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value); }; diff --git a/cockatrice/src/cardinfowidget.cpp b/cockatrice/src/cardinfowidget.cpp index 4586598d..f6ac0501 100644 --- a/cockatrice/src/cardinfowidget.cpp +++ b/cockatrice/src/cardinfowidget.cpp @@ -87,7 +87,7 @@ void CardInfoWidget::setCard(const QString &cardName) setCard(db->getCard(cardName)); } -void CardInfoWidget::setCard(CardItem *card) +void CardInfoWidget::setCard(AbstractCardItem *card) { setCard(card->getInfo()); } diff --git a/cockatrice/src/cardinfowidget.h b/cockatrice/src/cardinfowidget.h index cb1e7244..3e786c7f 100644 --- a/cockatrice/src/cardinfowidget.h +++ b/cockatrice/src/cardinfowidget.h @@ -5,7 +5,7 @@ class QLabel; class QTextEdit; -class CardItem; +class AbstractCardItem; class CardInfo; class CardInfoWidget : public QFrame { @@ -28,7 +28,7 @@ public: public slots: void setCard(CardInfo *card); void setCard(const QString &cardName); - void setCard(CardItem *card); + void setCard(AbstractCardItem *card); private slots: void updatePixmap(); }; diff --git a/cockatrice/src/carditem.cpp b/cockatrice/src/carditem.cpp index 6f2b6b8c..c9825b97 100644 --- a/cockatrice/src/carditem.cpp +++ b/cockatrice/src/carditem.cpp @@ -170,14 +170,3 @@ void CardItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) table->handleDropEventByGrid(id, zone, gridPoint, false); } } - -void CardItem::processHoverEvent() -{ - emit hovered(this); -} - -void CardItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event) -{ - processHoverEvent(); - QGraphicsItem::hoverEnterEvent(event); -} diff --git a/cockatrice/src/carditem.h b/cockatrice/src/carditem.h index 7280ac41..0c53df09 100644 --- a/cockatrice/src/carditem.h +++ b/cockatrice/src/carditem.h @@ -49,14 +49,10 @@ public: CardDragItem *createDragItem(int _id, const QPointF &_pos, const QPointF &_scenePos, bool faceDown); void deleteDragItem(); - void processHoverEvent(); -signals: - void hovered(CardItem *card); protected: void mouseMoveEvent(QGraphicsSceneMouseEvent *event); void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event); - void hoverEnterEvent(QGraphicsSceneHoverEvent *event); }; #endif diff --git a/cockatrice/src/cardzone.cpp b/cockatrice/src/cardzone.cpp index 6b55fd3c..f64a5237 100644 --- a/cockatrice/src/cardzone.cpp +++ b/cockatrice/src/cardzone.cpp @@ -156,8 +156,8 @@ void CardZone::moveAllToZone() // Cards need to be moved in reverse order so that the other // cards' list index doesn't change -// for (int i = cards.size() - 1; i >= 0; i--) -// player->client->moveCard(cards.at(i)->getId(), getName(), targetZone, targetX); + for (int i = cards.size() - 1; i >= 0; i--) + player->sendGameCommand(new Command_MoveCard(-1, getName(), cards.at(i)->getId(), getName(), targetX)); } QPointF CardZone::closestGridPoint(const QPointF &point) diff --git a/cockatrice/src/decklistmodel.cpp b/cockatrice/src/decklistmodel.cpp index 16fe1610..e0992a7c 100644 --- a/cockatrice/src/decklistmodel.cpp +++ b/cockatrice/src/decklistmodel.cpp @@ -316,6 +316,13 @@ void DeckListModel::cleanList() reset(); } +void DeckListModel::setDeckList(DeckList *_deck) +{ + delete deckList; + deckList = _deck; + rebuildTree(); +} + void DeckListModel::printDeckListNode(QTextCursor *cursor, InnerDecklistNode *node) { static const int totalColumns = 3; diff --git a/cockatrice/src/decklistmodel.h b/cockatrice/src/decklistmodel.h index a27ed07b..a4dc89a2 100644 --- a/cockatrice/src/decklistmodel.h +++ b/cockatrice/src/decklistmodel.h @@ -44,6 +44,7 @@ public: void sort(int column, Qt::SortOrder order = Qt::AscendingOrder); void cleanList(); DeckList *getDeckList() const { return deckList; } + void setDeckList(DeckList *_deck); private: DeckList *deckList; InnerDecklistNode *root; diff --git a/cockatrice/src/deckview.cpp b/cockatrice/src/deckview.cpp index 28d64de1..7dcb3e23 100644 --- a/cockatrice/src/deckview.cpp +++ b/cockatrice/src/deckview.cpp @@ -119,8 +119,11 @@ void DeckViewScene::rebuildTree() if (!currentCard) continue; - for (int k = 0; k < currentCard->getNumber(); ++k) - container->addCard(new DeckViewCard(currentCard->getName(), container)); + for (int k = 0; k < currentCard->getNumber(); ++k) { + DeckViewCard *newCard = new DeckViewCard(currentCard->getName(), container); + container->addCard(newCard); + emit newCardAdded(newCard); + } } } } @@ -155,6 +158,7 @@ DeckView::DeckView(QWidget *parent) setScene(deckViewScene); connect(deckViewScene, SIGNAL(sceneRectChanged(const QRectF &)), this, SLOT(updateSceneRect(const QRectF &))); + connect(deckViewScene, SIGNAL(newCardAdded(AbstractCardItem *)), this, SIGNAL(newCardAdded(AbstractCardItem *))); } void DeckView::resizeEvent(QResizeEvent *event) diff --git a/cockatrice/src/deckview.h b/cockatrice/src/deckview.h index 7f800eba..ae686941 100644 --- a/cockatrice/src/deckview.h +++ b/cockatrice/src/deckview.h @@ -35,6 +35,8 @@ public: class DeckViewScene : public QGraphicsScene { Q_OBJECT +signals: + void newCardAdded(AbstractCardItem *card); private: DeckList *deck; QMap cardContainers; @@ -54,6 +56,8 @@ protected: void resizeEvent(QResizeEvent *event); public slots: void updateSceneRect(const QRectF &rect); +signals: + void newCardAdded(AbstractCardItem *card); public: DeckView(QWidget *parent = 0); void setDeck(DeckList *_deck); diff --git a/cockatrice/src/player.h b/cockatrice/src/player.h index 2a73f064..ce2e6cea 100644 --- a/cockatrice/src/player.h +++ b/cockatrice/src/player.h @@ -45,7 +45,7 @@ class Player : public QObject, public QGraphicsItem { signals: void closeZoneView(ZoneViewZone *zone); void toggleZoneView(Player *player, QString zoneName, int number); - void newCardAdded(CardItem *card); + void newCardAdded(AbstractCardItem *card); // Log events void logDeckSelect(Player *player, int deckId); void logSay(Player *player, QString message); diff --git a/cockatrice/src/tab_deck_storage.cpp b/cockatrice/src/tab_deck_storage.cpp index f079cc35..5e0d296f 100644 --- a/cockatrice/src/tab_deck_storage.cpp +++ b/cockatrice/src/tab_deck_storage.cpp @@ -4,6 +4,7 @@ #include "client.h" #include "decklist.h" #include "protocol_items.h" +#include "window_deckeditor.h" TabDeckStorage::TabDeckStorage(Client *_client) : Tab(), client(_client) @@ -59,9 +60,15 @@ TabDeckStorage::TabDeckStorage(Client *_client) hbox->addWidget(leftGroupBox); hbox->addWidget(rightGroupBox); + aOpenLocalDeck = new QAction(this); + aOpenLocalDeck->setIcon(QIcon(":/resources/pencil.svg")); + connect(aOpenLocalDeck, SIGNAL(triggered()), this, SLOT(actOpenLocalDeck())); aUpload = new QAction(this); aUpload->setIcon(QIcon(":/resources/arrow_right_green.svg")); connect(aUpload, SIGNAL(triggered()), this, SLOT(actUpload())); + aOpenRemoteDeck = new QAction(this); + aOpenRemoteDeck->setIcon(QIcon(":/resources/pencil.svg")); + connect(aOpenRemoteDeck, SIGNAL(triggered()), this, SLOT(actOpenRemoteDeck())); aDownload = new QAction(this); aDownload->setIcon(QIcon(":/resources/arrow_left_green.svg")); connect(aDownload, SIGNAL(triggered()), this, SLOT(actDownload())); @@ -72,7 +79,9 @@ TabDeckStorage::TabDeckStorage(Client *_client) aDelete->setIcon(QIcon(":/resources/remove_row.svg")); connect(aDelete, SIGNAL(triggered()), this, SLOT(actDelete())); + leftToolBar->addAction(aOpenLocalDeck); leftToolBar->addAction(aUpload); + rightToolBar->addAction(aOpenRemoteDeck); rightToolBar->addAction(aDownload); rightToolBar->addAction(aNewFolder); rightToolBar->addAction(aDelete); @@ -86,12 +95,29 @@ void TabDeckStorage::retranslateUi() leftGroupBox->setTitle(tr("Local file system")); rightGroupBox->setTitle(tr("Server deck storage")); + aOpenLocalDeck->setText(tr("Open in deck editor")); aUpload->setText(tr("Upload deck")); + aOpenRemoteDeck->setText(tr("Open in deck editor")); aDownload->setText(tr("Download deck")); aNewFolder->setText(tr("New folder")); aDelete->setText(tr("Delete")); } +void TabDeckStorage::actOpenLocalDeck() +{ + QModelIndex curLeft = sortFilter->mapToSource(localDirView->selectionModel()->currentIndex()); + if (localDirModel->isDir(curLeft)) + return; + QString filePath = localDirModel->filePath(curLeft); + DeckList *deck = new DeckList; + if (!deck->loadFromFile(filePath, DeckList::CockatriceFormat)) + return; + + WndDeckEditor *deckEditor = new WndDeckEditor; + deckEditor->setDeck(deck, filePath, DeckList::CockatriceFormat); + deckEditor->show(); +} + void TabDeckStorage::actUpload() { QModelIndex curLeft = sortFilter->mapToSource(localDirView->selectionModel()->currentIndex()); @@ -134,6 +160,28 @@ void TabDeckStorage::uploadFinished(ProtocolResponse *r) serverDirView->addFileToTree(resp->getFile(), serverDirView->getNodeByPath(cmd->getPath())); } +void TabDeckStorage::actOpenRemoteDeck() +{ + RemoteDeckList_TreeModel::FileNode *curRight = dynamic_cast(serverDirView->getCurrentItem()); + if (!curRight) + return; + + Command_DeckDownload *command = new Command_DeckDownload(curRight->getId()); + connect(command, SIGNAL(finished(ProtocolResponse *)), this, SLOT(openRemoteDeckFinished(ProtocolResponse *))); + client->sendCommand(command); +} + +void TabDeckStorage::openRemoteDeckFinished(ProtocolResponse *r) +{ + Response_DeckDownload *resp = qobject_cast(r); + if (!resp) + return; + + WndDeckEditor *deckEditor = new WndDeckEditor; + deckEditor->setDeck(new DeckList(resp->getDeck())); + deckEditor->show(); +} + void TabDeckStorage::actDownload() { QString filePath; diff --git a/cockatrice/src/tab_deck_storage.h b/cockatrice/src/tab_deck_storage.h index 7ebb6156..89ad2ba6 100644 --- a/cockatrice/src/tab_deck_storage.h +++ b/cockatrice/src/tab_deck_storage.h @@ -26,11 +26,16 @@ private: RemoteDeckList_TreeWidget *serverDirView; QGroupBox *leftGroupBox, *rightGroupBox; - QAction *aUpload, *aDownload, *aNewFolder, *aDelete; + QAction *aOpenLocalDeck, *aUpload, *aOpenRemoteDeck, *aDownload, *aNewFolder, *aDelete; private slots: + void actOpenLocalDeck(); + void actUpload(); void uploadFinished(ProtocolResponse *r); + void actOpenRemoteDeck(); + void openRemoteDeckFinished(ProtocolResponse *r); + void actDownload(); void downloadFinished(ProtocolResponse *r); diff --git a/cockatrice/src/tab_game.cpp b/cockatrice/src/tab_game.cpp index 91304b57..45c4a30c 100644 --- a/cockatrice/src/tab_game.cpp +++ b/cockatrice/src/tab_game.cpp @@ -39,6 +39,7 @@ TabGame::TabGame(Client *_client, int _gameId, int _localPlayerId, bool _spectat buttonHBox->addWidget(readyStartButton); buttonHBox->addStretch(); deckView = new DeckView; + connect(deckView, SIGNAL(newCardAdded(AbstractCardItem *)), this, SLOT(newCardAdded(AbstractCardItem *))); QVBoxLayout *deckViewLayout = new QVBoxLayout; deckViewLayout->addLayout(buttonHBox); deckViewLayout->addWidget(deckView); @@ -213,7 +214,7 @@ Player *TabGame::addPlayer(int playerId, const QString &playerName) Player *newPlayer = new Player(playerName, playerId, playerId == localPlayerId, client, this); scene->addPlayer(newPlayer); - connect(newPlayer, SIGNAL(newCardAdded(CardItem *)), this, SLOT(newCardAdded(CardItem *))); + connect(newPlayer, SIGNAL(newCardAdded(AbstractCardItem *)), this, SLOT(newCardAdded(AbstractCardItem *))); connect(newPlayer, SIGNAL(toggleZoneView(Player *, QString, int)), zoneLayout, SLOT(toggleZoneView(Player *, QString, int))); connect(newPlayer, SIGNAL(closeZoneView(ZoneViewZone *)), zoneLayout, SLOT(removeItem(ZoneViewZone *))); messageLog->connectToPlayer(newPlayer); @@ -440,7 +441,7 @@ void TabGame::readyStart() client->sendCommand(new Command_ReadyStart(gameId)); } -void TabGame::newCardAdded(CardItem *card) +void TabGame::newCardAdded(AbstractCardItem *card) { - connect(card, SIGNAL(hovered(CardItem *)), cardInfo, SLOT(setCard(CardItem *))); + connect(card, SIGNAL(hovered(AbstractCardItem *)), cardInfo, SLOT(setCard(AbstractCardItem *))); } diff --git a/cockatrice/src/tab_game.h b/cockatrice/src/tab_game.h index bbab02aa..68a8bfdf 100644 --- a/cockatrice/src/tab_game.h +++ b/cockatrice/src/tab_game.h @@ -32,6 +32,7 @@ class Event_SetActivePhase; class Event_Ping; class Player; class CardZone; +class AbstractCardItem; class CardItem; class TabGame : public Tab { @@ -85,7 +86,7 @@ private slots: void loadRemoteDeck(); void readyStart(); void deckSelectFinished(ProtocolResponse *r); - void newCardAdded(CardItem *card); + void newCardAdded(AbstractCardItem *card); void actConcede(); void actLeaveGame(); diff --git a/cockatrice/src/window_deckeditor.cpp b/cockatrice/src/window_deckeditor.cpp index 50f881a7..c3623b36 100644 --- a/cockatrice/src/window_deckeditor.cpp +++ b/cockatrice/src/window_deckeditor.cpp @@ -36,9 +36,9 @@ WndDeckEditor::WndDeckEditor(QWidget *parent) databaseView->setModel(databaseDisplayModel); databaseView->setUniformRowHeights(true); databaseView->setAlternatingRowColors(true); + databaseView->header()->setResizeMode(QHeaderView::ResizeToContents); databaseView->setSortingEnabled(true); databaseView->sortByColumn(0, Qt::AscendingOrder); - databaseView->resizeColumnToContents(0); connect(databaseView->selectionModel(), SIGNAL(currentRowChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(updateCardInfoLeft(const QModelIndex &, const QModelIndex &))); connect(databaseView, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(actAddCard())); searchEdit->setTreeView(databaseView); @@ -68,6 +68,7 @@ WndDeckEditor::WndDeckEditor(QWidget *parent) deckView = new QTreeView(); deckView->setModel(deckModel); deckView->setUniformRowHeights(true); + deckView->header()->setResizeMode(QHeaderView::ResizeToContents); connect(deckView->selectionModel(), SIGNAL(currentRowChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(updateCardInfoRight(const QModelIndex &, const QModelIndex &))); QLabel *nameLabel = new QLabel(tr("Deck &name:")); @@ -167,7 +168,6 @@ WndDeckEditor::WndDeckEditor(QWidget *parent) WndDeckEditor::~WndDeckEditor() { - } void WndDeckEditor::updateName(const QString &name) @@ -216,9 +216,10 @@ bool WndDeckEditor::confirmClose() void WndDeckEditor::closeEvent(QCloseEvent *event) { - if (confirmClose()) + if (confirmClose()) { event->accept(); - else + deleteLater(); + } else event->ignore(); } @@ -247,19 +248,11 @@ void WndDeckEditor::actLoadDeck() QString fileName = dialog.selectedFiles().at(0); DeckList::FileFormat fmt = DeckList::getFormatFromNameFilter(dialog.selectedNameFilter()); - DeckList *l = deckModel->getDeckList(); - if (l->loadFromFile(fileName, fmt)) { - lastFileName = fileName; - lastFileFormat = fmt; - nameEdit->setText(l->getName()); - commentsEdit->setText(l->getComments()); - deckModel->sort(1); - deckView->expandAll(); - deckView->resizeColumnToContents(0); - setWindowModified(false); - - Deck_PictureCacher::cachePictures(l, this); - } + DeckList *l = new DeckList; + if (l->loadFromFile(fileName, fmt)) + setDeck(l, fileName, fmt); + else + delete l; } bool WndDeckEditor::actSaveDeck() @@ -377,3 +370,20 @@ void WndDeckEditor::actDecrement() deckModel->setData(numberIndex, count - 1, Qt::EditRole); setWindowModified(true); } + +void WndDeckEditor::setDeck(DeckList *_deck, const QString &_lastFileName, DeckList::FileFormat _lastFileFormat) +{ + deckModel->setDeckList(_deck); + + lastFileName = _lastFileName; + lastFileFormat = _lastFileFormat; + nameEdit->setText(_deck->getName()); + commentsEdit->setText(_deck->getComments()); + deckModel->sort(1); + deckView->expandAll(); + setWindowModified(false); + + Deck_PictureCacher::cachePictures(_deck, this); + deckView->expandAll(); + setWindowModified(false); +} diff --git a/cockatrice/src/window_deckeditor.h b/cockatrice/src/window_deckeditor.h index c7020a91..ea326d83 100644 --- a/cockatrice/src/window_deckeditor.h +++ b/cockatrice/src/window_deckeditor.h @@ -71,6 +71,7 @@ private: public: WndDeckEditor(QWidget *parent = 0); ~WndDeckEditor(); + void setDeck(DeckList *_deck, const QString &_lastFileName = QString(), DeckList::FileFormat _lastFileFormat = DeckList::CockatriceFormat); protected: void closeEvent(QCloseEvent *event); };