1 #include "views/view_pattern_data.hpp"
2 
3 #include <hex/providers/provider.hpp>
4 #include <hex/lang/pattern_data.hpp>
5 
6 namespace hex {
7 
ViewPatternData(std::vector<lang::PatternData * > & patternData)8     ViewPatternData::ViewPatternData(std::vector<lang::PatternData*> &patternData)
9         : View("hex.view.pattern_data.title"_lang), m_patternData(patternData) {
10 
11         this->subscribeEvent(Events::PatternChanged, [this](auto data) {
12             this->m_sortedPatternData.clear();
13         });
14     }
15 
~ViewPatternData()16     ViewPatternData::~ViewPatternData() {
17         this->unsubscribeEvent(Events::PatternChanged);
18     }
19 
beginPatternDataTable(prv::Provider * & provider,const std::vector<lang::PatternData * > & patterns,std::vector<lang::PatternData * > & sortedPatterns)20     static bool beginPatternDataTable(prv::Provider* &provider, const std::vector<lang::PatternData*> &patterns, std::vector<lang::PatternData*> &sortedPatterns) {
21         if (ImGui::BeginTable("##patterndatatable", 6, ImGuiTableFlags_Borders | ImGuiTableFlags_Resizable | ImGuiTableFlags_Sortable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_RowBg | ImGuiTableFlags_ScrollY)) {
22             ImGui::TableSetupScrollFreeze(0, 1);
23             ImGui::TableSetupColumn("hex.view.pattern_data.name"_lang, 0, -1, ImGui::GetID("name"));
24             ImGui::TableSetupColumn("hex.view.pattern_data.color"_lang, 0, -1, ImGui::GetID("color"));
25             ImGui::TableSetupColumn("hex.view.pattern_data.offset"_lang, 0, -1, ImGui::GetID("offset"));
26             ImGui::TableSetupColumn("hex.view.pattern_data.size"_lang, 0, -1, ImGui::GetID("size"));
27             ImGui::TableSetupColumn("hex.view.pattern_data.type"_lang, 0, -1, ImGui::GetID("type"));
28             ImGui::TableSetupColumn("hex.view.pattern_data.value"_lang, 0, -1, ImGui::GetID("value"));
29 
30             auto sortSpecs = ImGui::TableGetSortSpecs();
31 
32             if (sortSpecs->SpecsDirty || sortedPatterns.empty()) {
33                 sortedPatterns = patterns;
34 
35                 std::sort(sortedPatterns.begin(), sortedPatterns.end(), [&sortSpecs, &provider](lang::PatternData* left, lang::PatternData* right) -> bool {
36                     return lang::PatternData::sortPatternDataTable(sortSpecs, provider, left, right);
37                 });
38 
39                 for (auto &pattern : sortedPatterns)
40                     pattern->sort(sortSpecs, provider);
41 
42                 sortSpecs->SpecsDirty = false;
43             }
44 
45             return true;
46         }
47 
48         return false;
49     }
50 
drawContent()51     void ViewPatternData::drawContent() {
52         if (ImGui::Begin("hex.view.pattern_data.title"_lang, &this->getWindowOpenState(), ImGuiWindowFlags_NoCollapse)) {
53             auto provider = SharedData::currentProvider;
54             if (provider != nullptr && provider->isReadable()) {
55 
56                 if (beginPatternDataTable(provider, this->m_patternData, this->m_sortedPatternData)) {
57                     ImGui::TableHeadersRow();
58                     if (this->m_sortedPatternData.size() > 0) {
59 
60                         for (auto &patternData : this->m_sortedPatternData)
61                             patternData->createEntry(provider);
62 
63                     }
64 
65                     ImGui::EndTable();
66                 }
67 
68             }
69         }
70         ImGui::End();
71     }
72 
drawMenu()73     void ViewPatternData::drawMenu() {
74 
75     }
76 
77 }