diff --git a/cockatrice/src/interface/widgets/deck_editor/deck_editor_deck_dock_widget.cpp b/cockatrice/src/interface/widgets/deck_editor/deck_editor_deck_dock_widget.cpp index 075b73216..7e4287ac5 100644 --- a/cockatrice/src/interface/widgets/deck_editor/deck_editor_deck_dock_widget.cpp +++ b/cockatrice/src/interface/widgets/deck_editor/deck_editor_deck_dock_widget.cpp @@ -154,8 +154,10 @@ void DeckEditorDeckDockWidget::createDeckDock() &DeckEditorDeckDockWidget::setBannerCard); bannerCardComboBox->setHidden(!SettingsCache::instance().getDeckEditorBannerCardComboBoxVisible()); - deckTagsDisplayWidget = new DeckPreviewDeckTagsDisplayWidget(this, deckModel->getDeckList()); + deckTagsDisplayWidget = new DeckPreviewDeckTagsDisplayWidget(this, deckModel->getDeckList()->getTags()); deckTagsDisplayWidget->setHidden(!SettingsCache::instance().getDeckEditorTagsWidgetVisible()); + connect(deckTagsDisplayWidget, &DeckPreviewDeckTagsDisplayWidget::tagsChanged, this, + &DeckEditorDeckDockWidget::setTags); activeGroupCriteriaLabel = new QLabel(this); @@ -383,6 +385,13 @@ void DeckEditorDeckDockWidget::setBannerCard(int /* changedIndex */) emit deckModified(); } +void DeckEditorDeckDockWidget::setTags(const QStringList &tags) +{ + deckModel->getDeckList()->setTags(tags); + deckEditor->setModified(true); + emit deckModified(); +} + void DeckEditorDeckDockWidget::syncDeckListBannerCardWithComboBox() { auto [name, id] = bannerCardComboBox->currentData().value>(); @@ -451,7 +460,7 @@ void DeckEditorDeckDockWidget::syncDisplayWidgetsToModel() sortDeckModelToDeckView(); expandAll(); - deckTagsDisplayWidget->setDeckList(deckModel->getDeckList()); + deckTagsDisplayWidget->setTags(deckModel->getDeckList()->getTags()); } void DeckEditorDeckDockWidget::sortDeckModelToDeckView() @@ -484,7 +493,7 @@ void DeckEditorDeckDockWidget::cleanDeck() emit deckModified(); emit deckChanged(); updateBannerCardComboBox(); - deckTagsDisplayWidget->setDeckList(deckModel->getDeckList()); + deckTagsDisplayWidget->setTags(deckModel->getDeckList()->getTags()); } void DeckEditorDeckDockWidget::recursiveExpand(const QModelIndex &index) diff --git a/cockatrice/src/interface/widgets/deck_editor/deck_editor_deck_dock_widget.h b/cockatrice/src/interface/widgets/deck_editor/deck_editor_deck_dock_widget.h index 37891072d..d1f1da300 100644 --- a/cockatrice/src/interface/widgets/deck_editor/deck_editor_deck_dock_widget.h +++ b/cockatrice/src/interface/widgets/deck_editor/deck_editor_deck_dock_widget.h @@ -112,6 +112,7 @@ private slots: void updateName(const QString &name); void updateComments(); void setBannerCard(int); + void setTags(const QStringList &tags); void syncDeckListBannerCardWithComboBox(); void updateHash(); void refreshShortcuts(); diff --git a/cockatrice/src/interface/widgets/visual_deck_storage/deck_preview/deck_preview_deck_tags_display_widget.cpp b/cockatrice/src/interface/widgets/visual_deck_storage/deck_preview/deck_preview_deck_tags_display_widget.cpp index 28b786951..fce0916bb 100644 --- a/cockatrice/src/interface/widgets/visual_deck_storage/deck_preview/deck_preview_deck_tags_display_widget.cpp +++ b/cockatrice/src/interface/widgets/visual_deck_storage/deck_preview/deck_preview_deck_tags_display_widget.cpp @@ -13,8 +13,8 @@ #include #include -DeckPreviewDeckTagsDisplayWidget::DeckPreviewDeckTagsDisplayWidget(QWidget *_parent, DeckList *_deckList) - : QWidget(_parent), deckList(nullptr) +DeckPreviewDeckTagsDisplayWidget::DeckPreviewDeckTagsDisplayWidget(QWidget *_parent, const QStringList &_tags) + : QWidget(_parent), currentTags(_tags) { setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); @@ -27,16 +27,14 @@ DeckPreviewDeckTagsDisplayWidget::DeckPreviewDeckTagsDisplayWidget(QWidget *_par flowWidget = new FlowWidget(this, Qt::Horizontal, Qt::ScrollBarAlwaysOff, Qt::ScrollBarAsNeeded); - if (_deckList) { - setDeckList(_deckList); - } - layout->addWidget(flowWidget); + + refreshTags(); } -void DeckPreviewDeckTagsDisplayWidget::setDeckList(DeckList *_deckList) +void DeckPreviewDeckTagsDisplayWidget::setTags(const QStringList &_tags) { - deckList = _deckList; + currentTags = _tags; refreshTags(); } @@ -44,7 +42,7 @@ void DeckPreviewDeckTagsDisplayWidget::refreshTags() { flowWidget->clearLayout(); - for (const QString &tag : deckList->getTags()) { + for (const QString &tag : currentTags) { flowWidget->addWidget(new DeckPreviewTagDisplayWidget(this, tag)); } @@ -93,46 +91,19 @@ static QStringList findAllKnownTags() void DeckPreviewDeckTagsDisplayWidget::openTagEditDlg() { if (qobject_cast(parentWidget())) { + // If we're the child of a DeckPreviewWidget, then we need to handle conversion auto *deckPreviewWidget = qobject_cast(parentWidget()); bool canAddTags = promptFileConversionIfRequired(deckPreviewWidget); if (canAddTags) { QStringList knownTags = deckPreviewWidget->visualDeckStorageWidget->tagFilterWidget->getAllKnownTags(); - QStringList activeTags = deckList->getTags(); - - DeckPreviewTagDialog dialog(knownTags, activeTags); - if (dialog.exec() == QDialog::Accepted) { - QStringList updatedTags = dialog.getActiveTags(); - deckList->setTags(updatedTags); - deckPreviewWidget->deckLoader->saveToFile(deckPreviewWidget->filePath, DeckLoader::CockatriceFormat); - refreshTags(); - } - } - } else if (parentWidget()) { - // If we're the child of an AbstractTabDeckEditor, we are buried under a ton of childWidgets in the - // DeckInfoDock. - QWidget *currentParent = parentWidget(); - while (currentParent) { - if (qobject_cast(currentParent)) { - break; - } - currentParent = currentParent->parentWidget(); - } - if (qobject_cast(currentParent)) { - auto *deckEditor = qobject_cast(currentParent); - - QStringList knownTags = findAllKnownTags(); - QStringList activeTags = deckList->getTags(); - - DeckPreviewTagDialog dialog(knownTags, activeTags); - if (dialog.exec() == QDialog::Accepted) { - QStringList updatedTags = dialog.getActiveTags(); - deckList->setTags(updatedTags); - deckEditor->setModified(true); - refreshTags(); - } + execTagDialog(knownTags); } + } else { + // If we're the child of an AbstractTabDeckEditor, then we don't bother with conversion + QStringList knownTags = findAllKnownTags(); + execTagDialog(knownTags); } } @@ -205,4 +176,16 @@ bool DeckPreviewDeckTagsDisplayWidget::promptFileConversionIfRequired(DeckPrevie } return true; +} + +void DeckPreviewDeckTagsDisplayWidget::execTagDialog(const QStringList &knownTags) +{ + DeckPreviewTagDialog dialog(knownTags, currentTags); + if (dialog.exec() == QDialog::Accepted) { + QStringList updatedTags = dialog.getActiveTags(); + if (updatedTags != currentTags) { + setTags(updatedTags); + emit tagsChanged(updatedTags); + } + } } \ No newline at end of file diff --git a/cockatrice/src/interface/widgets/visual_deck_storage/deck_preview/deck_preview_deck_tags_display_widget.h b/cockatrice/src/interface/widgets/visual_deck_storage/deck_preview/deck_preview_deck_tags_display_widget.h index 85b0bb9f8..74ea1cbdf 100644 --- a/cockatrice/src/interface/widgets/visual_deck_storage/deck_preview/deck_preview_deck_tags_display_widget.h +++ b/cockatrice/src/interface/widgets/visual_deck_storage/deck_preview/deck_preview_deck_tags_display_widget.h @@ -17,12 +17,12 @@ class DeckPreviewDeckTagsDisplayWidget : public QWidget { Q_OBJECT - DeckList *deckList; + QStringList currentTags; FlowWidget *flowWidget; public: - explicit DeckPreviewDeckTagsDisplayWidget(QWidget *_parent, DeckList *_deckList); - void setDeckList(DeckList *_deckList); + explicit DeckPreviewDeckTagsDisplayWidget(QWidget *_parent, const QStringList &_tags); + void setTags(const QStringList &_tags); void refreshTags(); public slots: @@ -30,5 +30,13 @@ public slots: private: bool promptFileConversionIfRequired(DeckPreviewWidget *deckPreviewWidget); + void execTagDialog(const QStringList &knownTags); + +signals: + /** + * Emitted when the tags have changed due to user interaction. + * @param tags The new list of tags. + */ + void tagsChanged(const QStringList &tags); }; #endif // DECK_PREVIEW_DECK_TAGS_DISPLAY_WIDGET_H diff --git a/cockatrice/src/interface/widgets/visual_deck_storage/deck_preview/deck_preview_widget.cpp b/cockatrice/src/interface/widgets/visual_deck_storage/deck_preview/deck_preview_widget.cpp index 2735b4856..bf915bbea 100644 --- a/cockatrice/src/interface/widgets/visual_deck_storage/deck_preview/deck_preview_widget.cpp +++ b/cockatrice/src/interface/widgets/visual_deck_storage/deck_preview/deck_preview_widget.cpp @@ -83,7 +83,8 @@ void DeckPreviewWidget::initializeUi(const bool deckLoadSuccess) setFilePath(deckLoader->getLastLoadInfo().fileName); colorIdentityWidget = new ColorIdentityWidget(this, getColorIdentity()); - deckTagsDisplayWidget = new DeckPreviewDeckTagsDisplayWidget(this, deckLoader->getDeckList()); + deckTagsDisplayWidget = new DeckPreviewDeckTagsDisplayWidget(this, deckLoader->getDeckList()->getTags()); + connect(deckTagsDisplayWidget, &DeckPreviewDeckTagsDisplayWidget::tagsChanged, this, &DeckPreviewWidget::setTags); bannerCardLabel = new QLabel(this); bannerCardLabel->setObjectName("bannerCardLabel"); @@ -307,6 +308,12 @@ void DeckPreviewWidget::imageDoubleClickedEvent(QMouseEvent *event, DeckPreviewC emit deckLoadRequested(filePath); } +void DeckPreviewWidget::setTags(const QStringList &tags) +{ + deckLoader->getDeckList()->setTags(tags); + deckLoader->saveToFile(filePath, DeckLoader::CockatriceFormat); +} + QMenu *DeckPreviewWidget::createRightClickMenu() { auto *menu = new QMenu(this); diff --git a/cockatrice/src/interface/widgets/visual_deck_storage/deck_preview/deck_preview_widget.h b/cockatrice/src/interface/widgets/visual_deck_storage/deck_preview/deck_preview_widget.h index 76db9e569..6e6fdb9af 100644 --- a/cockatrice/src/interface/widgets/visual_deck_storage/deck_preview/deck_preview_widget.h +++ b/cockatrice/src/interface/widgets/visual_deck_storage/deck_preview/deck_preview_widget.h @@ -72,6 +72,8 @@ private: void addSetBannerCardMenu(QMenu *menu); private slots: + void setTags(const QStringList &tags); + void actRenameDeck(); void actRenameFile(); void actDeleteFile();