mirror of https://github.com/WerWolv/ImHex.git
patterns: Fixed highlighting of custom sections
This commit is contained in:
parent
21dc65f42a
commit
64e34e42b8
|
@ -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);
|
||||
|
|
|
@ -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) { };
|
||||
};
|
||||
}
|
|
@ -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() {
|
||||
|
|
|
@ -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 ®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<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);
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue