From cbfe52c7563e2d9edfa2dab72f672cef9c5b5a55 Mon Sep 17 00:00:00 2001 From: WerWolv Date: Tue, 11 Jan 2022 22:38:50 +0100 Subject: [PATCH] patterns/ui: Limit displaying of array entries to 50 with option to double click last entry for more --- .../content/views/view_pattern_data.cpp | 14 +++---- .../hex/pattern_language/pattern_data.hpp | 42 ++++++++++++++----- 2 files changed, 38 insertions(+), 18 deletions(-) diff --git a/plugins/builtin/source/content/views/view_pattern_data.cpp b/plugins/builtin/source/content/views/view_pattern_data.cpp index ae4f4d5a2..8dcbf97a8 100644 --- a/plugins/builtin/source/content/views/view_pattern_data.cpp +++ b/plugins/builtin/source/content/views/view_pattern_data.cpp @@ -17,14 +17,14 @@ namespace hex::plugin::builtin { } static bool beginPatternDataTable(prv::Provider* &provider, const std::vector &patterns, std::vector &sortedPatterns) { - if (ImGui::BeginTable("##patterndatatable", 6, ImGuiTableFlags_Borders | ImGuiTableFlags_Resizable | ImGuiTableFlags_Sortable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_RowBg | ImGuiTableFlags_ScrollY)) { + if (ImGui::BeginTable("##patterndatatable", 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, -1, ImGui::GetID("name")); - ImGui::TableSetupColumn("hex.builtin.view.pattern_data.color"_lang, 0, -1, ImGui::GetID("color")); - ImGui::TableSetupColumn("hex.builtin.view.pattern_data.offset"_lang, 0, -1, ImGui::GetID("offset")); - ImGui::TableSetupColumn("hex.builtin.view.pattern_data.size"_lang, 0, -1, ImGui::GetID("size")); - ImGui::TableSetupColumn("hex.builtin.view.pattern_data.type"_lang, 0, -1, ImGui::GetID("type")); - ImGui::TableSetupColumn("hex.builtin.view.pattern_data.value"_lang, 0, -1, ImGui::GetID("value")); + 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(); diff --git a/plugins/libimhex/include/hex/pattern_language/pattern_data.hpp b/plugins/libimhex/include/hex/pattern_language/pattern_data.hpp index f5472fe72..884379f27 100644 --- a/plugins/libimhex/include/hex/pattern_language/pattern_data.hpp +++ b/plugins/libimhex/include/hex/pattern_language/pattern_data.hpp @@ -782,23 +782,28 @@ namespace hex::pl { } if (open) { - for (auto &member : this->m_entries) - member->draw(provider); + for (u64 i = 0; i < this->m_entries.size(); i++) { + this->m_entries[i]->draw(provider); + + if (i >= (this->m_displayEnd - 1)) { + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + + ImGui::Selectable("... (Double-click to see more items)", false, ImGuiSelectableFlags_SpanAllColumns); + if (ImGui::IsItemHovered() && ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left)) + this->m_displayEnd += 50; + + break; + } + } if (!this->isInlined()) ImGui::TreePop(); + } else { + this->m_displayEnd = 50; } } - std::optional highlightBytes(size_t offset) override{ - for (auto &entry : this->m_entries) { - if (auto color = entry->highlightBytes(offset); color.has_value()) - return color.value(); - } - - return { }; - } - std::map getHighlightedAddresses() override { std::map result; @@ -843,6 +848,7 @@ namespace hex::pl { private: std::vector m_entries; + u64 m_displayEnd = 50; }; class PatternDataStaticArray : public PatternData, public Inlinable { @@ -900,11 +906,24 @@ namespace hex::pl { entry->setVariableName(hex::format("[{0}]", index)); entry->setOffset(this->getOffset() + index * this->m_template->getSize()); entry->draw(provider); + + if (index >= (this->m_displayEnd - 1)) { + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + + ImGui::Selectable("... (Double-click to see more items)", false, ImGuiSelectableFlags_SpanAllColumns); + if (ImGui::IsItemHovered() && ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left)) + this->m_displayEnd += 50; + + break; + } } delete entry; if (!this->isInlined()) ImGui::TreePop(); + } else { + this->m_displayEnd = 50; } } @@ -962,6 +981,7 @@ namespace hex::pl { private: PatternData *m_template; size_t m_entryCount; + u64 m_displayEnd = 50; }; class PatternDataStruct : public PatternData, public Inlinable {