From e4fbb1b640057f1b1f0838567a0f2f3d60598bb7 Mon Sep 17 00:00:00 2001 From: WerWolv Date: Fri, 23 Dec 2022 14:33:27 +0100 Subject: [PATCH] pattern: Added basic line plot and image visualizer --- lib/external/pattern_language | 2 +- plugins/builtin/source/ui/pattern_drawer.cpp | 39 +++++++++++++++++++- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/lib/external/pattern_language b/lib/external/pattern_language index f69cafb1d..10a7c7873 160000 --- a/lib/external/pattern_language +++ b/lib/external/pattern_language @@ -1 +1 @@ -Subproject commit f69cafb1d618ef79a5ea01be8b225f0340380a2f +Subproject commit 10a7c78737088bc0b0632cc8fb7132d5be32c42d diff --git a/plugins/builtin/source/ui/pattern_drawer.cpp b/plugins/builtin/source/ui/pattern_drawer.cpp index 6f31f1fb0..0ae1fcc23 100644 --- a/plugins/builtin/source/ui/pattern_drawer.cpp +++ b/plugins/builtin/source/ui/pattern_drawer.cpp @@ -25,6 +25,7 @@ #include #include +#include #include namespace hex::plugin::builtin::ui { @@ -129,6 +130,32 @@ namespace hex::plugin::builtin::ui { } } + void drawVisualizer(const std::string &visualizer, pl::ptrn::Pattern &pattern, pl::ptrn::Iteratable &iteratable) { + if (visualizer == "line_plot") { + if (ImPlot::BeginPlot("##plot", ImVec2(400, 250), ImPlotFlags_NoChild | ImPlotFlags_CanvasOnly)) { + + ImPlot::SetupAxes("X", "Y", ImPlotAxisFlags_AutoFit, ImPlotAxisFlags_AutoFit); + + ImPlot::PlotLineG("##line", [](void *data, int idx) -> ImPlotPoint { + auto &iteratable = *static_cast(data); + return { static_cast(idx), pl::core::Token::literalToFloatingPoint(iteratable.getEntry(idx)->getValue()) }; + }, &iteratable, iteratable.getEntryCount()); + + ImPlot::EndPlot(); + } + } else if (visualizer == "image") { + std::vector data; + data.resize(pattern.getSize()); + + pattern.getEvaluator()->readData(pattern.getOffset(), data.data(), data.size(), pattern.getSection()); + static ImGui::Texture texture; + texture = ImGui::Texture(data.data(), data.size()); + + if (texture.isValid()) + ImGui::Image(texture, texture.getSize()); + } + } + } void PatternDrawer::makeSelectable(const pl::ptrn::Pattern &pattern) { @@ -460,7 +487,7 @@ namespace hex::plugin::builtin::ui { if (open) { int id = 1; - pattern.forEachEntry(0, pattern.getMembers().size(), [&](u64, auto *member){ + pattern.forEachEntry(0, pattern.getEntryCount(), [&](u64, auto *member){ ImGui::PushID(id); this->draw(*member); ImGui::PopID(); @@ -577,6 +604,16 @@ namespace hex::plugin::builtin::ui { ImGui::TableNextColumn(); makeSelectable(pattern); drawCommentTooltip(pattern); + if (const auto &visualizer = pattern.getAttributeValue("hex::visualize"); visualizer.has_value()) { + if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem)) { + ImGui::BeginTooltip(); + + drawVisualizer(visualizer.value(), pattern, iteratable); + + ImGui::EndTooltip(); + } + } + if (pattern.isSealed()) drawColorColumn(pattern); else