patterns: Fixed highlighting of custom sections

This commit is contained in:
WerWolv 2023-02-17 14:53:15 +01:00
parent 21dc65f42a
commit 64e34e42b8
5 changed files with 31 additions and 5 deletions

View File

@ -66,6 +66,9 @@ namespace hex::plugin::builtin {
bool m_autoLoadPatterns = true;
std::map<prv::Provider*, std::move_only_function<void()>> m_sectionWindowDrawer;
ui::HexEditor m_sectionHexEditor;
private:
void drawConsole(ImVec2 size, const std::vector<std::pair<pl::core::LogConsole::Level, std::string>> &console);
void drawEnvVars(ImVec2 size, std::list<PlData::EnvVar> &envVars);

View File

@ -19,6 +19,7 @@ namespace hex::plugin::builtin::ui {
};
void setTreeStyle(TreeStyle style) { this->m_treeStyle = style; }
void setSelectionCallback(std::function<void(Region)> callback) { this->m_selectionCallback = std::move(callback); }
void reset();
private:
@ -74,5 +75,7 @@ namespace hex::plugin::builtin::ui {
std::set<pl::ptrn::Pattern*> m_visualizedPatterns;
std::string m_lastVisualizerError;
std::function<void(Region)> m_selectionCallback = [](Region) { };
};
}

View File

@ -21,6 +21,8 @@ namespace hex::plugin::builtin {
EventManager::subscribe<EventProviderChanged>(this, [this](auto, auto) {
this->m_patternDrawer.reset();
});
this->m_patternDrawer.setSelectionCallback([](Region region){ ImHexApi::HexEditor::setSelection(region); });
}
ViewPatternData::~ViewPatternData() {

View File

@ -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<color_t> {
if (this->m_runningEvaluators != 0)
return std::nullopt;
@ -446,7 +447,7 @@ namespace hex::plugin::builtin {
std::optional<ImColor> 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 &region) {
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<std::shared_ptr<pl::ptrn::Pattern>> 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);

View File

@ -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();
}