From 54ee406a58508457d04f2e25fcb734e9918bc81d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20Br=C3=BCbach?= Date: Sun, 7 Dec 2025 22:03:07 +0100 Subject: [PATCH] tutorialize deck editors Took 8 seconds Took 12 minutes --- .../tab_deck_editor_visual.cpp | 26 +++++++++++++++++++ .../tab_deck_editor_visual.h | 6 +++++ .../visual_database_display_widget.cpp | 23 ++++++++++++++++ .../visual_database_display_widget.h | 3 +++ 4 files changed, 58 insertions(+) diff --git a/cockatrice/src/interface/widgets/tabs/visual_deck_editor/tab_deck_editor_visual.cpp b/cockatrice/src/interface/widgets/tabs/visual_deck_editor/tab_deck_editor_visual.cpp index 6dd55d545..eadff8dd3 100644 --- a/cockatrice/src/interface/widgets/tabs/visual_deck_editor/tab_deck_editor_visual.cpp +++ b/cockatrice/src/interface/widgets/tabs/visual_deck_editor/tab_deck_editor_visual.cpp @@ -5,6 +5,7 @@ #include "../../interface/pixel_map_generator.h" #include "../../interface/widgets/cards/card_info_frame_widget.h" #include "../../interface/widgets/deck_analytics/deck_analytics_widget.h" +#include "../../interface/widgets/general/tutorial/tutorial_controller.h" #include "../../interface/widgets/visual_deck_editor/visual_deck_editor_widget.h" #include "../tab_deck_editor.h" #include "../tab_supervisor.h" @@ -50,6 +51,31 @@ TabDeckEditorVisual::TabDeckEditorVisual(TabSupervisor *_tabSupervisor) : Abstra loadLayout(); databaseDisplayDockWidget->setHidden(true); + tutorialController = new TutorialController(this); + + auto sequence = TutorialSequence(); + + sequence.addStep({tabContainer->visualDeckView, "View your deck here.", + [this]() { tabContainer->setCurrentWidget(tabContainer->visualDeckView); }}); + sequence.addStep({printingSelectorDockWidget, "Change the printings in your deck here."}); + + tutorialController->addSequence(sequence); + + auto vddSequence = tabContainer->visualDatabaseDisplay->addTutorialSteps(); + vddSequence.steps.prepend({tabContainer->visualDatabaseDisplay, "View the database here", + [this]() { tabContainer->setCurrentWidget(tabContainer->visualDatabaseDisplay); }}); + + tutorialController->addSequence(vddSequence); +} + +void TabDeckEditorVisual::showEvent(QShowEvent *ev) +{ + QWidget::showEvent(ev); + if (!tutorialStarted) { + tutorialStarted = true; + // Start on next event loop iteration so everything is fully painted + QTimer::singleShot(0, tutorialController, [this] { tutorialController->start(); }); + } } /** @brief Creates the central frame containing the tab container. */ diff --git a/cockatrice/src/interface/widgets/tabs/visual_deck_editor/tab_deck_editor_visual.h b/cockatrice/src/interface/widgets/tabs/visual_deck_editor/tab_deck_editor_visual.h index 2f1d11d82..f0cf71bff 100644 --- a/cockatrice/src/interface/widgets/tabs/visual_deck_editor/tab_deck_editor_visual.h +++ b/cockatrice/src/interface/widgets/tabs/visual_deck_editor/tab_deck_editor_visual.h @@ -4,6 +4,7 @@ #include "../tab.h" #include "tab_deck_editor_visual_tab_widget.h" +class TutorialController; /** * @class TabDeckEditorVisual * @ingroup DeckEditorTabs @@ -55,7 +56,12 @@ class TabDeckEditorVisual : public AbstractTabDeckEditor { Q_OBJECT +private: + TutorialController *tutorialController = nullptr; + bool tutorialStarted = false; + protected slots: + void showEvent(QShowEvent *ev) override; /** * @brief Load the editor layout from settings. */ diff --git a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_widget.cpp b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_widget.cpp index cc0fc8033..6961c22f6 100644 --- a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_widget.cpp +++ b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_widget.cpp @@ -5,6 +5,7 @@ #include "../../../filters/syntax_help.h" #include "../../pixel_map_generator.h" #include "../cards/card_info_picture_with_text_overlay_widget.h" +#include "../general/tutorial/tutorial_controller.h" #include "../quick_settings/settings_button_widget.h" #include "../utility/custom_line_edit.h" #include "visual_database_display_color_filter_widget.h" @@ -192,6 +193,28 @@ VisualDatabaseDisplayWidget::VisualDatabaseDisplayWidget(QWidget *parent, retranslateUi(); } +TutorialSequence VisualDatabaseDisplayWidget::addTutorialSteps() +{ + auto sequence = TutorialSequence(); + sequence.addStep({colorFilterWidget, "Filter the database by colors with these controls"}); + sequence.addStep({displayModeButton, "You can change back to the old table display-style with this button."}); + sequence.addStep({filterContainer, "Use these controls for quick access to common filters."}); + sequence.addStep( + {quickFilterSaveLoadWidget, "This button will let you save and load all currently applied filters to files."}); + sequence.addStep({quickFilterNameWidget, + "This button will let you apply name filters. Optionally, you can import every card in " + "your deck as a name filter and then save this as a filter using the save/load button " + "to make your own quick access collections!"}); + sequence.addStep({mainTypeFilterWidget, "Use these buttons to quickly filter by card types."}); + sequence.addStep({quickFilterSubTypeWidget, "This button will let you apply filters for card sub-types."}); + sequence.addStep( + {quickFilterSetWidget, + "This button will let you apply filters for card sets. You can also filter to the X most recent sets. " + "Filtering to a set will display all printings of a card within that set."}); + + return sequence; +} + void VisualDatabaseDisplayWidget::initialize() { databaseLoadIndicator->setVisible(false); diff --git a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_widget.h b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_widget.h index 5cab2ca9b..a0dbf87c4 100644 --- a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_widget.h +++ b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_widget.h @@ -14,6 +14,7 @@ #include "../cards/card_size_widget.h" #include "../general/layout_containers/flow_widget.h" #include "../general/layout_containers/overlap_control_widget.h" +#include "../general/tutorial/tutorial_controller.h" #include "../utility/custom_line_edit.h" #include "visual_database_display_color_filter_widget.h" #include "visual_database_display_filter_save_load_widget.h" @@ -30,6 +31,7 @@ #include #include +class TutorialController; inline Q_LOGGING_CATEGORY(VisualDatabaseDisplayLog, "visual_database_display"); class VisualDatabaseDisplayWidget : public QWidget @@ -59,6 +61,7 @@ public: VisualDatabaseDisplayColorFilterWidget *colorFilterWidget; public slots: + TutorialSequence addTutorialSteps(); void searchModelChanged(); signals: