From e9e75961f480d00bd48a70f0ce9d7aff35462dea Mon Sep 17 00:00:00 2001 From: marco Date: Wed, 5 Aug 2015 00:03:57 +0200 Subject: [PATCH] Redesigning deck editor to work with docks Moved setting files & Added code for a future portable build --- cockatrice/src/cardframe.cpp | 27 +- cockatrice/src/cardframe.h | 5 +- cockatrice/src/cardinfopicture.cpp | 4 +- cockatrice/src/cardinfopicture.h | 2 +- cockatrice/src/filterbuilder.cpp | 5 + cockatrice/src/main.cpp | 4 +- cockatrice/src/settingscache.cpp | 81 ++++++ cockatrice/src/settingscache.h | 16 ++ cockatrice/src/tab_deck_editor.cpp | 430 ++++++++++++++++++++++------- cockatrice/src/tab_deck_editor.h | 30 +- cockatrice/src/tab_game.cpp | 4 +- 11 files changed, 485 insertions(+), 123 deletions(-) diff --git a/cockatrice/src/cardframe.cpp b/cockatrice/src/cardframe.cpp index b5b4157e..d91a8ecf 100644 --- a/cockatrice/src/cardframe.cpp +++ b/cockatrice/src/cardframe.cpp @@ -7,39 +7,52 @@ #include "cardinfotext.h" #include "settingscache.h" +#include #include -CardFrame::CardFrame(int width, int height, const QString &cardName, QWidget *parent) +CardFrame::CardFrame(const QString &cardName, QWidget *parent) : QTabWidget(parent), info(0), cardTextOnly(false) { - setFixedWidth(width); - setMinimumHeight(height); - setContentsMargins(3, 3, 3, 3); - pic = new CardInfoPicture(width - 6); + pic = new CardInfoPicture(); + pic->setObjectName("pic"); text = new CardInfoText(); + text->setObjectName("text"); tab1 = new QWidget(this); tab2 = new QWidget(this); tab3 = new QWidget(this); + + tab1->setObjectName("tab1"); + tab2->setObjectName("tab2"); + tab3->setObjectName("tab3"); + insertTab(ImageOnlyView, tab1, QString()); insertTab(TextOnlyView, tab2, QString()); insertTab(ImageAndTextView, tab3, QString()); connect(this, SIGNAL(currentChanged(int)), this, SLOT(setViewMode(int))); tab1Layout = new QVBoxLayout(); + tab1Layout->setObjectName("tab1Layout"); tab1Layout->setContentsMargins(0, 0, 0, 0); tab1Layout->setSpacing(0); tab1->setLayout(tab1Layout); tab2Layout = new QVBoxLayout(); + tab2Layout->setObjectName("tab2Layout"); tab2Layout->setContentsMargins(0, 0, 0, 0); tab2Layout->setSpacing(0); tab2->setLayout(tab2Layout); + splitter = new QSplitter(); + splitter->setObjectName("splitter"); + splitter->setOrientation(Qt::Vertical); + tab3Layout = new QVBoxLayout(); + tab3Layout->setObjectName("tab3Layout"); tab3Layout->setContentsMargins(0, 0, 0, 0); tab3Layout->setSpacing(0); + tab3Layout->addWidget(splitter); tab3->setLayout(tab3Layout); setViewMode(settingsCache->getCardInfoViewMode()); @@ -67,8 +80,8 @@ void CardFrame::setViewMode(int mode) tab2Layout->addWidget(text); break; case ImageAndTextView: - tab3Layout->addWidget(pic); - tab3Layout->addWidget(text); + splitter->addWidget(pic); + splitter->addWidget(text); break; } diff --git a/cockatrice/src/cardframe.h b/cockatrice/src/cardframe.h index 3f00ad99..cbd776c0 100644 --- a/cockatrice/src/cardframe.h +++ b/cockatrice/src/cardframe.h @@ -8,6 +8,7 @@ class CardInfo; class CardInfoPicture; class CardInfoText; class QVBoxLayout; +class QSplitter; class CardFrame : public QTabWidget { Q_OBJECT @@ -19,11 +20,11 @@ private: bool cardTextOnly; QWidget *tab1, *tab2, *tab3; QVBoxLayout *tab1Layout, *tab2Layout, *tab3Layout; - + QSplitter *splitter; public: enum ViewMode { ImageOnlyView, TextOnlyView, ImageAndTextView }; - CardFrame(int width, int height, const QString &cardName = QString(), + CardFrame(const QString &cardName = QString(), QWidget *parent = 0); void retranslateUi(); public slots: diff --git a/cockatrice/src/cardinfopicture.cpp b/cockatrice/src/cardinfopicture.cpp index 67c5fa18..9bce273e 100644 --- a/cockatrice/src/cardinfopicture.cpp +++ b/cockatrice/src/cardinfopicture.cpp @@ -8,14 +8,12 @@ #include "carddatabase.h" #include "main.h" -CardInfoPicture::CardInfoPicture(int width, QWidget *parent) +CardInfoPicture::CardInfoPicture(QWidget *parent) : QWidget(parent), info(0), pixmapDirty(true) { - setFixedWidth(width); setMinimumHeight(100); - setMaximumHeight(width / (qreal) CARD_WIDTH * (qreal) CARD_HEIGHT); } void CardInfoPicture::setCard(CardInfo *card) diff --git a/cockatrice/src/cardinfopicture.h b/cockatrice/src/cardinfopicture.h index fbc2a8ef..50cf3e84 100644 --- a/cockatrice/src/cardinfopicture.h +++ b/cockatrice/src/cardinfopicture.h @@ -15,7 +15,7 @@ private: bool pixmapDirty; public: - CardInfoPicture(int width, QWidget *parent = 0); + CardInfoPicture(QWidget *parent = 0); protected: void resizeEvent(QResizeEvent *event); void paintEvent(QPaintEvent *); diff --git a/cockatrice/src/filterbuilder.cpp b/cockatrice/src/filterbuilder.cpp index 9c0bac50..b6e33ff6 100644 --- a/cockatrice/src/filterbuilder.cpp +++ b/cockatrice/src/filterbuilder.cpp @@ -11,6 +11,7 @@ FilterBuilder::FilterBuilder(QWidget *parent) : QWidget(parent) { filterCombo = new QComboBox; + filterCombo->setObjectName("filterCombo"); for (int i = 0; i < CardFilter::AttrEnd; i++) filterCombo->addItem( tr(CardFilter::attrName(static_cast(i))), @@ -18,6 +19,7 @@ FilterBuilder::FilterBuilder(QWidget *parent) ); typeCombo = new QComboBox; + typeCombo->setObjectName("typeCombo"); for (int i = 0; i < CardFilter::TypeEnd; i++) typeCombo->addItem( tr(CardFilter::typeName(static_cast(i))), @@ -25,12 +27,15 @@ FilterBuilder::FilterBuilder(QWidget *parent) ); QPushButton *ok = new QPushButton(QIcon(":/resources/increment.svg"), QString()); + ok->setObjectName("ok"); ok->setMaximumSize(20, 20); edit = new QLineEdit; + edit->setObjectName("edit"); edit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); QGridLayout *layout = new QGridLayout; + layout->setObjectName("layout"); layout->setContentsMargins(0, 0, 0, 0); layout->addWidget(typeCombo, 0, 0, 1, 2); diff --git a/cockatrice/src/main.cpp b/cockatrice/src/main.cpp index fdea2897..b73091a8 100644 --- a/cockatrice/src/main.cpp +++ b/cockatrice/src/main.cpp @@ -223,8 +223,8 @@ int main(int argc, char *argv[]) generateClientID(); //generate the users client id qDebug() << "ClientID In Cache: " << settingsCache->getClientID(); - ui.show(); - qDebug("main(): ui.show() finished"); + ui.showMaximized(); + qDebug("main(): ui.showMaximized() finished"); app.exec(); } diff --git a/cockatrice/src/settingscache.cpp b/cockatrice/src/settingscache.cpp index 739a678b..b46746a5 100644 --- a/cockatrice/src/settingscache.cpp +++ b/cockatrice/src/settingscache.cpp @@ -1,5 +1,26 @@ #include "settingscache.h" #include +#if QT_VERSION >= 0x050000 + #include +#else + #include +#endif + +QString SettingsCache::getLayoutsSettingsPath() +{ + QString file = ""; + +#ifndef PORTABLE_BUILD + #if QT_VERSION >= 0x050000 + file = QStandardPaths::writableLocation(QStandardPaths::DataLocation); + #else + file = QDesktopServices::storageLocation(QDesktopServices::DataLocation); + #endif + file.append("/settings/layouts/"); +#endif + + return file; +} SettingsCache::SettingsCache() { @@ -97,6 +118,16 @@ SettingsCache::SettingsCache() spectatorsCanSeeEverything = settings->value("game/spectatorscanseeeverything", false).toBool(); clientID = settings->value("personal/clientid", "notset").toString(); + QString file = getLayoutsSettingsPath(); + file.append("deckLayout.ini"); + + QSettings layout_settings(file , QSettings::IniFormat); + deckEditorLayoutState = layout_settings.value("layouts/deckEditor_state").toByteArray(); + deckEditorGeometry = layout_settings.value("layouts/deckEditor_geometry").toByteArray(); + + deckEditorCardSize = layout_settings.value("layouts/deckEditor_CardSize", QSize(250,500)).toSize(); + deckEditorFilterSize = layout_settings.value("layouts/deckEditor_FilterSize", QSize(250,250)).toSize(); + deckEditorDeckSize = layout_settings.value("layouts/deckEditor_DeckSize", QSize(250,360)).toSize(); } void SettingsCache::setCardInfoViewMode(const int _viewMode) { @@ -462,6 +493,56 @@ QStringList SettingsCache::getCountries() const return countries; } +void SettingsCache::setDeckEditorLayoutState(const QByteArray &value) +{ + deckEditorLayoutState = value; + + QString file = getLayoutsSettingsPath(); + file.append("deckLayout.ini"); + QSettings layout_settings(file , QSettings::IniFormat); + layout_settings.setValue("layouts/deckEditor_state",value); +} + +void SettingsCache::setDeckEditorGeometry(const QByteArray &value) +{ + deckEditorGeometry = value; + + QString file = getLayoutsSettingsPath(); + file.append("deckLayout.ini"); + QSettings layout_settings(file , QSettings::IniFormat); + layout_settings.setValue("layouts/deckEditor_geometry",value); +} + +void SettingsCache::setDeckEditorCardSize(const QSize &value) +{ + deckEditorCardSize = value; + + QString file = getLayoutsSettingsPath(); + file.append("deckLayout.ini"); + QSettings layout_settings(file , QSettings::IniFormat); + layout_settings.setValue("layouts/deckEditor_CardSize",value); +} + +void SettingsCache::setDeckEditorDeckSize(const QSize &value) +{ + deckEditorDeckSize = value; + + QString file = getLayoutsSettingsPath(); + file.append("deckLayout.ini"); + QSettings layout_settings(file , QSettings::IniFormat); + layout_settings.setValue("layouts/deckEditor_DeckSize",value); +} + +void SettingsCache::setDeckEditorFilterSize(const QSize &value) +{ + deckEditorFilterSize = value; + + QString file = getLayoutsSettingsPath(); + file.append("deckLayout.ini"); + QSettings layout_settings(file , QSettings::IniFormat); + layout_settings.setValue("layouts/deckEditor_FilterSize",value); +} + void SettingsCache::setGameDescription(const QString _gameDescription) { gameDescription = _gameDescription; diff --git a/cockatrice/src/settingscache.h b/cockatrice/src/settingscache.h index d1473d3d..c3e5f86b 100644 --- a/cockatrice/src/settingscache.h +++ b/cockatrice/src/settingscache.h @@ -2,6 +2,7 @@ #define SETTINGSCACHE_H #include +#include #include // the falbacks are used for cards without a muid @@ -99,6 +100,10 @@ private: bool spectatorsCanTalk; bool spectatorsCanSeeEverything; int keepalive; + QByteArray deckEditorLayoutState, deckEditorGeometry; + QSize deckEditorFilterSize, deckEditorDeckSize, deckEditorCardSize; + QString getLayoutsSettingsPath(); + public: SettingsCache(); const QByteArray &getMainWindowGeometry() const { return mainWindowGeometry; } @@ -172,6 +177,17 @@ public: int getKeepAlive() const { return keepalive; } void setClientID(QString clientID); QString getClientID() { return clientID; } + QByteArray getDeckEditorLayoutState() const { return deckEditorLayoutState; } + void setDeckEditorLayoutState(const QByteArray &value); + QByteArray getDeckEditorGeometry() const { return deckEditorGeometry; } + void setDeckEditorGeometry(const QByteArray &value); + QSize getDeckEditorCardSize() const { return deckEditorCardSize; } + void setDeckEditorCardSize(const QSize &value); + QSize getDeckEditorDeckSize() const { return deckEditorDeckSize; } + void setDeckEditorDeckSize(const QSize &value); + QSize getDeckEditorFilterSize() const { return deckEditorFilterSize; } + void setDeckEditorFilterSize(const QSize &value); + public slots: void setMainWindowGeometry(const QByteArray &_mainWindowGeometry); void setLang(const QString &_lang); diff --git a/cockatrice/src/tab_deck_editor.cpp b/cockatrice/src/tab_deck_editor.cpp index 83e966fc..390acd42 100644 --- a/cockatrice/src/tab_deck_editor.cpp +++ b/cockatrice/src/tab_deck_editor.cpp @@ -19,6 +19,8 @@ #include #include #include +#include +#include #include "tab_deck_editor.h" #include "window_sets.h" #include "carddatabase.h" @@ -47,108 +49,37 @@ void SearchLineEdit::keyPressEvent(QKeyEvent *event) QLineEdit::keyPressEvent(event); } -TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent) - : Tab(_tabSupervisor, parent), modified(false) +void TabDeckEditor::createShowHideDocksButtons() { - aClearFilterAll = new QAction(QString(), this); - aClearFilterAll->setIcon(QIcon(":/resources/icon_clearsearch.svg")); - connect(aClearFilterAll, SIGNAL(triggered()), this, SLOT(actClearFilterAll())); + btnFilter = new QPushButton(QIcon("://resources/icon_view.svg"),QString()); + btnFilter->setObjectName("btnFilter"); + btnFilter->setCheckable(true); + btnFilter->setChecked(true); + btnFilter->setMaximumWidth(30); + searchLayout->addWidget(btnFilter); - aClearFilterOne = new QAction(QString(), this); - aClearFilterOne->setIcon(QIcon(":/resources/decrement.svg")); - connect(aClearFilterOne, SIGNAL(triggered()), this, SLOT(actClearFilterOne())); + btnDeck = new QPushButton(QIcon("://resources/hand.svg"),QString()); + btnDeck->setObjectName("btnDeck"); + btnDeck->setCheckable(true); + btnDeck->setChecked(true); + btnDeck->setMaximumWidth(30); + searchLayout->addWidget(btnDeck); - searchEdit = new SearchLineEdit; -#if QT_VERSION >= 0x050300 - searchEdit->addAction(QIcon(":/resources/icon_search_black.svg"), QLineEdit::LeadingPosition); -#endif - searchEdit->setObjectName("searchEdit"); - - setFocusProxy(searchEdit); - setFocusPolicy(Qt::ClickFocus); - - searchEdit->installEventFilter(&searchKeySignals); - connect(searchEdit, SIGNAL(textChanged(const QString &)), this, SLOT(updateSearch(const QString &))); - connect(&searchKeySignals, SIGNAL(onEnter()), this, SLOT(actAddCard())); - connect(&searchKeySignals, SIGNAL(onCtrlAltEqual()), this, SLOT(actAddCard())); - connect(&searchKeySignals, SIGNAL(onCtrlAltRBracket()), this, SLOT(actAddCardToSideboard())); - connect(&searchKeySignals, SIGNAL(onCtrlAltMinus()), this, SLOT(actDecrementCard())); - connect(&searchKeySignals, SIGNAL(onCtrlAltLBracket()), this, SLOT(actDecrementCardFromSideboard())); - connect(&searchKeySignals, SIGNAL(onCtrlAltEnter()), this, SLOT(actAddCardToSideboard())); - connect(&searchKeySignals, SIGNAL(onCtrlEnter()), this, SLOT(actAddCardToSideboard())); - - QToolBar *deckEditToolBar = new QToolBar; - deckEditToolBar->setOrientation(Qt::Horizontal); - deckEditToolBar->setIconSize(QSize(24, 24)); - - QHBoxLayout *searchLayout = new QHBoxLayout; - searchLayout->addWidget(deckEditToolBar); - searchLayout->addWidget(searchEdit); - - databaseModel = new CardDatabaseModel(db, this); - databaseDisplayModel = new CardDatabaseDisplayModel(this); - databaseDisplayModel->setSourceModel(databaseModel); - databaseDisplayModel->setFilterKeyColumn(0); - databaseDisplayModel->sort(0, Qt::AscendingOrder); - - databaseView = new QTreeView(); - databaseView->setFocusProxy(searchEdit); - databaseView->setModel(databaseDisplayModel); - databaseView->setUniformRowHeights(true); - databaseView->setRootIsDecorated(false); - databaseView->setAlternatingRowColors(true); - 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); - - QVBoxLayout *leftFrame = new QVBoxLayout; - leftFrame->addLayout(searchLayout); - leftFrame->addWidget(databaseView); - - cardInfo = new CardFrame(250, 372); - - filterModel = new FilterTreeModel(); - databaseDisplayModel->setFilterTree(filterModel->filterTree()); - filterView = new QTreeView; - filterView->setModel(filterModel); - filterView->setMaximumWidth(250); - filterView->setUniformRowHeights(true); - filterView->setHeaderHidden(true); - filterView->setContextMenuPolicy(Qt::CustomContextMenu); - connect(filterModel, SIGNAL(layoutChanged()), filterView, SLOT(expandAll())); - connect(filterView, SIGNAL(customContextMenuRequested(const QPoint &)), - this, SLOT(filterViewCustomContextMenu(const QPoint &))); - FilterBuilder *filterBuilder = new FilterBuilder; - connect(filterBuilder, SIGNAL(add(const CardFilter *)), filterModel, SLOT(addFilter(const CardFilter *))); - - QToolButton *filterDelOne = new QToolButton(); - filterDelOne->setDefaultAction(aClearFilterOne); - filterDelOne->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); - - QToolButton *filterDelAll = new QToolButton(); - filterDelAll->setDefaultAction(aClearFilterAll); - filterDelAll->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); - - QGridLayout *filterLayout = new QGridLayout; - filterLayout->addWidget(filterBuilder, 0, 0, 1, 2); - filterLayout->addWidget(filterView, 1, 0, 1, 2); - filterLayout->addWidget(filterDelOne, 2, 0); - filterLayout->addWidget(filterDelAll, 2, 1); - - filterBox = new QGroupBox(); - filterBox->setMaximumWidth(250); - filterBox->setLayout(filterLayout); - - QVBoxLayout *middleFrame = new QVBoxLayout; - middleFrame->addWidget(cardInfo, 1, Qt::AlignTop); - middleFrame->addWidget(filterBox, 0); + btnCard = new QPushButton(QIcon("://back.svg"),QString()); + btnCard->setObjectName("btnCard"); + btnCard->setCheckable(true); + btnCard->setChecked(true); + btnCard->setMaximumWidth(30); + searchLayout->addWidget(btnCard); +} +void TabDeckEditor::createDeckDock() +{ deckModel = new DeckListModel(this); + deckModel->setObjectName("deckModel"); connect(deckModel, SIGNAL(deckHashChanged()), this, SLOT(updateHash())); deckView = new QTreeView(); + deckView->setObjectName("deckView"); deckView->setModel(deckModel); deckView->setUniformRowHeights(true); deckView->setSortingEnabled(true); @@ -170,18 +101,26 @@ TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent) connect(&deckViewKeySignals, SIGNAL(onDelete()), this, SLOT(actRemoveCard())); nameLabel = new QLabel(); + nameLabel->setObjectName("nameLabel"); nameEdit = new QLineEdit; + nameEdit->setObjectName("nameEdit"); nameLabel->setBuddy(nameEdit); connect(nameEdit, SIGNAL(textChanged(const QString &)), this, SLOT(updateName(const QString &))); commentsLabel = new QLabel(); + commentsLabel->setObjectName("commentsLabel"); commentsEdit = new QTextEdit; + commentsEdit->setObjectName("commentsEdit"); commentsEdit->setMaximumHeight(70); commentsLabel->setBuddy(commentsEdit); connect(commentsEdit, SIGNAL(textChanged()), this, SLOT(updateComments())); + hashLabel1 = new QLabel(); + hashLabel1->setObjectName("hashLabel1"); hashLabel = new QLabel; + hashLabel->setObjectName("hashLabel"); QGridLayout *grid = new QGridLayout; + grid->setObjectName("grid"); grid->addWidget(nameLabel, 0, 0); grid->addWidget(nameEdit, 0, 1); @@ -201,26 +140,119 @@ TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent) */ QToolBar *deckToolBar = new QToolBar; + deckToolBar->setObjectName("deckToolBar"); deckToolBar->setOrientation(Qt::Vertical); deckToolBar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); deckToolBar->setIconSize(QSize(24, 24)); //deckToolBar->addAction(aUpdatePrices); QHBoxLayout *deckToolbarLayout = new QHBoxLayout; + deckToolbarLayout->setObjectName("deckToolbarLayout"); deckToolbarLayout->addStretch(); deckToolbarLayout->addWidget(deckToolBar); deckToolbarLayout->addStretch(); QVBoxLayout *rightFrame = new QVBoxLayout; + rightFrame->setObjectName("rightFrame"); rightFrame->addLayout(grid); rightFrame->addWidget(deckView, 10); rightFrame->addLayout(deckToolbarLayout); - QHBoxLayout *mainLayout = new QHBoxLayout; - mainLayout->addLayout(leftFrame, 10); - mainLayout->addLayout(middleFrame); - mainLayout->addLayout(rightFrame); - setLayout(mainLayout); + deckDock = new QDockWidget(MainWindow); + deckDock->setObjectName("deckDock"); + deckDock->setMinimumSize(QSize(200, 41)); + deckDock->setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea); + deckDock->setFeatures(QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetFloatable|QDockWidget::DockWidgetMovable); + QWidget *deckDockContents = new QWidget(); + deckDockContents->setObjectName("deckDockContents"); + deckDockContents->setLayout(rightFrame); + deckDock->setWidget(deckDockContents); + + connect(btnDeck,SIGNAL(toggled(bool)),deckDock,SLOT(setVisible(bool))); + deckDock->installEventFilter(this); +} + +void TabDeckEditor::createCardInfoDock() +{ + cardInfo = new CardFrame(); + cardInfo->setObjectName("cardInfo"); + QVBoxLayout *cardInfoFrame = new QVBoxLayout; + cardInfoFrame->setObjectName("cardInfoFrame"); + cardInfoFrame->addWidget(cardInfo); + + cardInfoDock = new QDockWidget(MainWindow); + cardInfoDock->setObjectName("cardInfoDock"); + + cardInfoDock->setMinimumSize(QSize(200, 41)); + cardInfoDock->setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea); + cardInfoDock->setFeatures(QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetFloatable|QDockWidget::DockWidgetMovable); + QWidget *cardInfoDockContents = new QWidget(); + cardInfoDockContents->setObjectName("cardInfoDockContents"); + cardInfoDockContents->setLayout(cardInfoFrame); + cardInfoDock->setWidget(cardInfoDockContents); + + connect(btnCard,SIGNAL(toggled(bool)),cardInfoDock,SLOT(setVisible(bool))); + cardInfoDock->installEventFilter(this); +} + +void TabDeckEditor::createFiltersDock() +{ + filterModel = new FilterTreeModel(); + filterModel->setObjectName("filterModel"); + databaseDisplayModel->setFilterTree(filterModel->filterTree()); + databaseDisplayModel->setObjectName("databaseDisplayModel"); + filterView = new QTreeView; + filterView->setObjectName("filterView"); + filterView->setModel(filterModel); + filterView->setUniformRowHeights(true); + filterView->setHeaderHidden(true); + filterView->setContextMenuPolicy(Qt::CustomContextMenu); + connect(filterModel, SIGNAL(layoutChanged()), filterView, SLOT(expandAll())); + connect(filterView, SIGNAL(customContextMenuRequested(const QPoint &)),this, SLOT(filterViewCustomContextMenu(const QPoint &))); + + FilterBuilder *filterBuilder = new FilterBuilder; + filterBuilder->setObjectName("filterBuilder"); + connect(filterBuilder, SIGNAL(add(const CardFilter *)), filterModel, SLOT(addFilter(const CardFilter *))); + + QToolButton *filterDelOne = new QToolButton(); + filterDelOne->setObjectName("filterDelOne"); + filterDelOne->setDefaultAction(aClearFilterOne); + filterDelOne->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); + + QToolButton *filterDelAll = new QToolButton(); + filterDelAll->setObjectName("filterDelAll"); + filterDelAll->setDefaultAction(aClearFilterAll); + filterDelAll->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); + + QGridLayout *filterLayout = new QGridLayout; + filterLayout->setObjectName("filterLayout"); + filterLayout->setContentsMargins(0,0,0,0); + filterLayout->addWidget(filterBuilder, 0, 0, 1, 2); + filterLayout->addWidget(filterView, 1, 0, 1, 2); + + filterBox = new QWidget(); + filterBox->setObjectName("filterBox"); + filterBox->setLayout(filterLayout); + + QVBoxLayout *filterFrame = new QVBoxLayout; + filterFrame->setObjectName("filterFrame"); + filterFrame->addWidget(filterBox); + + filterDock = new QDockWidget(MainWindow); + filterDock->setObjectName("filterDock"); + + filterDock->setFeatures(QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetFloatable|QDockWidget::DockWidgetMovable); + QWidget *filterDockContents = new QWidget(MainWindow); + filterDockContents->setObjectName("filterDockContents"); + filterDockContents->setLayout(filterFrame); + filterDock->setWidget(filterDockContents); + + connect(btnFilter,SIGNAL(toggled(bool)),filterDock,SLOT(setVisible(bool))); + filterDock->installEventFilter(this); +} + +void TabDeckEditor::createMenus() +{ aNewDeck = new QAction(QString(), this); aNewDeck->setShortcuts(QKeySequence::New); connect(aNewDeck, SIGNAL(triggered()), this, SLOT(actNewDeck())); @@ -231,7 +263,7 @@ TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent) aSaveDeck->setShortcuts(QKeySequence::Save); connect(aSaveDeck, SIGNAL(triggered()), this, SLOT(actSaveDeck())); aSaveDeckAs = new QAction(QString(), this); -// aSaveDeckAs->setShortcuts(QKeySequence::SaveAs); +// aSaveDeckAs->setShortcuts(QKeySequence::SaveAs); connect(aSaveDeckAs, SIGNAL(triggered()), this, SLOT(actSaveDeckAs())); aLoadDeckFromClipboard = new QAction(QString(), this); connect(aLoadDeckFromClipboard, SIGNAL(triggered()), this, SLOT(actLoadDeckFromClipboard())); @@ -254,6 +286,9 @@ TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent) aEditTokens = new QAction(QString(), this); connect(aEditTokens, SIGNAL(triggered()), this, SLOT(actEditTokens())); + aResetLayout = new QAction(QString(), this); + connect(aResetLayout,SIGNAL(triggered()),this,SLOT(restartLayout())); + deckMenu = new QMenu(this); deckMenu->addAction(aNewDeck); deckMenu->addAction(aLoadDeck); @@ -267,19 +302,74 @@ TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent) deckMenu->addSeparator(); deckMenu->addAction(aAnalyzeDeck); deckMenu->addSeparator(); + deckMenu->addAction(aResetLayout); + deckMenu->addSeparator(); deckMenu->addAction(aClose); addTabMenu(deckMenu); + aClearFilterAll = new QAction(QString(), this); + aClearFilterAll->setIcon(QIcon(":/resources/icon_clearsearch.svg")); + connect(aClearFilterAll, SIGNAL(triggered()), this, SLOT(actClearFilterAll())); + + aClearFilterOne = new QAction(QString(), this); + aClearFilterOne->setIcon(QIcon(":/resources/decrement.svg")); + connect(aClearFilterOne, SIGNAL(triggered()), this, SLOT(actClearFilterOne())); + dbMenu = new QMenu(this); dbMenu->addAction(aEditSets); dbMenu->addAction(aEditTokens); dbMenu->addSeparator(); + dbMenu->addAction(aClearFilterOne); dbMenu->addAction(aClearFilterAll); #if defined(Q_OS_WIN) || defined(Q_OS_MAC) dbMenu->addSeparator(); dbMenu->addAction(aOpenCustomFolder); #endif addTabMenu(dbMenu); +} + +void TabDeckEditor::createCentralFrame() +{ + searchEdit = new SearchLineEdit; + searchEdit->setObjectName("searchEdit"); +#if QT_VERSION >= 0x050300 + searchEdit->addAction(QIcon(":/resources/icon_search_black.svg"), QLineEdit::LeadingPosition); +#endif + + setFocusProxy(searchEdit); + setFocusPolicy(Qt::ClickFocus); + + searchEdit->installEventFilter(&searchKeySignals); + searchKeySignals.setObjectName("searchKeySignals"); + connect(searchEdit, SIGNAL(textChanged(const QString &)), this, SLOT(updateSearch(const QString &))); + connect(&searchKeySignals, SIGNAL(onEnter()), this, SLOT(actAddCard())); + connect(&searchKeySignals, SIGNAL(onCtrlAltEqual()), this, SLOT(actAddCard())); + connect(&searchKeySignals, SIGNAL(onCtrlAltRBracket()), this, SLOT(actAddCardToSideboard())); + connect(&searchKeySignals, SIGNAL(onCtrlAltMinus()), this, SLOT(actDecrementCard())); + connect(&searchKeySignals, SIGNAL(onCtrlAltLBracket()), this, SLOT(actDecrementCardFromSideboard())); + connect(&searchKeySignals, SIGNAL(onCtrlAltEnter()), this, SLOT(actAddCardToSideboard())); + connect(&searchKeySignals, SIGNAL(onCtrlEnter()), this, SLOT(actAddCardToSideboard())); + + databaseModel = new CardDatabaseModel(db, this); + databaseModel->setObjectName("databaseModel"); + databaseDisplayModel = new CardDatabaseDisplayModel(this); + databaseDisplayModel->setSourceModel(databaseModel); + databaseDisplayModel->setFilterKeyColumn(0); + databaseDisplayModel->sort(0, Qt::AscendingOrder); + + databaseView = new QTreeView(); + databaseView->setObjectName("databaseView"); + databaseView->setFocusProxy(searchEdit); + databaseView->setModel(databaseDisplayModel); + databaseView->setUniformRowHeights(true); + databaseView->setRootIsDecorated(false); + databaseView->setAlternatingRowColors(true); + 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); aAddCard = new QAction(QString(), this); aAddCard->setIcon(QIcon(":/resources/arrow_right_green.svg")); @@ -297,6 +387,11 @@ TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent) aDecrement->setIcon(QIcon(":/resources/decrement.svg")); connect(aDecrement, SIGNAL(triggered()), this, SLOT(actDecrement())); + QToolBar *deckEditToolBar = new QToolBar; + deckEditToolBar->setObjectName("deckEditToolBar"); + deckEditToolBar->setOrientation(Qt::Horizontal); + deckEditToolBar->setIconSize(QSize(24, 24)); + deckEditToolBar->addAction(aAddCard); deckEditToolBar->addAction(aAddCardToSideboard); deckEditToolBar->addAction(aRemoveCard); @@ -304,11 +399,108 @@ TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent) deckEditToolBar->addAction(aIncrement); deckEditToolBar->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); - retranslateUi(); - - resize(950, 700); + searchLayout = new QHBoxLayout; + searchLayout->setObjectName("searchLayout"); + searchLayout->addWidget(deckEditToolBar); + searchLayout->addWidget(searchEdit); + createShowHideDocksButtons(); + centralFrame = new QVBoxLayout; + centralFrame->setObjectName("centralFrame"); + centralFrame->addLayout(searchLayout); + centralFrame->addWidget(databaseView); + + centralWidget = new QWidget(MainWindow); + centralWidget->setObjectName("centralWidget"); + centralWidget->setLayout(centralFrame); + MainWindow->setCentralWidget(centralWidget); + MainWindow->setDockOptions(QMainWindow::AnimatedDocks|QMainWindow::AllowNestedDocks|QMainWindow::AllowTabbedDocks); + + QHBoxLayout *mainLayout = new QHBoxLayout; + mainLayout->setObjectName("mainLayout"); + mainLayout->addWidget(MainWindow); + setLayout(mainLayout); +} + +void TabDeckEditor::restartLayout() +{ + btnDeck->setChecked(true); + btnFilter->setChecked(true); + btnCard->setChecked(true); + + deckDock->setFloating(false); + cardInfoDock->setFloating(false); + filterDock->setFloating(false); + + MainWindow->addDockWidget(static_cast(2), deckDock); + MainWindow->addDockWidget(static_cast(2), cardInfoDock); + MainWindow->addDockWidget(static_cast(2), filterDock); + + MainWindow->splitDockWidget(cardInfoDock, deckDock, Qt::Horizontal); + MainWindow->splitDockWidget(cardInfoDock, filterDock, Qt::Vertical); + + deckDock->setMinimumWidth(360); + deckDock->setMaximumWidth(360); + + cardInfoDock->setMinimumSize(250, 360); + cardInfoDock->setMaximumSize(250, 360); + QTimer::singleShot(100, this, SLOT(freeDocksSize())); +} + +void TabDeckEditor::freeDocksSize() +{ + deckDock->setMinimumSize(100, 100); + deckDock->setMaximumSize(5000, 5000); + + cardInfoDock->setMinimumSize(100, 100); + cardInfoDock->setMaximumSize(5000, 5000); + + filterDock->setMinimumSize(100,100); + filterDock->setMaximumSize(5000,5000); +} + +void TabDeckEditor::loadLayout() +{ + MainWindow->restoreState(settingsCache->getDeckEditorLayoutState()); + MainWindow->restoreGeometry(settingsCache->getDeckEditorGeometry()); + + btnCard->setChecked(!cardInfoDock->isHidden()); + btnFilter->setChecked(!filterDock->isHidden()); + btnDeck->setChecked(!deckDock->isHidden()); + + cardInfoDock->setMinimumSize(settingsCache->getDeckEditorCardSize()); + cardInfoDock->setMaximumSize(settingsCache->getDeckEditorCardSize()); + + filterDock->setMinimumSize(settingsCache->getDeckEditorFilterSize()); + filterDock->setMaximumSize(settingsCache->getDeckEditorFilterSize()); + + deckDock->setMinimumSize(settingsCache->getDeckEditorDeckSize()); + deckDock->setMaximumSize(settingsCache->getDeckEditorDeckSize()); + + QTimer::singleShot(100, this, SLOT(freeDocksSize())); +} + +TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent) + : Tab(_tabSupervisor, parent), modified(false) +{ + MainWindow = new QMainWindow; + MainWindow->setObjectName("MainWindow"); + + createMenus(); + + createCentralFrame(); + + createDeckDock(); + createCardInfoDock(); + createFiltersDock(); + + restartLayout(); + + this->installEventFilter(this); + + retranslateUi(); QTimer::singleShot(0, this, SLOT(checkFirstRunDetected())); + QTimer::singleShot(0, this, SLOT(loadLayout())); } TabDeckEditor::~TabDeckEditor() @@ -320,7 +512,6 @@ void TabDeckEditor::retranslateUi() { cardInfo->retranslateUi(); - filterBox->setTitle(tr("Filters")); aClearFilterAll->setText(tr("&Clear all filters")); aClearFilterOne->setText(tr("Delete selected")); aClearFilterOne->setShortcut(QKeySequence("Backspace")); @@ -359,6 +550,14 @@ void TabDeckEditor::retranslateUi() aEditSets->setText(tr("&Edit sets...")); aEditTokens->setText(tr("Edit &tokens...")); + + btnCard->setToolTip(tr("Show/Hide card information")); + btnDeck->setToolTip(tr("Show/Hide deck")); + btnFilter->setToolTip(tr("Show/Hide filters")); + aResetLayout->setText(tr("Reset layout")); + cardInfoDock->setWindowTitle(tr("Card Info")); + deckDock->setWindowTitle(tr("Deck")); + filterDock->setWindowTitle(tr("Filters")); } QString TabDeckEditor::getTabText() const @@ -737,6 +936,27 @@ void TabDeckEditor::setPriceTagFeatureEnabled(int /* enabled */) deckModel->pricesUpdated(); } +bool TabDeckEditor::eventFilter(QObject * o, QEvent * e) +{ + if(e->type() == QEvent::Close) + { + if(o == cardInfoDock) + btnCard->setChecked(false); + else if(o == deckDock) + btnDeck->setChecked(false); + else if(o == filterDock) + btnFilter->setChecked(false); + } + if( o == this && e->type() == QEvent::Hide){ + settingsCache->setDeckEditorLayoutState(MainWindow->saveState()); + settingsCache->setDeckEditorGeometry(MainWindow->saveGeometry()); + settingsCache->setDeckEditorCardSize(cardInfoDock->size()); + settingsCache->setDeckEditorFilterSize(filterDock->size()); + settingsCache->setDeckEditorDeckSize(deckDock->size()); + } + return false; +} + /* void TabDeckEditor::actUpdatePrices() diff --git a/cockatrice/src/tab_deck_editor.h b/cockatrice/src/tab_deck_editor.h index 5f91d4c3..1398bff8 100644 --- a/cockatrice/src/tab_deck_editor.h +++ b/cockatrice/src/tab_deck_editor.h @@ -20,6 +20,10 @@ class FilterTreeModel; class FilterBuilder; class CardInfo; class QGroupBox; +class QHBoxLayout; +class QPushButton; +class QMainWindow; +class QDockWidget; class SearchLineEdit : public QLineEdit { private: @@ -73,6 +77,12 @@ class TabDeckEditor : public Tab { void filterViewCustomContextMenu(const QPoint &point); void filterRemove(QAction *action); void setPriceTagFeatureEnabled(int enabled); + + bool eventFilter(QObject *o, QEvent *e); + void loadLayout(); + void restartLayout(); + void freeDocksSize(); + private: CardInfo *currentCardInfo() const; void addCardHelper(QString zoneName); @@ -99,14 +109,25 @@ private: QLabel *hashLabel; FilterTreeModel *filterModel; QTreeView *filterView; - QGroupBox *filterBox; + QWidget *filterBox; QMenu *deckMenu, *dbMenu; QAction *aNewDeck, *aLoadDeck, *aSaveDeck, *aSaveDeckAs, *aLoadDeckFromClipboard, *aSaveDeckToClipboard, *aPrintDeck, *aAnalyzeDeck, *aClose, *aOpenCustomFolder; QAction *aEditSets, *aEditTokens, *aClearFilterAll, *aClearFilterOne; QAction *aAddCard, *aAddCardToSideboard, *aRemoveCard, *aIncrement, *aDecrement;// *aUpdatePrices; + QAction *aResetLayout; bool modified; + QMainWindow *MainWindow; + QVBoxLayout *centralFrame; + QHBoxLayout *searchLayout; + QPushButton *btnFilter; + QPushButton *btnDeck; + QPushButton *btnCard; + QDockWidget *cardInfoDock; + QDockWidget *deckDock; + QDockWidget *filterDock; + QWidget *centralWidget; public: TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent = 0); ~TabDeckEditor(); @@ -115,6 +136,13 @@ public: void setDeck(DeckLoader *_deckLoader); void setModified(bool _windowModified); bool confirmClose(); + void createShowHideDocksButtons(); + void createDeckDock(); + void createCardInfoDock(); + void createFiltersDock(); + void createMenus(); + void createCentralFrame(); + public slots: void closeRequest(); void checkFirstRunDetected(); diff --git a/cockatrice/src/tab_game.cpp b/cockatrice/src/tab_game.cpp index ef51d82a..a99f8517 100644 --- a/cockatrice/src/tab_game.cpp +++ b/cockatrice/src/tab_game.cpp @@ -282,7 +282,7 @@ TabGame::TabGame(TabSupervisor *_tabSupervisor, GameReplay *_replay) gameView = new GameView(scene); gameView->hide(); - cardInfo = new CardFrame(250, 372); + cardInfo = new CardFrame(); playerListWidget = new PlayerListWidget(0, 0, this); playerListWidget->setFocusPolicy(Qt::NoFocus); @@ -396,7 +396,7 @@ TabGame::TabGame(TabSupervisor *_tabSupervisor, QList &_client gameView = new GameView(scene); gameView->hide(); - cardInfo = new CardFrame(250, 372); + cardInfo = new CardFrame(); playerListWidget = new PlayerListWidget(tabSupervisor, clients.first(), this); playerListWidget->setFocusPolicy(Qt::NoFocus); connect(playerListWidget, SIGNAL(openMessageDialog(QString, bool)), this, SIGNAL(openMessageDialog(QString, bool)));