From 6a537979d0011c0343337cfe4511c4b08ef9eed1 Mon Sep 17 00:00:00 2001 From: brukie Date: Thu, 25 Jun 2009 13:12:54 +0200 Subject: [PATCH 1/3] added message shortcuts --- cockatrice/cockatrice.pro | 4 +- cockatrice/src/dlg_editmessages.cpp | 76 +++++++++++++++++++++++++++++ cockatrice/src/dlg_editmessages.h | 24 +++++++++ cockatrice/src/game.cpp | 47 ++++++++++++++++++ cockatrice/src/game.h | 8 ++- cockatrice/src/player.cpp | 4 +- cockatrice/src/window_main.cpp | 2 +- 7 files changed, 158 insertions(+), 7 deletions(-) create mode 100644 cockatrice/src/dlg_editmessages.cpp create mode 100644 cockatrice/src/dlg_editmessages.h diff --git a/cockatrice/cockatrice.pro b/cockatrice/cockatrice.pro index 019fbcc6..0def3f23 100644 --- a/cockatrice/cockatrice.pro +++ b/cockatrice/cockatrice.pro @@ -15,5 +15,5 @@ QT += network #QTPLUGIN += qjpeg # Input -HEADERS += src/counter.h src/gameselector.h src/dlg_creategame.h src/dlg_connect.h src/gamesmodel.h src/client.h src/window_main.h src/servergame.h src/servereventdata.h src/zonelist.h src/cardzone.h src/player.h src/cardlist.h src/carditem.h src/tablezone.h src/handzone.h src/playerlist.h src/game.h src/carddatabase.h src/gameview.h src/decklistmodel.h src/dlg_startgame.h src/cardinfowidget.h src/messagelogwidget.h src/serverzonecard.h src/zoneviewzone.h src/zoneviewwidget.h src/libraryzone.h src/pilezone.h src/carddragitem.h src/zoneviewlayout.h src/playerarea.h src/carddatabasemodel.h src/window_deckeditor.h src/decklist.h setsmodel.h src/window_sets.h -SOURCES += src/counter.cpp src/gameselector.cpp src/dlg_creategame.cpp src/dlg_connect.cpp src/client.cpp src/main.cpp src/window_main.cpp src/servereventdata.cpp src/gamesmodel.cpp src/player.cpp src/cardzone.cpp src/zonelist.cpp src/cardlist.cpp src/carditem.cpp src/tablezone.cpp src/handzone.cpp src/playerlist.cpp src/game.cpp src/carddatabase.cpp src/gameview.cpp src/decklistmodel.cpp src/dlg_startgame.cpp src/cardinfowidget.cpp src/messagelogwidget.cpp src/zoneviewzone.cpp src/zoneviewwidget.cpp src/libraryzone.cpp src/pilezone.cpp src/carddragitem.cpp src/zoneviewlayout.cpp src/playerarea.cpp src/carddatabasemodel.cpp src/window_deckeditor.cpp src/decklist.cpp src/setsmodel.cpp src/window_sets.cpp +HEADERS += src/counter.h src/gameselector.h src/dlg_creategame.h src/dlg_connect.h src/gamesmodel.h src/client.h src/window_main.h src/servergame.h src/servereventdata.h src/zonelist.h src/cardzone.h src/player.h src/cardlist.h src/carditem.h src/tablezone.h src/handzone.h src/playerlist.h src/game.h src/carddatabase.h src/gameview.h src/decklistmodel.h src/dlg_startgame.h src/cardinfowidget.h src/messagelogwidget.h src/serverzonecard.h src/zoneviewzone.h src/zoneviewwidget.h src/libraryzone.h src/pilezone.h src/carddragitem.h src/zoneviewlayout.h src/playerarea.h src/carddatabasemodel.h src/window_deckeditor.h src/decklist.h setsmodel.h src/window_sets.h src/dlg_editmessages.h +SOURCES += src/counter.cpp src/gameselector.cpp src/dlg_creategame.cpp src/dlg_connect.cpp src/client.cpp src/main.cpp src/window_main.cpp src/servereventdata.cpp src/gamesmodel.cpp src/player.cpp src/cardzone.cpp src/zonelist.cpp src/cardlist.cpp src/carditem.cpp src/tablezone.cpp src/handzone.cpp src/playerlist.cpp src/game.cpp src/carddatabase.cpp src/gameview.cpp src/decklistmodel.cpp src/dlg_startgame.cpp src/cardinfowidget.cpp src/messagelogwidget.cpp src/zoneviewzone.cpp src/zoneviewwidget.cpp src/libraryzone.cpp src/pilezone.cpp src/carddragitem.cpp src/zoneviewlayout.cpp src/playerarea.cpp src/carddatabasemodel.cpp src/window_deckeditor.cpp src/decklist.cpp src/setsmodel.cpp src/window_sets.cpp src/dlg_editmessages.cpp diff --git a/cockatrice/src/dlg_editmessages.cpp b/cockatrice/src/dlg_editmessages.cpp new file mode 100644 index 00000000..7f2c99f3 --- /dev/null +++ b/cockatrice/src/dlg_editmessages.cpp @@ -0,0 +1,76 @@ +#include +#include "dlg_editmessages.h" + +DlgEditMessages::DlgEditMessages(QWidget *parent) + : QDialog(parent) +{ + aAdd = new QAction(tr("Add"), this); + connect(aAdd, SIGNAL(triggered()), this, SLOT(actAdd())); + aRemove = new QAction(tr("Remove"), this); + connect(aRemove, SIGNAL(triggered()), this, SLOT(actRemove())); + + messageList = new QListWidget; + QToolBar *messageToolBar = new QToolBar; + messageToolBar->setOrientation(Qt::Vertical); + messageToolBar->addAction(aAdd); + messageToolBar->addAction(aRemove); + + QSettings settings; + settings.beginGroup("messages"); + int count = settings.value("count", 0).toInt(); + for (int i = 0; i < count; i++) + messageList->addItem(settings.value(QString("msg%1").arg(i)).toString()); + + QHBoxLayout *listLayout = new QHBoxLayout; + listLayout->addWidget(messageList); + listLayout->addWidget(messageToolBar); + + cancelButton = new QPushButton(tr("&Cancel")); + okButton = new QPushButton(tr("O&K")); + okButton->setAutoDefault(true); + + QHBoxLayout *buttonLayout = new QHBoxLayout; + buttonLayout->addStretch(); + buttonLayout->addWidget(cancelButton); + buttonLayout->addWidget(okButton); + + QVBoxLayout *mainLayout = new QVBoxLayout; + mainLayout->addLayout(listLayout); + mainLayout->addLayout(buttonLayout); + + setLayout(mainLayout); + + setWindowTitle(tr("Edit messages")); + setMinimumWidth(sizeHint().width()); + resize(300, 300); + + connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject())); + connect(okButton, SIGNAL(clicked()), this, SLOT(accept())); +} + +void DlgEditMessages::storeSettings() +{ + QSettings settings; + settings.beginGroup("messages"); + settings.setValue("count", messageList->count()); + for (int i = 0; i < messageList->count(); i++) + settings.setValue(QString("msg%1").arg(i), messageList->item(i)->text()); +} + +void DlgEditMessages::actAdd() +{ + bool ok; + QString msg = QInputDialog::getText(this, tr("Add message"), QString("Message:"), QLineEdit::Normal, QString(), &ok); + if (ok) { + messageList->addItem(msg); + storeSettings(); + } +} + +void DlgEditMessages::actRemove() +{ + if (messageList->currentItem()) { + delete messageList->takeItem(messageList->currentRow()); + storeSettings(); + } +} diff --git a/cockatrice/src/dlg_editmessages.h b/cockatrice/src/dlg_editmessages.h new file mode 100644 index 00000000..583f65f4 --- /dev/null +++ b/cockatrice/src/dlg_editmessages.h @@ -0,0 +1,24 @@ +#ifndef DLG_EDITMESSAGES_H +#define DLG_EDITMESSAGES_H + +#include + +class QListWidget; +class QPushButton; + +class DlgEditMessages: public QDialog { + Q_OBJECT +public: + DlgEditMessages(QWidget *parent = 0); +private slots: + void actAdd(); + void actRemove(); +private: + QListWidget *messageList; + QAction *aAdd, *aRemove; + QPushButton *cancelButton, *okButton; + + void storeSettings(); +}; + +#endif diff --git a/cockatrice/src/game.cpp b/cockatrice/src/game.cpp index fdf5c247..437e02e1 100644 --- a/cockatrice/src/game.cpp +++ b/cockatrice/src/game.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include "serverplayer.h" #include "game.h" #include "servereventdata.h" @@ -9,6 +10,7 @@ #include "handzone.h" #include "carddatabase.h" #include "dlg_startgame.h" +#include "dlg_editmessages.h" #include "playerarea.h" #include "counter.h" @@ -51,6 +53,9 @@ Game::Game(CardDatabase *_db, Client *_client, QGraphicsScene *_scene, QMenu *_a aCreateToken = new QAction(tr("&Create token..."), this); aCreateToken->setShortcut(tr("Ctrl+T")); connect(aCreateToken, SIGNAL(triggered()), this, SLOT(actCreateToken())); + + aEditMessages = new QAction(tr("&Edit messages..."), this); + connect(aEditMessages, SIGNAL(triggered()), this, SLOT(actEditMessages())); actionsMenu->addAction(aUntapAll); actionsMenu->addSeparator(); @@ -64,6 +69,9 @@ Game::Game(CardDatabase *_db, Client *_client, QGraphicsScene *_scene, QMenu *_a actionsMenu->addAction(aRollDice); actionsMenu->addSeparator(); actionsMenu->addAction(aCreateToken); + actionsMenu->addSeparator(); + sayMenu = actionsMenu->addMenu(tr("S&ay")); + initSayMenu(); aTap = new QAction(tr("&Tap"), this); connect(aTap, SIGNAL(triggered()), this, SLOT(actTap())); @@ -108,6 +116,32 @@ Game::~Game() } } +void Game::initSayMenu() +{ + sayMenu->clear(); + sayMenu->addAction(aEditMessages); + sayMenu->addSeparator(); + + QSettings settings; + settings.beginGroup("messages"); + int count = settings.value("count", 0).toInt(); + for (int i = 0; i < count; i++) { + QAction *newAction = new QAction(settings.value(QString("msg%1").arg(i)).toString(), this); + QString shortcut; + switch (i) { + case 0: shortcut = tr("F5"); break; + case 1: shortcut = tr("F6"); break; + case 2: shortcut = tr("F7"); break; + case 3: shortcut = tr("F8"); break; + case 4: shortcut = tr("F9"); break; + case 5: shortcut = tr("F10"); break; + } + newAction->setShortcut(shortcut); + connect(newAction, SIGNAL(triggered()), this, SLOT(actSayMessage())); + sayMenu->addAction(newAction); + } +} + Player *Game::addPlayer(int playerId, const QString &playerName, QPointF base, bool local) { Player *newPlayer = new Player(playerName, playerId, base, local, db, client, scene); @@ -295,6 +329,13 @@ void Game::actCreateToken() client->createToken("table", cardname, QString(), 0, 0); } +void Game::actEditMessages() +{ + DlgEditMessages dlg; + if (dlg.exec()) + initSayMenu(); +} + void Game::showCardMenu(QPoint p) { cardMenu->exec(p); @@ -396,3 +437,9 @@ void Game::actRearrange() client->moveCard(temp->getId(), zoneName, zoneName, x, y); } } + +void Game::actSayMessage() +{ + QAction *a = qobject_cast(sender()); + client->say(a->text()); +} diff --git a/cockatrice/src/game.h b/cockatrice/src/game.h index 0d36cbe6..66d675bd 100644 --- a/cockatrice/src/game.h +++ b/cockatrice/src/game.h @@ -14,9 +14,9 @@ class DlgStartGame; class Game : public QObject { Q_OBJECT private: - QMenu *actionsMenu, *cardMenu; + QMenu *actionsMenu, *sayMenu, *cardMenu; QAction *aTap, *aUntap, *aDoesntUntap, *aFlip, *aAddCounter, *aRemoveCounter, *aSetCounters, *aRearrange, - *aUntapAll, *aDecLife, *aIncLife, *aSetLife, *aShuffle, *aDraw, *aDrawCards, *aRollDice, *aCreateToken; + *aUntapAll, *aDecLife, *aIncLife, *aSetLife, *aShuffle, *aDraw, *aDrawCards, *aRollDice, *aCreateToken, *aEditMessages; DlgStartGame *dlgStartGame; CardDatabase *db; @@ -26,6 +26,7 @@ private: Player *localPlayer; bool started; Player *addPlayer(int playerId, const QString &playerName, QPointF base, bool local); + void initSayMenu(); private slots: void actUntapAll(); void actIncLife(); @@ -36,6 +37,7 @@ private slots: void actDrawCards(); void actRollDice(); void actCreateToken(); + void actEditMessages(); void showCardMenu(QPoint p); void actTap(); @@ -46,6 +48,8 @@ private slots: void actRemoveCounter(); void actSetCounters(); void actRearrange(); + + void actSayMessage(); void gameEvent(const ServerEventData &msg); void playerListReceived(QList playerList); diff --git a/cockatrice/src/player.cpp b/cockatrice/src/player.cpp index a0ef1879..8cd365bd 100644 --- a/cockatrice/src/player.cpp +++ b/cockatrice/src/player.cpp @@ -21,14 +21,14 @@ Player::Player(const QString &_name, int _id, QPointF _base, bool _local, CardDa aViewLibrary = new QAction(tr("&View library"), this); if (local) - aViewLibrary->setShortcut(tr("F5")); + aViewLibrary->setShortcut(tr("F3")); connect(aViewLibrary, SIGNAL(triggered()), this, SLOT(actViewLibrary())); aViewTopCards = new QAction(tr("View &top cards of library..."), this); connect(aViewTopCards, SIGNAL(triggered()), this, SLOT(actViewTopCards())); aViewGraveyard = new QAction(tr("&View graveyard"), this); if (local) - aViewGraveyard->setShortcut(tr("F6")); + aViewGraveyard->setShortcut(tr("F4")); connect(aViewGraveyard, SIGNAL(triggered()), this, SLOT(actViewGraveyard())); aViewRfg = new QAction(tr("&View removed cards"), this); diff --git a/cockatrice/src/window_main.cpp b/cockatrice/src/window_main.cpp index 446d9a83..0265f1c1 100644 --- a/cockatrice/src/window_main.cpp +++ b/cockatrice/src/window_main.cpp @@ -190,7 +190,7 @@ void MainWindow::createActions() aDeckEditor = new QAction(tr("&Deck editor"), this); connect(aDeckEditor, SIGNAL(triggered()), this, SLOT(actDeckEditor())); aFullScreen = new QAction(tr("&Full screen"), this); - aFullScreen->setShortcut(tr("F4")); + aFullScreen->setShortcut(tr("Ctrl+F4")); aFullScreen->setCheckable(true); connect(aFullScreen, SIGNAL(toggled(bool)), this, SLOT(actFullScreen(bool))); aExit = new QAction(tr("&Exit"), this); From 7f0f6c6212f2fcfc0b865af95c452dcc1cc75c6d Mon Sep 17 00:00:00 2001 From: brukie Date: Thu, 25 Jun 2009 13:25:20 +0200 Subject: [PATCH 2/3] changed some hotkeys --- cockatrice/src/gameselector.cpp | 2 +- cockatrice/src/window_main.cpp | 38 ++++++++++++++++----------------- cockatrice/src/window_main.h | 4 +--- 3 files changed, 20 insertions(+), 24 deletions(-) diff --git a/cockatrice/src/gameselector.cpp b/cockatrice/src/gameselector.cpp index 52ae2592..424c6b51 100644 --- a/cockatrice/src/gameselector.cpp +++ b/cockatrice/src/gameselector.cpp @@ -9,7 +9,7 @@ GameSelector::GameSelector(Client *_client, QWidget *parent) gameListModel = new GamesModel(this); gameListView->setModel(gameListModel); - createButton = new QPushButton(tr("&Create")); + createButton = new QPushButton(tr("C&reate")); joinButton = new QPushButton(tr("&Join")); QHBoxLayout *buttonLayout = new QHBoxLayout; buttonLayout->addStretch(); diff --git a/cockatrice/src/window_main.cpp b/cockatrice/src/window_main.cpp index 0265f1c1..29166c7d 100644 --- a/cockatrice/src/window_main.cpp +++ b/cockatrice/src/window_main.cpp @@ -60,6 +60,7 @@ void MainWindow::statusChanged(ProtocolStatus _status) break; case StatusDisconnected: if (game) { + zoneLayout->clear(); delete game; game = 0; } @@ -72,6 +73,14 @@ void MainWindow::statusChanged(ProtocolStatus _status) aDisconnect->setEnabled(true); break; case StatusIdle: { + if (game) { + zoneLayout->clear(); + delete game; + game = 0; + } + aRestartGame->setEnabled(false); + aLeaveGame->setEnabled(false); + GameSelector *gameSelector = new GameSelector(client); viewLayout->insertWidget(0, gameSelector); } @@ -104,12 +113,7 @@ void MainWindow::actRestartGame() void MainWindow::actLeaveGame() { - zoneLayout->clear(); client->leaveGame(); - delete game; - game = 0; - aRestartGame->setEnabled(false); - aLeaveGame->setEnabled(false); } void MainWindow::actDeckEditor() @@ -140,15 +144,11 @@ void MainWindow::updateSceneSize() view->fitInView(scene->sceneRect(), Qt::KeepAspectRatio); } -void MainWindow::textChanged(const QString &text) -{ - sayButton->setEnabled(!text.isEmpty()); -} - -// Knöpfe - -void MainWindow::buttonSay() +void MainWindow::actSay() { + if (sayEdit->text().isEmpty()) + return; + client->say(sayEdit->text()); sayEdit->clear(); } @@ -190,7 +190,7 @@ void MainWindow::createActions() aDeckEditor = new QAction(tr("&Deck editor"), this); connect(aDeckEditor, SIGNAL(triggered()), this, SLOT(actDeckEditor())); aFullScreen = new QAction(tr("&Full screen"), this); - aFullScreen->setShortcut(tr("Ctrl+F4")); + aFullScreen->setShortcut(tr("Ctrl+F")); aFullScreen->setCheckable(true); connect(aFullScreen, SIGNAL(toggled(bool)), this, SLOT(actFullScreen(bool))); aExit = new QAction(tr("&Exit"), this); @@ -244,13 +244,13 @@ MainWindow::MainWindow(QWidget *parent) cardInfo = new CardInfoWidget(db); messageLog = new MessageLogWidget; + QLabel *sayLabel = new QLabel(tr("&Say:")); sayEdit = new QLineEdit; - sayButton = new QPushButton(tr("&Say")); - sayButton->setEnabled(false); + sayLabel->setBuddy(sayEdit); QHBoxLayout *hLayout = new QHBoxLayout; + hLayout->addWidget(sayLabel); hLayout->addWidget(sayEdit); - hLayout->addWidget(sayButton); QVBoxLayout *verticalLayout = new QVBoxLayout; verticalLayout->addWidget(cardInfo); @@ -268,9 +268,7 @@ MainWindow::MainWindow(QWidget *parent) centralWidget->setLayout(mainLayout); setCentralWidget(centralWidget); - connect(sayEdit, SIGNAL(returnPressed()), sayButton, SLOT(click())); - connect(sayEdit, SIGNAL(textChanged(const QString &)), this, SLOT(textChanged(const QString &))); - connect(sayButton, SIGNAL(clicked()), this, SLOT(buttonSay())); + connect(sayEdit, SIGNAL(returnPressed()), this, SLOT(actSay())); client = new Client(this); connect(client, SIGNAL(serverTimeout()), this, SLOT(serverTimeout())); diff --git a/cockatrice/src/window_main.h b/cockatrice/src/window_main.h index b3291593..b4d090b0 100644 --- a/cockatrice/src/window_main.h +++ b/cockatrice/src/window_main.h @@ -48,8 +48,7 @@ private slots: void playerIdReceived(int id, QString name); void serverTimeout(); - void textChanged(const QString &text); - void buttonSay(); + void actSay(); void actConnect(); void actDisconnect(); @@ -74,7 +73,6 @@ private: CardInfoWidget *cardInfo; MessageLogWidget *messageLog; QLineEdit *sayEdit; - QPushButton *sayButton; Client *client; QGraphicsScene *scene; From 33cc7a88594d7f9ac20e6b96a09d838229b884e9 Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Fri, 26 Jun 2009 15:25:32 +0200 Subject: [PATCH 3/3] started implementing deck printing --- cockatrice/src/carditem.cpp | 20 +++++++++---- cockatrice/src/decklist.cpp | 5 ++++ cockatrice/src/decklist.h | 3 ++ cockatrice/src/decklistmodel.cpp | 44 ++++++++++++++++++++++++++++ cockatrice/src/decklistmodel.h | 6 ++++ cockatrice/src/window_deckeditor.cpp | 12 ++++++++ cockatrice/src/window_deckeditor.h | 3 +- 7 files changed, 87 insertions(+), 6 deletions(-) diff --git a/cockatrice/src/carditem.cpp b/cockatrice/src/carditem.cpp index 3876df24..d3a50e3f 100644 --- a/cockatrice/src/carditem.cpp +++ b/cockatrice/src/carditem.cpp @@ -62,11 +62,21 @@ void CardItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, painter->drawRect(QRectF(0.5, 0.5, CARD_WIDTH - 1, CARD_HEIGHT - 1)); } if (counters) { - painter->setFont(QFont("Times", 32, QFont::Bold)); - painter->setPen(QPen(Qt::black)); - painter->setBackground(QBrush(QColor(255, 255, 255, 100))); - painter->setBackgroundMode(Qt::OpaqueMode); - painter->drawText(boundingRect(), Qt::AlignCenter, QString::number(counters)); + QString numStr = QString::number(counters); + QFont font("Times", 32, QFont::Bold); + QFontMetrics fm(font); + QRect br = fm.boundingRect(numStr); + double w = br.width() * 1.42; + double h = br.height() * 1.42; + if (w < h) + w = h; + + painter->setPen(Qt::black); + painter->setBrush(QColor(255, 255, 255, 150)); + painter->drawEllipse(QRectF((boundingRect().width() - w) / 2.0, (boundingRect().height() - h) / 2.0, w, h)); + + painter->setFont(font); + painter->drawText(boundingRect(), Qt::AlignCenter, numStr); } painter->restore(); } diff --git a/cockatrice/src/decklist.cpp b/cockatrice/src/decklist.cpp index b5ba557c..cfb1cf58 100644 --- a/cockatrice/src/decklist.cpp +++ b/cockatrice/src/decklist.cpp @@ -53,6 +53,11 @@ AbstractDecklistNode *InnerDecklistNode::findChild(const QString &name) return 0; } +int InnerDecklistNode::height() const +{ + return at(0)->height() + 1; +} + int InnerDecklistNode::recursiveCount(bool countTotalCards) const { int result = 0; diff --git a/cockatrice/src/decklist.h b/cockatrice/src/decklist.h index 53af3a1c..9c962b5a 100644 --- a/cockatrice/src/decklist.h +++ b/cockatrice/src/decklist.h @@ -19,6 +19,7 @@ public: virtual QString getName() const = 0; InnerDecklistNode *getParent() const { return parent; } int depth() const; + virtual int height() const = 0; virtual bool compare(AbstractDecklistNode *other) const = 0; }; @@ -34,6 +35,7 @@ public: virtual QString getVisibleName() const; void clearTree(); AbstractDecklistNode *findChild(const QString &name); + int height() const; int recursiveCount(bool countTotalCards = false) const; bool compare(AbstractDecklistNode *other) const; void sort(Qt::SortOrder order = Qt::AscendingOrder); @@ -46,6 +48,7 @@ public: virtual void setNumber(int _number) = 0; virtual QString getName() const = 0; virtual void setName(const QString &_name) = 0; + int height() const { return 0; } bool compare(AbstractDecklistNode *other) const; }; diff --git a/cockatrice/src/decklistmodel.cpp b/cockatrice/src/decklistmodel.cpp index ca2c4edf..f7fdc4b4 100644 --- a/cockatrice/src/decklistmodel.cpp +++ b/cockatrice/src/decklistmodel.cpp @@ -2,6 +2,10 @@ #include #include #include +#include +#include +#include +#include #include "decklistmodel.h" #include "carddatabase.h" @@ -282,3 +286,43 @@ void DeckListModel::cleanList() deckList->cleanList(); reset(); } + +void DeckListModel::printDeckListNode(QTextCursor *cursor, InnerDecklistNode *node) +{ + cursor->insertBlock(); + cursor->insertText(node->getVisibleName()); + if (node->height() == 1) { + QTextTableFormat tableFormat; + // XXX + QTextTable *table = cursor->insertTable(node->size(), 2, tableFormat); + for (int i = 0; i < node->size(); i++) { + AbstractDecklistCardNode *card = dynamic_cast(node->at(i)); + + QTextCursor cellCursor = table->cellAt(i, 0).firstCursorPosition(); + cellCursor.insertText(QString::number(card->getNumber())); + cellCursor = table->cellAt(i, 1).firstCursorPosition(); + cellCursor.insertText(card->getName()); + } + } else { + for (int i = 0; i < node->size(); i++) + printDeckListNode(cursor, dynamic_cast(node->at(i))); + } + cursor->movePosition(QTextCursor::End); +} + +void DeckListModel::printDeckList(QPrinter *printer) +{ + QTextDocument doc; + QTextCursor cursor(&doc); + + cursor.insertBlock(); + cursor.insertText(deckList->getName()); + + cursor.insertBlock(); + cursor.insertText(deckList->getComments()); + + for (int i = 0; i < root->size(); i++) + printDeckListNode(&cursor, dynamic_cast(root->at(i))); + + doc.print(printer); +} diff --git a/cockatrice/src/decklistmodel.h b/cockatrice/src/decklistmodel.h index e5fb40ac..82003b43 100644 --- a/cockatrice/src/decklistmodel.h +++ b/cockatrice/src/decklistmodel.h @@ -6,6 +6,8 @@ #include "decklist.h" class CardDatabase; +class QPrinter; +class QTextCursor; class DecklistModelCardNode : public AbstractDecklistCardNode { private: @@ -23,6 +25,8 @@ class DeckListModel : public QAbstractItemModel { Q_OBJECT private slots: void rebuildTree(); +public slots: + void printDeckList(QPrinter *printer); public: DeckListModel(CardDatabase *_db, QObject *parent = 0); ~DeckListModel(); @@ -48,6 +52,8 @@ private: void emitRecursiveUpdates(const QModelIndex &index); void debugIndexInfo(const QString &func, const QModelIndex &index) const; void debugShowTree(InnerDecklistNode *node, int depth) const; + + void printDeckListNode(QTextCursor *cursor, InnerDecklistNode *node); template T getNode(const QModelIndex &index) const { diff --git a/cockatrice/src/window_deckeditor.cpp b/cockatrice/src/window_deckeditor.cpp index 7b075a98..60075733 100644 --- a/cockatrice/src/window_deckeditor.cpp +++ b/cockatrice/src/window_deckeditor.cpp @@ -94,6 +94,9 @@ WndDeckEditor::WndDeckEditor(CardDatabase *_db, QWidget *parent) aSaveDeckAs = new QAction(tr("&Save deck as..."), this); // aSaveDeckAs->setShortcuts(QKeySequence::SaveAs); connect(aSaveDeckAs, SIGNAL(triggered()), this, SLOT(actSaveDeckAs())); + aPrintDeck = new QAction(tr("&Print deck..."), this); + aPrintDeck->setShortcuts(QKeySequence::Print); + connect(aPrintDeck, SIGNAL(triggered()), this, SLOT(actPrintDeck())); aClose = new QAction(tr("&Close"), this); aClose->setShortcut(tr("Ctrl+Q")); connect(aClose, SIGNAL(triggered()), this, SLOT(close())); @@ -107,6 +110,8 @@ WndDeckEditor::WndDeckEditor(CardDatabase *_db, QWidget *parent) deckMenu->addAction(aSaveDeck); deckMenu->addAction(aSaveDeckAs); deckMenu->addSeparator(); + deckMenu->addAction(aPrintDeck); + deckMenu->addSeparator(); deckMenu->addAction(aClose); setsMenu = menuBar()->addMenu(tr("&Sets")); @@ -234,6 +239,13 @@ bool WndDeckEditor::actSaveDeckAs() return false; } +void WndDeckEditor::actPrintDeck() +{ + QPrintPreviewDialog *dlg = new QPrintPreviewDialog(this); + connect(dlg, SIGNAL(paintRequested(QPrinter *)), deckModel, SLOT(printDeckList(QPrinter *))); + dlg->exec(); +} + void WndDeckEditor::actEditSets() { WndSets *w = new WndSets(db, this); diff --git a/cockatrice/src/window_deckeditor.h b/cockatrice/src/window_deckeditor.h index 87ee6ba7..c5d67c76 100644 --- a/cockatrice/src/window_deckeditor.h +++ b/cockatrice/src/window_deckeditor.h @@ -24,6 +24,7 @@ private slots: void actLoadDeck(); bool actSaveDeck(); bool actSaveDeckAs(); + void actPrintDeck(); void actEditSets(); @@ -49,7 +50,7 @@ private: QLineEdit *searchEdit, *nameEdit, *commentsEdit; QMenu *deckMenu, *setsMenu; - QAction *aNewDeck, *aLoadDeck, *aSaveDeck, *aSaveDeckAs, *aClose; + QAction *aNewDeck, *aLoadDeck, *aSaveDeck, *aSaveDeckAs, *aPrintDeck, *aClose; QAction *aEditSets; QAction *aAddCard, *aAddCardToSideboard, *aRemoveCard, *aIncrement, *aDecrement; public: