From 27790532f83ebba1894d5abcc876e80ac8834ffc Mon Sep 17 00:00:00 2001 From: WerWolv Date: Tue, 24 Jan 2023 23:27:15 +0100 Subject: [PATCH] fix: Crash when closing provider that had pattern loaded in some cases --- .../content/views/view_pattern_data.hpp | 1 - plugins/builtin/include/ui/pattern_drawer.hpp | 3 +++ .../content/views/view_pattern_data.cpp | 22 +++++++++---------- .../content/views/view_pattern_editor.cpp | 2 +- plugins/builtin/source/ui/pattern_drawer.cpp | 14 ++++++++---- 5 files changed, 24 insertions(+), 18 deletions(-) diff --git a/plugins/builtin/include/content/views/view_pattern_data.hpp b/plugins/builtin/include/content/views/view_pattern_data.hpp index f6fa07986..c6c0a3947 100644 --- a/plugins/builtin/include/content/views/view_pattern_data.hpp +++ b/plugins/builtin/include/content/views/view_pattern_data.hpp @@ -19,7 +19,6 @@ namespace hex::plugin::builtin { void drawContent() override; private: - std::map> m_sortedPatterns; ui::PatternDrawer m_patternDrawer; }; diff --git a/plugins/builtin/include/ui/pattern_drawer.hpp b/plugins/builtin/include/ui/pattern_drawer.hpp index 3e67846bf..634d86d34 100644 --- a/plugins/builtin/include/ui/pattern_drawer.hpp +++ b/plugins/builtin/include/ui/pattern_drawer.hpp @@ -19,6 +19,7 @@ namespace hex::plugin::builtin::ui { }; void setTreeStyle(TreeStyle style) { this->m_treeStyle = style; } + void reset(); private: void draw(pl::ptrn::Pattern& pattern); @@ -64,5 +65,7 @@ namespace hex::plugin::builtin::ui { const pl::ptrn::Pattern *m_editingPattern = nullptr; TreeStyle m_treeStyle = TreeStyle::Default; pl::ptrn::Pattern *m_currVisualizedPattern = nullptr; + + std::set m_visualizedPatterns; }; } \ No newline at end of file diff --git a/plugins/builtin/source/content/views/view_pattern_data.cpp b/plugins/builtin/source/content/views/view_pattern_data.cpp index e2a9c4d64..8b426fb92 100644 --- a/plugins/builtin/source/content/views/view_pattern_data.cpp +++ b/plugins/builtin/source/content/views/view_pattern_data.cpp @@ -11,26 +11,21 @@ namespace hex::plugin::builtin { ViewPatternData::ViewPatternData() : View("hex.builtin.view.pattern_data.name") { - EventManager::subscribe(this, [this]() { - if (!ImHexApi::Provider::isValid()) return; - - this->m_sortedPatterns[ImHexApi::Provider::get()].clear(); - }); - - EventManager::subscribe([this](auto *provider) { - this->m_sortedPatterns[provider].clear(); - }); - - EventManager::subscribe([this]() { + EventManager::subscribe(this, [this]() { auto patternStyle = ContentRegistry::Settings::getSetting("hex.builtin.setting.interface", "hex.builtin.setting.interface.pattern_tree_style"); if (patternStyle.is_number()) this->m_patternDrawer.setTreeStyle(static_cast(patternStyle.get())); }); + + EventManager::subscribe(this, [this](auto, auto) { + this->m_patternDrawer.reset(); + }); } ViewPatternData::~ViewPatternData() { - EventManager::unsubscribe(this); + EventManager::unsubscribe(this); + EventManager::unsubscribe(this); } void ViewPatternData::drawContent() { @@ -48,6 +43,9 @@ namespace hex::plugin::builtin { } }(); + if (!patternLanguage.executionDone) + this->m_patternDrawer.reset(); + this->m_patternDrawer.draw(patterns); } } diff --git a/plugins/builtin/source/content/views/view_pattern_editor.cpp b/plugins/builtin/source/content/views/view_pattern_editor.cpp index 982b80ac0..af33b4fb9 100644 --- a/plugins/builtin/source/content/views/view_pattern_editor.cpp +++ b/plugins/builtin/source/content/views/view_pattern_editor.cpp @@ -96,7 +96,7 @@ namespace hex::plugin::builtin { ViewPatternEditor::~ViewPatternEditor() { EventManager::unsubscribe(this); EventManager::unsubscribe(this); - EventManager::unsubscribe(this); + EventManager::unsubscribe(this); EventManager::unsubscribe(this); EventManager::unsubscribe(this); } diff --git a/plugins/builtin/source/ui/pattern_drawer.cpp b/plugins/builtin/source/ui/pattern_drawer.cpp index 30fecc1e9..2efc1bc74 100644 --- a/plugins/builtin/source/ui/pattern_drawer.cpp +++ b/plugins/builtin/source/ui/pattern_drawer.cpp @@ -140,19 +140,17 @@ namespace hex::plugin::builtin::ui { void PatternDrawer::drawVisualizerButton(pl::ptrn::Pattern& pattern, pl::ptrn::Iteratable &iteratable) { if (const auto &arguments = pattern.getAttributeArguments("hex::visualize"); !arguments.empty()) { - static bool shouldReset = false; ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0)); if (ImGui::Button(pattern.getFormattedValue().c_str(), ImVec2(-1, ImGui::GetTextLineHeight()))) { this->m_currVisualizedPattern = &pattern; - shouldReset = true; ImGui::OpenPopup("Visualizer"); } ImGui::PopStyleVar(); if (ImGui::BeginPopup("Visualizer")) { if (this->m_currVisualizedPattern == &pattern) { - drawVisualizer(arguments, pattern, iteratable, shouldReset); - shouldReset = false; + drawVisualizer(arguments, pattern, iteratable, !this->m_visualizedPatterns.contains(&pattern)); + this->m_visualizedPatterns.insert(&pattern); } ImGui::EndPopup(); @@ -835,4 +833,12 @@ namespace hex::plugin::builtin::ui { ImGui::EndTable(); } } + + void PatternDrawer::reset() { + this->m_editingPattern = nullptr; + this->m_displayEnd.clear(); + this->m_visualizedPatterns.clear(); + this->m_currVisualizedPattern = nullptr; + this->m_sortedPatterns.clear(); + } }