From 64e34e42b85f113afa817c51e9ce384ee8beb939 Mon Sep 17 00:00:00 2001 From: WerWolv Date: Fri, 17 Feb 2023 14:53:15 +0100 Subject: [PATCH] patterns: Fixed highlighting of custom sections --- .../content/views/view_pattern_editor.hpp | 3 +++ plugins/builtin/include/ui/pattern_drawer.hpp | 3 +++ .../content/views/view_pattern_data.cpp | 2 ++ .../content/views/view_pattern_editor.cpp | 26 ++++++++++++++++--- plugins/builtin/source/ui/pattern_drawer.cpp | 2 +- 5 files changed, 31 insertions(+), 5 deletions(-) diff --git a/plugins/builtin/include/content/views/view_pattern_editor.hpp b/plugins/builtin/include/content/views/view_pattern_editor.hpp index ad187128c..34ad7c53a 100644 --- a/plugins/builtin/include/content/views/view_pattern_editor.hpp +++ b/plugins/builtin/include/content/views/view_pattern_editor.hpp @@ -66,6 +66,9 @@ namespace hex::plugin::builtin { bool m_autoLoadPatterns = true; std::map> m_sectionWindowDrawer; + + ui::HexEditor m_sectionHexEditor; + private: void drawConsole(ImVec2 size, const std::vector> &console); void drawEnvVars(ImVec2 size, std::list &envVars); diff --git a/plugins/builtin/include/ui/pattern_drawer.hpp b/plugins/builtin/include/ui/pattern_drawer.hpp index 20f0c995f..beafcd7e9 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 setSelectionCallback(std::function callback) { this->m_selectionCallback = std::move(callback); } void reset(); private: @@ -74,5 +75,7 @@ namespace hex::plugin::builtin::ui { std::set m_visualizedPatterns; std::string m_lastVisualizerError; + + std::function m_selectionCallback = [](Region) { }; }; } \ 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 8b426fb92..b7747ae64 100644 --- a/plugins/builtin/source/content/views/view_pattern_data.cpp +++ b/plugins/builtin/source/content/views/view_pattern_data.cpp @@ -21,6 +21,8 @@ namespace hex::plugin::builtin { EventManager::subscribe(this, [this](auto, auto) { this->m_patternDrawer.reset(); }); + + this->m_patternDrawer.setSelectionCallback([](Region region){ ImHexApi::HexEditor::setSelection(region); }); } ViewPatternData::~ViewPatternData() { diff --git a/plugins/builtin/source/content/views/view_pattern_editor.cpp b/plugins/builtin/source/content/views/view_pattern_editor.cpp index 11f3ade87..f4014d96a 100644 --- a/plugins/builtin/source/content/views/view_pattern_editor.cpp +++ b/plugins/builtin/source/content/views/view_pattern_editor.cpp @@ -437,7 +437,8 @@ namespace hex::plugin::builtin { dataProvider->writeRaw(0x00, section.data.data(), section.data.size()); dataProvider->setReadOnly(true); - auto hexEditor = ui::HexEditor(); + auto hexEditor = auto(this->m_sectionHexEditor); + hexEditor.setBackgroundHighlightCallback([this, id](u64 address, const u8 *, size_t) -> std::optional { if (this->m_runningEvaluators != 0) return std::nullopt; @@ -446,7 +447,7 @@ namespace hex::plugin::builtin { std::optional color; for (const auto &pattern : ProviderExtraData::getCurrent().patternLanguage.runtime->getPatternsAtAddress(address, id)) { - if (pattern->getVisibility() == pl::ptrn::Visibility::Hidden) + if (pattern->getVisibility() != pl::ptrn::Visibility::Visible) continue; if (color.has_value()) @@ -460,11 +461,27 @@ namespace hex::plugin::builtin { auto patternProvider = ImHexApi::Provider::get(); - this->m_sectionWindowDrawer[patternProvider] = [id, patternProvider, dataProvider = std::move(dataProvider), hexEditor, patternDrawer = ui::PatternDrawer()] mutable { + + this->m_sectionWindowDrawer[patternProvider] = [id, patternProvider, dataProvider = std::move(dataProvider), hexEditor = std::move(hexEditor), patternDrawer = ui::PatternDrawer()] mutable { hexEditor.setProvider(dataProvider.get()); hexEditor.draw(480_scaled); + patternDrawer.setSelectionCallback([&](const auto ®ion) { + hexEditor.setSelection(region); + }); - patternDrawer.draw(ProviderExtraData::get(patternProvider).patternLanguage.runtime->getAllPatterns(id), 150_scaled); + auto &patternLanguage = ProviderExtraData::get(patternProvider).patternLanguage; + + const auto &patterns = [&] -> const auto& { + if (patternProvider->isReadable() && patternLanguage.runtime != nullptr && patternLanguage.executionDone) + return ProviderExtraData::get(patternProvider).patternLanguage.runtime->getAllPatterns(id); + else { + static const std::vector> empty; + return empty; + } + }(); + + if (patternLanguage.executionDone) + patternDrawer.draw(patterns, 150_scaled); }; } @@ -672,6 +689,7 @@ namespace hex::plugin::builtin { this->m_textEditor.SetErrorMarkers({}); patternLanguage.console.clear(); + this->m_sectionWindowDrawer.clear(); ContentRegistry::PatternLanguage::configureRuntime(*patternLanguage.runtime, provider); diff --git a/plugins/builtin/source/ui/pattern_drawer.cpp b/plugins/builtin/source/ui/pattern_drawer.cpp index a09a994e3..980f45431 100644 --- a/plugins/builtin/source/ui/pattern_drawer.cpp +++ b/plugins/builtin/source/ui/pattern_drawer.cpp @@ -208,7 +208,7 @@ namespace hex::plugin::builtin::ui { ImGui::PushID(pattern.getVariableName().c_str()); if (ImGui::Selectable("##PatternLine", false, ImGuiSelectableFlags_SpanAllColumns | ImGuiSelectableFlags_AllowItemOverlap)) { - ImHexApi::HexEditor::setSelection(pattern.getOffset(), pattern.getSize()); + this->m_selectionCallback(Region { pattern.getOffset(), pattern.getSize() }); this->resetEditing(); }