From 38cf2621b466bdbc58d1f0936692d96110dfa129 Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Sun, 22 Apr 2012 05:06:51 -0400 Subject: [PATCH] preliminary changes to make deck editor a tab --- cockatrice/CMakeLists.txt | 4 +- cockatrice/src/tab.cpp | 2 +- cockatrice/src/tab.h | 6 +- ...dow_deckeditor.cpp => tab_deck_editor.cpp} | 173 +++++++++++------- ...{window_deckeditor.h => tab_deck_editor.h} | 19 +- cockatrice/src/tab_deck_storage.cpp | 14 +- cockatrice/src/tab_game.cpp | 34 ++-- cockatrice/src/tab_game.h | 1 + cockatrice/src/tab_message.cpp | 7 +- cockatrice/src/tab_message.h | 1 + cockatrice/src/tab_room.cpp | 7 +- cockatrice/src/tab_room.h | 3 +- cockatrice/src/tab_supervisor.cpp | 48 ++++- cockatrice/src/tab_supervisor.h | 9 +- cockatrice/src/window_main.cpp | 31 ++-- cockatrice/src/window_main.h | 5 +- 16 files changed, 229 insertions(+), 135 deletions(-) rename cockatrice/src/{window_deckeditor.cpp => tab_deck_editor.cpp} (81%) rename cockatrice/src/{window_deckeditor.h => tab_deck_editor.h} (86%) diff --git a/cockatrice/CMakeLists.txt b/cockatrice/CMakeLists.txt index 5f13bf73..4ba9a9f3 100644 --- a/cockatrice/CMakeLists.txt +++ b/cockatrice/CMakeLists.txt @@ -38,7 +38,6 @@ SET(cockatrice_SOURCES src/stackzone.cpp src/carddragitem.cpp src/carddatabasemodel.cpp - src/window_deckeditor.cpp src/setsmodel.cpp src/window_sets.cpp src/abstractgraphicsitem.cpp @@ -59,6 +58,7 @@ SET(cockatrice_SOURCES src/tab_supervisor.cpp src/tab_admin.cpp src/tab_userlists.cpp + src/tab_deck_editor.cpp src/replay_timeline_widget.cpp src/chatview.cpp src/userlist.cpp @@ -111,7 +111,6 @@ SET(cockatrice_HEADERS src/stackzone.h src/carddragitem.h src/carddatabasemodel.h - src/window_deckeditor.h src/setsmodel.h src/window_sets.h src/abstractgraphicsitem.h @@ -132,6 +131,7 @@ SET(cockatrice_HEADERS src/tab_supervisor.h src/tab_admin.h src/tab_userlists.h + src/tab_deck_editor.h src/replay_timeline_widget.h src/chatview.h src/userlist.h diff --git a/cockatrice/src/tab.cpp b/cockatrice/src/tab.cpp index 0ce82d67..0c20a821 100644 --- a/cockatrice/src/tab.cpp +++ b/cockatrice/src/tab.cpp @@ -4,7 +4,7 @@ #include #include Tab::Tab(TabSupervisor *_tabSupervisor, QWidget *parent) - : QWidget(parent), tabMenu(0), tabSupervisor(_tabSupervisor), contentsChanged(false), infoPopup(0) + : QWidget(parent), tabSupervisor(_tabSupervisor), contentsChanged(false), infoPopup(0) { } diff --git a/cockatrice/src/tab.h b/cockatrice/src/tab.h index f7dc472f..445180fd 100644 --- a/cockatrice/src/tab.h +++ b/cockatrice/src/tab.h @@ -11,18 +11,20 @@ class Tab : public QWidget { Q_OBJECT signals: void userEvent(bool globalEvent = true); + void tabTextChanged(Tab *tab, const QString &newTabText); protected: - QMenu *tabMenu; TabSupervisor *tabSupervisor; + void addTabMenu(QMenu *menu) { tabMenus.append(menu); } protected slots: void showCardInfoPopup(const QPoint &pos, const QString &cardName); void deleteCardInfoPopup(const QString &cardName); private: bool contentsChanged; CardInfoWidget *infoPopup; + QList tabMenus; public: Tab(TabSupervisor *_tabSupervisor, QWidget *parent = 0); - QMenu *getTabMenu() const { return tabMenu; } + const QList &getTabMenus() const { return tabMenus; } TabSupervisor *getTabSupervisor() const { return tabSupervisor; } bool getContentsChanged() const { return contentsChanged; } void setContentsChanged(bool _contentsChanged) { contentsChanged = _contentsChanged; } diff --git a/cockatrice/src/window_deckeditor.cpp b/cockatrice/src/tab_deck_editor.cpp similarity index 81% rename from cockatrice/src/window_deckeditor.cpp rename to cockatrice/src/tab_deck_editor.cpp index a4d652d0..bf2c06f3 100644 --- a/cockatrice/src/window_deckeditor.cpp +++ b/cockatrice/src/tab_deck_editor.cpp @@ -16,7 +16,7 @@ #include #include #include -#include "window_deckeditor.h" +#include "tab_deck_editor.h" #include "window_sets.h" #include "carddatabase.h" #include "carddatabasemodel.h" @@ -35,19 +35,17 @@ void SearchLineEdit::keyPressEvent(QKeyEvent *event) QLineEdit::keyPressEvent(event); } -WndDeckEditor::WndDeckEditor(QWidget *parent) - : QMainWindow(parent) +TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent) + : Tab(_tabSupervisor, parent) { - setAttribute(Qt::WA_DeleteOnClose); - - aSearch = new QAction(tr("&Search..."), this); + aSearch = new QAction(QString(), this); aSearch->setIcon(QIcon(":/resources/icon_search.svg")); connect(aSearch, SIGNAL(triggered()), this, SLOT(actSearch())); - aClearSearch = new QAction(tr("&Clear search"), this); + aClearSearch = new QAction(QString(), this); aClearSearch->setIcon(QIcon(":/resources/icon_clearsearch.svg")); connect(aClearSearch, SIGNAL(triggered()), this, SLOT(actClearSearch())); - QLabel *searchLabel = new QLabel(tr("&Search for:")); + searchLabel = new QLabel(); searchEdit = new SearchLineEdit; searchLabel->setBuddy(searchEdit); connect(searchEdit, SIGNAL(textChanged(const QString &)), this, SLOT(updateSearch(const QString &))); @@ -108,16 +106,16 @@ WndDeckEditor::WndDeckEditor(QWidget *parent) 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:")); + nameLabel = new QLabel(); nameEdit = new QLineEdit; nameLabel->setBuddy(nameEdit); connect(nameEdit, SIGNAL(textChanged(const QString &)), this, SLOT(updateName(const QString &))); - QLabel *commentsLabel = new QLabel(tr("&Comments:")); + commentsLabel = new QLabel(); commentsEdit = new QTextEdit; commentsEdit->setMaximumHeight(70); commentsLabel->setBuddy(commentsEdit); connect(commentsEdit, SIGNAL(textChanged()), this, SLOT(updateComments())); - QLabel *hashLabel1 = new QLabel(tr("Hash:")); + hashLabel1 = new QLabel(); hashLabel = new QLabel; QGridLayout *grid = new QGridLayout; @@ -131,8 +129,7 @@ WndDeckEditor::WndDeckEditor(QWidget *parent) grid->addWidget(hashLabel, 2, 1); // Update price - aUpdatePrices = new QAction(tr("&Update prices"), this); - aUpdatePrices->setShortcut(tr("Ctrl+U")); + aUpdatePrices = new QAction(QString(), this); aUpdatePrices->setIcon(QIcon(":/resources/icon_update.png")); connect(aUpdatePrices, SIGNAL(triggered()), this, SLOT(actUpdatePrices())); if (!settingsCache->getPriceTagFeature()) @@ -157,29 +154,26 @@ WndDeckEditor::WndDeckEditor(QWidget *parent) mainLayout->addLayout(leftFrame, 10); mainLayout->addLayout(middleFrame); mainLayout->addLayout(rightFrame, 10); - - QWidget *centralWidget = new QWidget; - centralWidget->setLayout(mainLayout); - setCentralWidget(centralWidget); - + setLayout(mainLayout); + setWindowTitle(tr("Deck editor [*]")); - aNewDeck = new QAction(tr("&New deck"), this); + aNewDeck = new QAction(QString(), this); aNewDeck->setShortcuts(QKeySequence::New); connect(aNewDeck, SIGNAL(triggered()), this, SLOT(actNewDeck())); - aLoadDeck = new QAction(tr("&Load deck..."), this); + aLoadDeck = new QAction(QString(), this); aLoadDeck->setShortcuts(QKeySequence::Open); connect(aLoadDeck, SIGNAL(triggered()), this, SLOT(actLoadDeck())); - aSaveDeck = new QAction(tr("&Save deck"), this); + aSaveDeck = new QAction(QString(), this); aSaveDeck->setShortcuts(QKeySequence::Save); connect(aSaveDeck, SIGNAL(triggered()), this, SLOT(actSaveDeck())); - aSaveDeckAs = new QAction(tr("Save deck &as..."), this); + aSaveDeckAs = new QAction(QString(), this); // aSaveDeckAs->setShortcuts(QKeySequence::SaveAs); connect(aSaveDeckAs, SIGNAL(triggered()), this, SLOT(actSaveDeckAs())); - aLoadDeckFromClipboard = new QAction(tr("Load deck from cl&ipboard..."), this); + aLoadDeckFromClipboard = new QAction(QString(), this); connect(aLoadDeckFromClipboard, SIGNAL(triggered()), this, SLOT(actLoadDeckFromClipboard())); aLoadDeckFromClipboard->setShortcuts(QKeySequence::Paste); - aSaveDeckToClipboard = new QAction(tr("Save deck to clip&board"), this); + aSaveDeckToClipboard = new QAction(QString(), this); connect(aSaveDeckToClipboard, SIGNAL(triggered()), this, SLOT(actSaveDeckToClipboard())); aSaveDeckToClipboard->setShortcuts(QKeySequence::Copy); aPrintDeck = new QAction(tr("&Print deck..."), this); @@ -192,7 +186,7 @@ WndDeckEditor::WndDeckEditor(QWidget *parent) aEditSets = new QAction(tr("&Edit sets..."), this); connect(aEditSets, SIGNAL(triggered()), this, SLOT(actEditSets())); - deckMenu = menuBar()->addMenu(tr("&Deck")); + deckMenu = new QMenu(this); deckMenu->addAction(aNewDeck); deckMenu->addAction(aLoadDeck); deckMenu->addAction(aSaveDeck); @@ -204,32 +198,29 @@ WndDeckEditor::WndDeckEditor(QWidget *parent) deckMenu->addAction(aPrintDeck); deckMenu->addSeparator(); deckMenu->addAction(aClose); + addTabMenu(deckMenu); - dbMenu = menuBar()->addMenu(tr("&Card database")); + dbMenu = new QMenu(this); dbMenu->addAction(aEditSets); dbMenu->addSeparator(); dbMenu->addAction(aSearch); dbMenu->addAction(aClearSearch); + addTabMenu(dbMenu); - aAddCard = new QAction(tr("Add card to &maindeck"), this); - aAddCard->setShortcuts(QList() << QKeySequence(tr("Return")) << QKeySequence(tr("Enter"))); + aAddCard = new QAction(QString(), this); aAddCard->setIcon(QIcon(":/resources/arrow_right_green.svg")); connect(aAddCard, SIGNAL(triggered()), this, SLOT(actAddCard())); - aAddCardToSideboard = new QAction(tr("Add card to &sideboard"), this); + aAddCardToSideboard = new QAction(QString(), this); aAddCardToSideboard->setIcon(QIcon(":/resources/add_to_sideboard.svg")); - aAddCardToSideboard->setShortcuts(QList() << QKeySequence(tr("Ctrl+Return")) << QKeySequence(tr("Ctrl+Enter"))); connect(aAddCardToSideboard, SIGNAL(triggered()), this, SLOT(actAddCardToSideboard())); - aRemoveCard = new QAction(tr("&Remove row"), this); - aRemoveCard->setShortcut(tr("Del")); + aRemoveCard = new QAction(QString(), this); aRemoveCard->setIcon(QIcon(":/resources/remove_row.svg")); connect(aRemoveCard, SIGNAL(triggered()), this, SLOT(actRemoveCard())); - aIncrement = new QAction(tr("&Increment number"), this); - aIncrement->setShortcut(tr("+")); + aIncrement = new QAction(QString(), this); aIncrement->setIcon(QIcon(":/resources/increment.svg")); connect(aIncrement, SIGNAL(triggered()), this, SLOT(actIncrement())); - aDecrement = new QAction(tr("&Decrement number"), this); + aDecrement = new QAction(QString(), this); aDecrement->setIcon(QIcon(":/resources/decrement.svg")); - aDecrement->setShortcut(tr("-")); connect(aDecrement, SIGNAL(triggered()), this, SLOT(actDecrement())); verticalToolBar->addAction(aAddCard); @@ -241,31 +232,78 @@ WndDeckEditor::WndDeckEditor(QWidget *parent) dlgCardSearch = new DlgCardSearch(this); + retranslateUi(); + resize(950, 700); } -WndDeckEditor::~WndDeckEditor() +TabDeckEditor::~TabDeckEditor() { + emit deckEditorClosing(this); } -void WndDeckEditor::updateName(const QString &name) +void TabDeckEditor::retranslateUi() +{ + aSearch->setText(tr("&Search...")); + aClearSearch->setText(tr("&Clear search")); + searchLabel->setText(tr("&Search for:")); + + nameLabel->setText(tr("Deck &name:")); + commentsLabel->setText(tr("&Comments:")); + hashLabel1->setText(tr("Hash:")); + + aUpdatePrices->setText(tr("&Update prices")); + aUpdatePrices->setShortcut(tr("Ctrl+U")); + + aNewDeck->setText(tr("&New deck")); + aLoadDeck->setText(tr("&Load deck...")); + aSaveDeck->setText(tr("&Save deck")); + aSaveDeckAs->setText(tr("Save deck &as...")); + aLoadDeckFromClipboard->setText(tr("Load deck from cl&ipboard...")); + aSaveDeckToClipboard->setText(tr("Save deck to clip&board")); + + aAddCard->setText(tr("Add card to &maindeck")); + aAddCard->setShortcuts(QList() << QKeySequence(tr("Return")) << QKeySequence(tr("Enter"))); + aAddCardToSideboard->setText(tr("Add card to &sideboard")); + aAddCardToSideboard->setShortcuts(QList() << QKeySequence(tr("Ctrl+Return")) << QKeySequence(tr("Ctrl+Enter"))); + aRemoveCard->setText(tr("&Remove row")); + aRemoveCard->setShortcut(tr("Del")); + aIncrement->setText(tr("&Increment number")); + aIncrement->setShortcut(tr("+")); + aDecrement->setText(tr("&Decrement number")); + aDecrement->setShortcut(tr("-")); + + deckMenu->setTitle(tr("&Deck editor")); + dbMenu->setTitle(tr("C&ard database")); +} + +QString TabDeckEditor::getTabText() const +{ + QString result = tr("Deck: %1").arg(nameEdit->text()); + if (isWindowModified()) + result.prepend("* "); + return result; +} + +void TabDeckEditor::updateName(const QString &name) { deckModel->getDeckList()->setName(name); setWindowModified(true); + emit tabTextChanged(this, getTabText()); } -void WndDeckEditor::updateComments() +void TabDeckEditor::updateComments() { deckModel->getDeckList()->setComments(commentsEdit->toPlainText()); setWindowModified(true); } -void WndDeckEditor::updateCardInfoLeft(const QModelIndex ¤t, const QModelIndex &/*previous*/) +void TabDeckEditor::updateCardInfoLeft(const QModelIndex ¤t, const QModelIndex &/*previous*/) { cardInfo->setCard(current.sibling(current.row(), 0).data().toString()); } -void WndDeckEditor::updateCardInfoRight(const QModelIndex ¤t, const QModelIndex &/*previous*/) +void TabDeckEditor::updateCardInfoRight(const QModelIndex ¤t, const QModelIndex &/*previous*/) { if (!current.isValid()) return; @@ -273,7 +311,7 @@ void WndDeckEditor::updateCardInfoRight(const QModelIndex ¤t, const QModel cardInfo->setCard(current.sibling(current.row(), 1).data().toString()); } -void WndDeckEditor::updateSearch(const QString &search) +void TabDeckEditor::updateSearch(const QString &search) { databaseDisplayModel->setCardNameBeginning(search); QModelIndexList sel = databaseView->selectionModel()->selectedRows(); @@ -281,12 +319,12 @@ void WndDeckEditor::updateSearch(const QString &search) databaseView->selectionModel()->setCurrentIndex(databaseDisplayModel->index(0, 0), QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows); } -void WndDeckEditor::updateHash() +void TabDeckEditor::updateHash() { hashLabel->setText(deckModel->getDeckList()->getDeckHash()); } -bool WndDeckEditor::confirmClose() +bool TabDeckEditor::confirmClose() { if (isWindowModified()) { QMessageBox::StandardButton ret = QMessageBox::warning(this, tr("Are you sure?"), @@ -300,16 +338,13 @@ bool WndDeckEditor::confirmClose() return true; } -void WndDeckEditor::closeEvent(QCloseEvent *event) +void TabDeckEditor::closeRequest() { - if (confirmClose()) { - event->accept(); + if (confirmClose()) deleteLater(); - } else - event->ignore(); } -void WndDeckEditor::actNewDeck() +void TabDeckEditor::actNewDeck() { if (!confirmClose()) return; @@ -321,7 +356,7 @@ void WndDeckEditor::actNewDeck() setWindowModified(false); } -void WndDeckEditor::actLoadDeck() +void TabDeckEditor::actLoadDeck() { if (!confirmClose()) return; @@ -341,7 +376,7 @@ void WndDeckEditor::actLoadDeck() delete l; } -bool WndDeckEditor::actSaveDeck() +bool TabDeckEditor::actSaveDeck() { if (lastFileName.isEmpty()) return actSaveDeckAs(); @@ -353,7 +388,7 @@ bool WndDeckEditor::actSaveDeck() return false; } -bool WndDeckEditor::actSaveDeckAs() +bool TabDeckEditor::actSaveDeckAs() { QFileDialog dialog(this, tr("Save deck")); dialog.setDirectory(settingsCache->getDeckPath()); @@ -378,7 +413,7 @@ bool WndDeckEditor::actSaveDeckAs() return false; } -void WndDeckEditor::actLoadDeckFromClipboard() +void TabDeckEditor::actLoadDeckFromClipboard() { if (!confirmClose()) return; @@ -391,7 +426,7 @@ void WndDeckEditor::actLoadDeckFromClipboard() setWindowModified(true); } -void WndDeckEditor::actSaveDeckToClipboard() +void TabDeckEditor::actSaveDeckToClipboard() { QString buffer; QTextStream stream(&buffer); @@ -400,21 +435,21 @@ void WndDeckEditor::actSaveDeckToClipboard() QApplication::clipboard()->setText(buffer, QClipboard::Selection); } -void WndDeckEditor::actPrintDeck() +void TabDeckEditor::actPrintDeck() { QPrintPreviewDialog *dlg = new QPrintPreviewDialog(this); connect(dlg, SIGNAL(paintRequested(QPrinter *)), deckModel, SLOT(printDeckList(QPrinter *))); dlg->exec(); } -void WndDeckEditor::actEditSets() +void TabDeckEditor::actEditSets() { WndSets *w = new WndSets; w->setWindowModality(Qt::WindowModal); w->show(); } -void WndDeckEditor::actSearch() +void TabDeckEditor::actSearch() { if (dlgCardSearch->exec()) { searchEdit->clear(); @@ -425,19 +460,19 @@ void WndDeckEditor::actSearch() } } -void WndDeckEditor::actClearSearch() +void TabDeckEditor::actClearSearch() { databaseDisplayModel->clearSearch(); } -void WndDeckEditor::recursiveExpand(const QModelIndex &index) +void TabDeckEditor::recursiveExpand(const QModelIndex &index) { if (index.parent().isValid()) recursiveExpand(index.parent()); deckView->expand(index); } -void WndDeckEditor::addCardHelper(QString zoneName) +void TabDeckEditor::addCardHelper(QString zoneName) { const QModelIndex currentIndex = databaseView->selectionModel()->currentIndex(); if (!currentIndex.isValid()) @@ -455,17 +490,17 @@ void WndDeckEditor::addCardHelper(QString zoneName) setWindowModified(true); } -void WndDeckEditor::actAddCard() +void TabDeckEditor::actAddCard() { addCardHelper("main"); } -void WndDeckEditor::actAddCardToSideboard() +void TabDeckEditor::actAddCardToSideboard() { addCardHelper("side"); } -void WndDeckEditor::actRemoveCard() +void TabDeckEditor::actRemoveCard() { const QModelIndex ¤tIndex = deckView->selectionModel()->currentIndex(); if (!currentIndex.isValid() || deckModel->hasChildren(currentIndex)) @@ -474,7 +509,7 @@ void WndDeckEditor::actRemoveCard() setWindowModified(true); } -void WndDeckEditor::actIncrement() +void TabDeckEditor::actIncrement() { const QModelIndex ¤tIndex = deckView->selectionModel()->currentIndex(); if (!currentIndex.isValid()) @@ -486,7 +521,7 @@ void WndDeckEditor::actIncrement() setWindowModified(true); } -void WndDeckEditor::actDecrement() +void TabDeckEditor::actDecrement() { const QModelIndex ¤tIndex = deckView->selectionModel()->currentIndex(); if (!currentIndex.isValid()) @@ -501,7 +536,7 @@ void WndDeckEditor::actDecrement() setWindowModified(true); } -void WndDeckEditor::actUpdatePrices() +void TabDeckEditor::actUpdatePrices() { aUpdatePrices->setDisabled(true); PriceUpdater *up = new PriceUpdater(deckModel->getDeckList()); @@ -509,14 +544,14 @@ void WndDeckEditor::actUpdatePrices() up->updatePrices(); } -void WndDeckEditor::finishedUpdatingPrices() +void TabDeckEditor::finishedUpdatingPrices() { deckModel->pricesUpdated(); setWindowModified(true); aUpdatePrices->setDisabled(false); } -void WndDeckEditor::setDeck(DeckList *_deck, const QString &_lastFileName, DeckList::FileFormat _lastFileFormat) +void TabDeckEditor::setDeck(DeckList *_deck, const QString &_lastFileName, DeckList::FileFormat _lastFileFormat) { deckModel->setDeckList(_deck); diff --git a/cockatrice/src/window_deckeditor.h b/cockatrice/src/tab_deck_editor.h similarity index 86% rename from cockatrice/src/window_deckeditor.h rename to cockatrice/src/tab_deck_editor.h index d231ab82..2278d920 100644 --- a/cockatrice/src/window_deckeditor.h +++ b/cockatrice/src/tab_deck_editor.h @@ -1,7 +1,7 @@ #ifndef WINDOW_DECKEDITOR_H #define WINDOW_DECKEDITOR_H -#include +#include "tab.h" #include #include #include "decklist.h" @@ -26,7 +26,7 @@ class SearchLineEdit : public QLineEdit { void setTreeView(QTreeView *_treeView) { treeView = _treeView; } }; -class WndDeckEditor : public QMainWindow { +class TabDeckEditor : public Tab { Q_OBJECT private slots: void updateName(const QString &name); @@ -71,9 +71,13 @@ private: QTreeView *databaseView; QTreeView *deckView; CardInfoWidget *cardInfo; + QLabel *searchLabel; SearchLineEdit *searchEdit; + QLabel *nameLabel; QLineEdit *nameEdit; + QLabel *commentsLabel; QTextEdit *commentsEdit; + QLabel *hashLabel1; QLabel *hashLabel; DlgCardSearch *dlgCardSearch; @@ -82,11 +86,14 @@ private: QAction *aEditSets, *aSearch, *aClearSearch; QAction *aAddCard, *aAddCardToSideboard, *aRemoveCard, *aIncrement, *aDecrement, *aUpdatePrices; public: - WndDeckEditor(QWidget *parent = 0); - ~WndDeckEditor(); + TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent = 0); + ~TabDeckEditor(); + void retranslateUi(); + QString getTabText() const; + void closeRequest(); void setDeck(DeckList *_deck, const QString &_lastFileName = QString(), DeckList::FileFormat _lastFileFormat = DeckList::CockatriceFormat); -protected: - void closeEvent(QCloseEvent *event); +signals: + void deckEditorClosing(TabDeckEditor *tab); }; #endif diff --git a/cockatrice/src/tab_deck_storage.cpp b/cockatrice/src/tab_deck_storage.cpp index 0b66f83e..de8fa27f 100644 --- a/cockatrice/src/tab_deck_storage.cpp +++ b/cockatrice/src/tab_deck_storage.cpp @@ -12,7 +12,7 @@ #include "remotedecklist_treewidget.h" #include "abstractclient.h" #include "decklist.h" -#include "window_deckeditor.h" +//#include "window_deckeditor.h" #include "settingscache.h" #include "pending_command.h" @@ -127,9 +127,9 @@ void TabDeckStorage::actOpenLocalDeck() if (!deck->loadFromFile(filePath, DeckList::CockatriceFormat)) return; - WndDeckEditor *deckEditor = new WndDeckEditor; - deckEditor->setDeck(deck, filePath, DeckList::CockatriceFormat); - deckEditor->show(); +// WndDeckEditor *deckEditor = new WndDeckEditor; +// deckEditor->setDeck(deck, filePath, DeckList::CockatriceFormat); +// deckEditor->show(); } void TabDeckStorage::actUpload() @@ -196,9 +196,9 @@ void TabDeckStorage::openRemoteDeckFinished(const Response &r) { const Response_DeckDownload &resp = r.GetExtension(Response_DeckDownload::ext); - WndDeckEditor *deckEditor = new WndDeckEditor; - deckEditor->setDeck(new DeckList(QString::fromStdString(resp.deck()))); - deckEditor->show(); +// WndDeckEditor *deckEditor = new WndDeckEditor; +// deckEditor->setDeck(new DeckList(QString::fromStdString(resp.deck()))); +// deckEditor->show(); } void TabDeckStorage::actDownload() diff --git a/cockatrice/src/tab_game.cpp b/cockatrice/src/tab_game.cpp index 34a7e803..4243c170 100644 --- a/cockatrice/src/tab_game.cpp +++ b/cockatrice/src/tab_game.cpp @@ -365,8 +365,9 @@ TabGame::TabGame(TabSupervisor *_tabSupervisor, GameReplay *_replay) connect(aCloseReplay, SIGNAL(triggered()), this, SLOT(actLeaveGame())); phasesMenu = 0; - tabMenu = new QMenu(this); - tabMenu->addAction(aCloseReplay); + gameMenu = new QMenu(this); + gameMenu->addAction(aCloseReplay); + addTabMenu(gameMenu); retranslateUi(); setLayout(superMainLayout); @@ -486,16 +487,17 @@ TabGame::TabGame(TabSupervisor *_tabSupervisor, QList &_client phasesMenu->addSeparator(); phasesMenu->addAction(aNextPhase); - tabMenu = new QMenu(this); - playersSeparator = tabMenu->addSeparator(); - tabMenu->addMenu(phasesMenu); - tabMenu->addAction(aNextTurn); - tabMenu->addSeparator(); - tabMenu->addAction(aRemoveLocalArrows); - tabMenu->addSeparator(); - tabMenu->addAction(aGameInfo); - tabMenu->addAction(aConcede); - tabMenu->addAction(aLeaveGame); + gameMenu = new QMenu(this); + playersSeparator = gameMenu->addSeparator(); + gameMenu->addMenu(phasesMenu); + gameMenu->addAction(aNextTurn); + gameMenu->addSeparator(); + gameMenu->addAction(aRemoveLocalArrows); + gameMenu->addSeparator(); + gameMenu->addAction(aGameInfo); + gameMenu->addAction(aConcede); + gameMenu->addAction(aLeaveGame); + addTabMenu(gameMenu); retranslateUi(); setLayout(mainLayout); @@ -528,7 +530,7 @@ void TabGame::retranslateUi() phasesMenu->setTitle(tr("&Phases")); } - tabMenu->setTitle(tr("&Game")); + gameMenu->setTitle(tr("&Game")); if (aNextPhase) { aNextPhase->setText(tr("Next &phase")); aNextPhase->setShortcut(tr("Ctrl+Space")); @@ -747,7 +749,7 @@ Player *TabGame::addPlayer(int playerId, const ServerInfo_User &info) deckViewContainerLayout->addWidget(deckView); } - tabMenu->insertMenu(playersSeparator, newPlayer->getPlayerMenu()); + gameMenu->insertMenu(playersSeparator, newPlayer->getPlayerMenu()); players.insert(playerId, newPlayer); emit playerAdded(newPlayer); @@ -905,8 +907,8 @@ void TabGame::closeGame() gameInfo.set_started(false); gameClosed = true; - tabMenu->clear(); - tabMenu->addAction(aLeaveGame); + gameMenu->clear(); + gameMenu->addAction(aLeaveGame); } void TabGame::eventSpectatorSay(const Event_GameSay &event, int eventPlayerId, const GameEventContext & /*context*/) diff --git a/cockatrice/src/tab_game.h b/cockatrice/src/tab_game.h index 9857a7ac..f62c33f8 100644 --- a/cockatrice/src/tab_game.h +++ b/cockatrice/src/tab_game.h @@ -138,6 +138,7 @@ private: QHBoxLayout *mainLayout; ZoneViewLayout *zoneLayout; QAction *playersSeparator; + QMenu *gameMenu; QMenu *phasesMenu; QAction *aGameInfo, *aConcede, *aLeaveGame, *aCloseReplay, *aNextPhase, *aNextTurn, *aRemoveLocalArrows; QList phaseActions; diff --git a/cockatrice/src/tab_message.cpp b/cockatrice/src/tab_message.cpp index d5938c2a..cfc5c050 100644 --- a/cockatrice/src/tab_message.cpp +++ b/cockatrice/src/tab_message.cpp @@ -28,8 +28,9 @@ TabMessage::TabMessage(TabSupervisor *_tabSupervisor, AbstractClient *_client, c aLeave = new QAction(this); connect(aLeave, SIGNAL(triggered()), this, SLOT(actLeave())); - tabMenu = new QMenu(this); - tabMenu->addAction(aLeave); + messageMenu = new QMenu(this); + messageMenu->addAction(aLeave); + addTabMenu(messageMenu); retranslateUi(); setLayout(vbox); @@ -44,7 +45,7 @@ TabMessage::~TabMessage() void TabMessage::retranslateUi() { - tabMenu->setTitle(tr("Personal &talk")); + messageMenu->setTitle(tr("Personal &talk")); aLeave->setText(tr("&Leave")); } diff --git a/cockatrice/src/tab_message.h b/cockatrice/src/tab_message.h index a5d566cd..08307fff 100644 --- a/cockatrice/src/tab_message.h +++ b/cockatrice/src/tab_message.h @@ -14,6 +14,7 @@ class TabMessage : public Tab { Q_OBJECT private: AbstractClient *client; + QMenu *messageMenu; ServerInfo_User *ownUserInfo; ServerInfo_User *otherUserInfo; bool userOnline; diff --git a/cockatrice/src/tab_room.cpp b/cockatrice/src/tab_room.cpp index 522ef412..ac7224f1 100644 --- a/cockatrice/src/tab_room.cpp +++ b/cockatrice/src/tab_room.cpp @@ -82,8 +82,9 @@ TabRoom::TabRoom(TabSupervisor *_tabSupervisor, AbstractClient *_client, ServerI aLeaveRoom = new QAction(this); connect(aLeaveRoom, SIGNAL(triggered()), this, SLOT(actLeaveRoom())); - tabMenu = new QMenu(this); - tabMenu->addAction(aLeaveRoom); + roomMenu = new QMenu(this); + roomMenu->addAction(aLeaveRoom); + addTabMenu(roomMenu); retranslateUi(); setLayout(hbox); @@ -109,7 +110,7 @@ void TabRoom::retranslateUi() chatView->retranslateUi(); sayLabel->setText(tr("&Say:")); chatGroupBox->setTitle(tr("Chat")); - tabMenu->setTitle(tr("&Room")); + roomMenu->setTitle(tr("&Room")); aLeaveRoom->setText(tr("&Leave room")); aIgnoreUnregisteredUsers->setText(tr("&Ignore unregistered users in chat")); } diff --git a/cockatrice/src/tab_room.h b/cockatrice/src/tab_room.h index 9c1179b8..752a4672 100644 --- a/cockatrice/src/tab_room.h +++ b/cockatrice/src/tab_room.h @@ -40,7 +40,8 @@ private: QLabel *sayLabel; QLineEdit *sayEdit; QGroupBox *chatGroupBox; - + + QMenu *roomMenu; QAction *aLeaveRoom; QAction *aIgnoreUnregisteredUsers; QString sanitizeHtml(QString dirty) const; diff --git a/cockatrice/src/tab_supervisor.cpp b/cockatrice/src/tab_supervisor.cpp index c9df68a0..d5d11aaf 100644 --- a/cockatrice/src/tab_supervisor.cpp +++ b/cockatrice/src/tab_supervisor.cpp @@ -9,6 +9,7 @@ #include "tab_admin.h" #include "tab_message.h" #include "tab_userlists.h" +#include "tab_deck_editor.h" #include "pixmapgenerator.h" #include "userlist.h" #include @@ -86,6 +87,8 @@ TabSupervisor::TabSupervisor(AbstractClient *_client, QWidget *parent) connect(client, SIGNAL(gameJoinedEventReceived(const Event_GameJoined &)), this, SLOT(gameJoined(const Event_GameJoined &))); connect(client, SIGNAL(userMessageEventReceived(const Event_UserMessage &)), this, SLOT(processUserMessageEvent(const Event_UserMessage &))); connect(client, SIGNAL(maxPingTime(int, int)), this, SLOT(updatePingTime(int, int))); + + retranslateUi(); } TabSupervisor::~TabSupervisor() @@ -111,6 +114,9 @@ void TabSupervisor::retranslateUi() QListIterator replayIterator(replayTabs); while (replayIterator.hasNext()) tabs.append(replayIterator.next()); + QListIterator deckEditorIterator(deckEditorTabs); + while (deckEditorIterator.hasNext()) + tabs.append(deckEditorIterator.next()); for (int i = 0; i < tabs.size(); ++i) if (tabs[i]) { @@ -127,6 +133,7 @@ AbstractClient *TabSupervisor::getClient() const int TabSupervisor::myAddTab(Tab *tab) { connect(tab, SIGNAL(userEvent(bool)), this, SLOT(tabUserEvent(bool))); + connect(tab, SIGNAL(tabTextChanged(Tab *, QString)), this, SLOT(updateTabText(Tab *, QString))); return addTab(tab, tab->getTabText()); } @@ -228,6 +235,10 @@ void TabSupervisor::stop() messageIterator.next().value()->deleteLater(); messageTabs.clear(); + QListIterator deckEditorIterator(deckEditorTabs); + while (deckEditorIterator.hasNext()) + deckEditorIterator.next()->deleteLater(); + delete userInfo; userInfo = 0; } @@ -295,7 +306,7 @@ void TabSupervisor::localGameJoined(const Event_GameJoined &event) void TabSupervisor::gameLeft(TabGame *tab) { if (tab == currentWidget()) - emit setMenu(0); + emit setMenu(); gameTabs.remove(tab->getGameId()); removeTab(indexOf(tab)); @@ -319,7 +330,7 @@ void TabSupervisor::addRoomTab(const ServerInfo_Room &info, bool setCurrent) void TabSupervisor::roomLeft(TabRoom *tab) { if (tab == currentWidget()) - emit setMenu(0); + emit setMenu(); roomTabs.remove(tab->getRoomId()); removeTab(indexOf(tab)); @@ -338,7 +349,7 @@ void TabSupervisor::openReplay(GameReplay *replay) void TabSupervisor::replayLeft(TabGame *tab) { if (tab == currentWidget()) - emit setMenu(0); + emit setMenu(); replayTabs.removeAt(replayTabs.indexOf(tab)); } @@ -367,12 +378,32 @@ TabMessage *TabSupervisor::addMessageTab(const QString &receiverName, bool focus void TabSupervisor::talkLeft(TabMessage *tab) { if (tab == currentWidget()) - emit setMenu(0); + emit setMenu(); messageTabs.remove(tab->getUserName()); removeTab(indexOf(tab)); } +TabDeckEditor *TabSupervisor::addDeckEditorTab(DeckList *deckToOpen) +{ + TabDeckEditor *tab = new TabDeckEditor(this); + connect(tab, SIGNAL(deckEditorClosing(TabDeckEditor *)), this, SLOT(deckEditorClosed(TabDeckEditor *))); + int tabIndex = myAddTab(tab); + addCloseButtonToTab(tab, tabIndex); + deckEditorTabs.append(tab); + setCurrentWidget(tab); + return tab; +} + +void TabSupervisor::deckEditorClosed(TabDeckEditor *tab) +{ + if (tab == currentWidget()) + emit setMenu(); + + deckEditorTabs.removeAt(deckEditorTabs.indexOf(tab)); + removeTab(indexOf(tab)); +} + void TabSupervisor::tabUserEvent(bool globalEvent) { Tab *tab = static_cast(sender()); @@ -384,6 +415,11 @@ void TabSupervisor::tabUserEvent(bool globalEvent) QApplication::alert(this); } +void TabSupervisor::updateTabText(Tab *tab, const QString &newTabText) +{ + setTabText(indexOf(tab), newTabText); +} + void TabSupervisor::processRoomEvent(const RoomEvent &event) { TabRoom *tab = roomTabs.value(event.room_id(), 0); @@ -434,9 +470,9 @@ void TabSupervisor::updateCurrent(int index) setTabIcon(index, QIcon()); tab->setContentsChanged(false); } - emit setMenu(static_cast(widget(index))->getTabMenu()); + emit setMenu(static_cast(widget(index))->getTabMenus()); } else - emit setMenu(0); + emit setMenu(); } bool TabSupervisor::getAdminLocked() const diff --git a/cockatrice/src/tab_supervisor.h b/cockatrice/src/tab_supervisor.h index 379ef877..b95cad64 100644 --- a/cockatrice/src/tab_supervisor.h +++ b/cockatrice/src/tab_supervisor.h @@ -16,6 +16,7 @@ class TabReplays; class TabAdmin; class TabMessage; class TabUserLists; +class TabDeckEditor; class RoomEvent; class GameEventContainer; class Event_GameJoined; @@ -23,6 +24,7 @@ class Event_UserMessage; class ServerInfo_Room; class ServerInfo_User; class GameReplay; +class DeckList; class CloseButton : public QAbstractButton { Q_OBJECT @@ -52,6 +54,7 @@ private: QMap gameTabs; QList replayTabs; QMap messageTabs; + QList deckEditorTabs; int myAddTab(Tab *tab); void addCloseButtonToTab(Tab *tab, int tabIndex); public: @@ -68,9 +71,11 @@ public: const QMap &getRoomTabs() const { return roomTabs; } bool getAdminLocked() const; signals: - void setMenu(QMenu *menu); + void setMenu(const QList &newMenuList = QList()); void localGameEnded(); void adminLockChanged(bool lock); +public slots: + TabDeckEditor *addDeckEditorTab(DeckList *deckToOpen); private slots: void closeButtonPressed(); void updateCurrent(int index); @@ -86,7 +91,9 @@ private slots: void processUserLeft(const QString &userName); void processUserJoined(const ServerInfo_User &userInfo); void talkLeft(TabMessage *tab); + void deckEditorClosed(TabDeckEditor *tab); void tabUserEvent(bool globalEvent); + void updateTabText(Tab *tab, const QString &newTabText); void processRoomEvent(const RoomEvent &event); void processGameEventContainer(const GameEventContainer &cont); void processUserMessageEvent(const Event_UserMessage &event); diff --git a/cockatrice/src/window_main.cpp b/cockatrice/src/window_main.cpp index 8652ad5e..b5d40e87 100644 --- a/cockatrice/src/window_main.cpp +++ b/cockatrice/src/window_main.cpp @@ -33,7 +33,6 @@ #include "window_main.h" #include "dlg_connect.h" #include "dlg_settings.h" -#include "window_deckeditor.h" #include "tab_supervisor.h" #include "remoteclient.h" #include "localserver.h" @@ -51,13 +50,13 @@ const QString MainWindow::appName = "Cockatrice"; -void MainWindow::updateTabMenu(QMenu *menu) +void MainWindow::updateTabMenu(const QList &newMenuList) { - if (tabMenu) - menuBar()->removeAction(tabMenu->menuAction()); - tabMenu = menu; - if (menu) - menuBar()->insertMenu(helpMenu->menuAction(), menu); + for (int i = 0; i < tabMenus.size(); ++i) + menuBar()->removeAction(tabMenus[i]->menuAction()); + tabMenus = newMenuList; + for (int i = 0; i < tabMenus.size(); ++i) + menuBar()->insertMenu(tabMenus[i]->menuAction(), tabMenus[i]); } void MainWindow::processConnectionClosedEvent(const Event_ConnectionClosed &event) @@ -191,8 +190,7 @@ void MainWindow::localGameEnded() void MainWindow::actDeckEditor() { - WndDeckEditor *deckEditor = new WndDeckEditor(this); - deckEditor->show(); + tabSupervisor->addDeckEditorTab(0); } void MainWindow::actFullScreen(bool checked) @@ -357,7 +355,7 @@ void MainWindow::createMenus() } MainWindow::MainWindow(QWidget *parent) - : QMainWindow(parent), tabMenu(0), localServer(0) + : QMainWindow(parent), localServer(0) { QPixmapCache::setCacheLimit(200000); @@ -375,15 +373,16 @@ MainWindow::MainWindow(QWidget *parent) client->moveToThread(clientThread); clientThread->start(); - tabSupervisor = new TabSupervisor(client); - connect(tabSupervisor, SIGNAL(setMenu(QMenu *)), this, SLOT(updateTabMenu(QMenu *))); - connect(tabSupervisor, SIGNAL(localGameEnded()), this, SLOT(localGameEnded())); - - setCentralWidget(tabSupervisor); - createActions(); createMenus(); + tabSupervisor = new TabSupervisor(client); + connect(tabSupervisor, SIGNAL(setMenu(QList)), this, SLOT(updateTabMenu(QList))); + connect(tabSupervisor, SIGNAL(localGameEnded()), this, SLOT(localGameEnded())); + tabSupervisor->addDeckEditorTab(0); + + setCentralWidget(tabSupervisor); + retranslateUi(); resize(900, 700); diff --git a/cockatrice/src/window_main.h b/cockatrice/src/window_main.h index d6dd99a6..e8b42a6a 100644 --- a/cockatrice/src/window_main.h +++ b/cockatrice/src/window_main.h @@ -34,7 +34,7 @@ class QThread; class MainWindow : public QMainWindow { Q_OBJECT private slots: - void updateTabMenu(QMenu *menu); + void updateTabMenu(const QList &newMenuList); void statusChanged(ClientStatus _status); void processConnectionClosedEvent(const Event_ConnectionClosed &event); void processServerShutdownEvent(const Event_ServerShutdown &event); @@ -61,7 +61,8 @@ private: void retranslateUi(); void createActions(); void createMenus(); - QMenu *cockatriceMenu, *tabMenu, *helpMenu; + QList tabMenus; + QMenu *cockatriceMenu, *helpMenu; QAction *aConnect, *aDisconnect, *aSinglePlayer, *aWatchReplay, *aDeckEditor, *aFullScreen, *aSettings, *aExit, *aAbout; TabSupervisor *tabSupervisor;