From f97be0208712fd4be33753a551f41ad177b8c16a Mon Sep 17 00:00:00 2001 From: WerWolv Date: Fri, 19 Dec 2025 10:13:48 +0100 Subject: [PATCH] impr: Added proper cancel buttons to tutorial popups and tutorial selector Closes #2571 --- lib/libimhex/include/hex/api/tutorial_manager.hpp | 1 + lib/libimhex/source/api/tutorial_manager.cpp | 12 +++++++++++- plugins/builtin/romfs/lang/en_US.json | 1 + .../source/content/views/view_tutorials.cpp | 14 +++++++++----- 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/lib/libimhex/include/hex/api/tutorial_manager.hpp b/lib/libimhex/include/hex/api/tutorial_manager.hpp index af55d517b..34bdff476 100644 --- a/lib/libimhex/include/hex/api/tutorial_manager.hpp +++ b/lib/libimhex/include/hex/api/tutorial_manager.hpp @@ -149,6 +149,7 @@ EXPORT_MODULE namespace hex { * @param unlocalizedName Name of tutorial to start */ static void startTutorial(const UnlocalizedString &unlocalizedName); + static void stopCurrentTutorial(); static void startHelpHover(); static void addInteractiveHelpText(std::initializer_list> &&ids, UnlocalizedString unlocalizedString); diff --git a/lib/libimhex/source/api/tutorial_manager.cpp b/lib/libimhex/source/api/tutorial_manager.cpp index de6e7154d..de221976c 100644 --- a/lib/libimhex/source/api/tutorial_manager.cpp +++ b/lib/libimhex/source/api/tutorial_manager.cpp @@ -217,6 +217,10 @@ namespace hex { s_currentTutorial->second.start(); } + void TutorialManager::stopCurrentTutorial() { + s_currentTutorial = s_tutorials->end(); + } + void TutorialManager::drawHighlights() { if (s_helpHoverActive) { const auto &drawList = ImGui::GetForegroundDrawList(ImGui::GetMainViewport()); @@ -347,7 +351,9 @@ namespace hex { ImGui::SetNextWindowPos(position, ImGuiCond_Always, pivot); ImGui::SetNextWindowViewport(ImGui::GetMainViewport()->ID); ImGui::SetNextWindowSize(ImVec2(300_scaled, 0)); - if (ImGui::Begin(message->unlocalizedTitle.empty() ? "##TutorialMessage" : Lang(message->unlocalizedTitle), nullptr, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoScrollWithMouse | ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoFocusOnAppearing)) { + + bool open = true; + if (ImGui::Begin(message->unlocalizedTitle.empty() ? "##TutorialMessage" : Lang(message->unlocalizedTitle), &open, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoScrollWithMouse | ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoFocusOnAppearing)) { ImGui::BringWindowToDisplayFront(ImGui::GetCurrentWindowRead()); auto &step = s_currentTutorial->second.m_currentStep; @@ -373,6 +379,10 @@ namespace hex { ImGui::EndDisabled(); } ImGui::End(); + + if (!open) { + stopCurrentTutorial(); + } } void TutorialManager::drawTutorial() { diff --git a/plugins/builtin/romfs/lang/en_US.json b/plugins/builtin/romfs/lang/en_US.json index a58378678..9b22b7d8e 100644 --- a/plugins/builtin/romfs/lang/en_US.json +++ b/plugins/builtin/romfs/lang/en_US.json @@ -1162,6 +1162,7 @@ "hex.builtin.view.tutorials.name": "Interactive Tutorials", "hex.builtin.view.tutorials.description": "Description", "hex.builtin.view.tutorials.start": "Start Tutorial", + "hex.builtin.view.tutorials.stop": "Cancel current Tutorial", "hex.builtin.visualizer.binary": "Binary", "hex.builtin.visualizer.decimal.signed.16bit": "Decimal Signed (16 bits)", "hex.builtin.visualizer.decimal.signed.32bit": "Decimal Signed (32 bits)", diff --git a/plugins/builtin/source/content/views/view_tutorials.cpp b/plugins/builtin/source/content/views/view_tutorials.cpp index 34c367dd2..c992e35a8 100644 --- a/plugins/builtin/source/content/views/view_tutorials.cpp +++ b/plugins/builtin/source/content/views/view_tutorials.cpp @@ -61,12 +61,16 @@ namespace hex::plugin::builtin { } ImGuiExt::EndSubWindow(); - ImGui::BeginDisabled(currTutorial != tutorials.end()); - if (ImGuiExt::DimmedButton("hex.builtin.view.tutorials.start"_lang, ImVec2(ImGui::GetContentRegionAvail().x, 0))) { - TutorialManager::startTutorial(m_selectedTutorial->getUnlocalizedName()); - this->getWindowOpenState() = false; + if (currTutorial == tutorials.end()) { + if (ImGuiExt::DimmedButton("hex.builtin.view.tutorials.start"_lang, ImVec2(ImGui::GetContentRegionAvail().x, 0))) { + TutorialManager::startTutorial(m_selectedTutorial->getUnlocalizedName()); + this->getWindowOpenState() = false; + } + } else { + if (ImGuiExt::DimmedButton("hex.builtin.view.tutorials.stop"_lang, ImVec2(ImGui::GetContentRegionAvail().x, 0))) { + TutorialManager::stopCurrentTutorial(); + } } - ImGui::EndDisabled(); } ImGui::EndTable();