#include "content/views/view_pattern_data.hpp" #include #include #include 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(); }); } ViewPatternData::~ViewPatternData() { EventManager::unsubscribe(this); } static bool beginPatternTable(prv::Provider *&provider, const std::vector> &patterns, std::vector> &sortedPatterns) { if (ImGui::BeginTable("##Patterntable", 6, ImGuiTableFlags_Borders | ImGuiTableFlags_Resizable | ImGuiTableFlags_Sortable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_RowBg | ImGuiTableFlags_ScrollY)) { ImGui::TableSetupScrollFreeze(0, 1); ImGui::TableSetupColumn("hex.builtin.view.pattern_data.var_name"_lang, 0, 0, ImGui::GetID("name")); ImGui::TableSetupColumn("hex.builtin.view.pattern_data.color"_lang, 0, 0, ImGui::GetID("color")); ImGui::TableSetupColumn("hex.builtin.view.pattern_data.offset"_lang, 0, 0, ImGui::GetID("offset")); ImGui::TableSetupColumn("hex.builtin.view.pattern_data.size"_lang, 0, 0, ImGui::GetID("size")); ImGui::TableSetupColumn("hex.builtin.view.pattern_data.type"_lang, 0, 0, ImGui::GetID("type")); ImGui::TableSetupColumn("hex.builtin.view.pattern_data.value"_lang, 0, 0, ImGui::GetID("value")); auto sortSpecs = ImGui::TableGetSortSpecs(); if (sortSpecs->SpecsDirty || sortedPatterns.empty()) { sortedPatterns = patterns; std::sort(sortedPatterns.begin(), sortedPatterns.end(), [&sortSpecs, &provider](const std::shared_ptr &left, const std::shared_ptr &right) -> bool { return pl::Pattern::sortPatternTable(sortSpecs, provider, left.get(), right.get()); }); for (auto &pattern : sortedPatterns) pattern->sort(sortSpecs, provider); sortSpecs->SpecsDirty = false; } return true; } return false; } void ViewPatternData::drawContent() { if (ImGui::Begin(View::toWindowName("hex.builtin.view.pattern_data.name").c_str(), &this->getWindowOpenState(), ImGuiWindowFlags_NoCollapse)) { auto provider = ImHexApi::Provider::get(); if (ImHexApi::Provider::isValid() && provider->isReadable()) { auto &sortedPatterns = this->m_sortedPatterns[ImHexApi::Provider::get()]; if (beginPatternTable(provider, provider->getPatternLanguageRuntime().getPatterns(), sortedPatterns)) { ImGui::TableHeadersRow(); if (!sortedPatterns.empty()) { m_drawer.setProvider(provider); for (auto &patterns : sortedPatterns) patterns->accept(m_drawer); } ImGui::EndTable(); } } } ImGui::End(); } }