From 48a737d565dfe079530681af0bfff01ec304548f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20Br=C3=BCbach?= Date: Thu, 13 Aug 2026 14:30:52 +0200 Subject: [PATCH] [DeckEditor] Offer .cod conversion when tagging non-.cod decks When the user tags a deck loaded from a .txt file, prompt for conversion to the Cockatrice format (sharing the deck preview prompt) and convert the deck in place via DeckLoader::convertToCockatriceFormat, updating lastLoadInfo so the deck saves as .cod. Took 2 minutes --- .../deck_editor_deck_dock_widget.cpp | 19 +++++++++++++++++++ .../widgets/deck_editor/deck_state_manager.h | 9 +++++++++ 2 files changed, 28 insertions(+) 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 fc53b296f..96ca2b893 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 @@ -2,6 +2,8 @@ #include "../../../client/settings/cache_settings.h" #include "../../../client/settings/shortcuts_settings.h" +#include "../../deck_loader/deck_loader.h" +#include "../dialogs/dlg_convert_deck_to_cod_format.h" #include "../settings_page/user_interface_settings_page.h" #include "../tabs/api/commander_spellbook/commander_bracket_widget.h" #include "deck_list_style_proxy.h" @@ -176,6 +178,23 @@ void DeckEditorDeckDockWidget::createDeckDock() connect(deckTagsDisplayWidget, &DeckPreviewDeckTagsDisplayWidget::tagsChanged, deckStateManager, &DeckStateManager::setTags); + // Local deck files in non-Cockatrice formats (e.g. .txt) can't store tags. + // Offer to convert the file to .cod before the user opens the tag dialog. + deckTagsDisplayWidget->setConversionPromptHandler([this] { + const LoadedDeck::LoadInfo &loadInfo = deckStateManager->getLastLoadInfo(); + if (loadInfo.fileName.isEmpty()) { + return true; // A new, unsaved deck can hold tags in memory. + } + return promptFileConversionIfRequired(this, loadInfo.fileName, [this] { + LoadedDeck deck = deckStateManager->toLoadedDeck(); + if (!DeckLoader::convertToCockatriceFormat(deck)) { + return false; + } + deckStateManager->setLastLoadInfo(deck.lastLoadInfo); + return true; + }); + }); + activeGroupCriteriaLabel = new QLabel(this); activeGroupCriteriaComboBox = new QComboBox(this); diff --git a/cockatrice/src/interface/widgets/deck_editor/deck_state_manager.h b/cockatrice/src/interface/widgets/deck_editor/deck_state_manager.h index 6fce6be57..ad079d591 100644 --- a/cockatrice/src/interface/widgets/deck_editor/deck_state_manager.h +++ b/cockatrice/src/interface/widgets/deck_editor/deck_state_manager.h @@ -116,6 +116,15 @@ public: */ void clearDeck(); + /** + * @brief Gets the lastLoadInfo. + * @return The lastLoadInfo + */ + const LoadedDeck::LoadInfo &getLastLoadInfo() const + { + return lastLoadInfo; + } + /** * @brief Sets the lastLoadInfo. * @param loadInfo The lastLoadInfo