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