From da11c47693f1db7704a9c03277a4c37741908cb7 Mon Sep 17 00:00:00 2001 From: WerWolv Date: Wed, 21 Jun 2023 17:48:51 +0200 Subject: [PATCH] impr: Better sorting of hex cell visualizers --- .../include/hex/api/content_registry.hpp | 14 ++++++++++---- lib/libimhex/source/api/content_registry.cpp | 17 +++++++++++++---- main/source/init/tasks.cpp | 7 +------ plugins/builtin/include/ui/hex_editor.hpp | 2 +- plugins/builtin/source/ui/hex_editor.cpp | 7 +++---- 5 files changed, 28 insertions(+), 19 deletions(-) diff --git a/lib/libimhex/include/hex/api/content_registry.hpp b/lib/libimhex/include/hex/api/content_registry.hpp index 0c019c3b0..de03e02f9 100644 --- a/lib/libimhex/include/hex/api/content_registry.hpp +++ b/lib/libimhex/include/hex/api/content_registry.hpp @@ -723,9 +723,9 @@ namespace hex { namespace impl { - void addDataVisualizer(const std::string &unlocalizedName, DataVisualizer *visualizer); + void addDataVisualizer(std::shared_ptr &&visualizer); - std::map &getVisualizers(); + std::vector> &getVisualizers(); } @@ -737,10 +737,16 @@ namespace hex { */ template T, typename... Args> void addDataVisualizer(Args &&...args) { - auto visualizer = new T(std::forward(args)...); - return impl::addDataVisualizer(visualizer->getUnlocalizedName(), visualizer); + return impl::addDataVisualizer(std::make_shared(std::forward(args)...)); } + /** + * @brief Gets a data visualizer by its unlocalized nameb + * @param unlocalizedName Unlocalized name of the data visualizer + * @return The data visualizer, or nullptr if it doesn't exist + */ + std::shared_ptr getVisualizerByName(const std::string &unlocalizedName); + } /* Hash Registry. Allows adding new hashes to the Hash view */ diff --git a/lib/libimhex/source/api/content_registry.cpp b/lib/libimhex/source/api/content_registry.cpp index 2e73c5cc3..f25fe6c96 100644 --- a/lib/libimhex/source/api/content_registry.cpp +++ b/lib/libimhex/source/api/content_registry.cpp @@ -754,19 +754,28 @@ namespace hex { namespace impl { - void addDataVisualizer(const std::string &unlocalizedName, DataVisualizer *visualizer) { - getVisualizers().insert({ unlocalizedName, visualizer }); + void addDataVisualizer(std::shared_ptr &&visualizer) { + getVisualizers().emplace_back(std::move(visualizer)); } - std::map &getVisualizers() { - static std::map visualizers; + std::vector> &getVisualizers() { + static std::vector> visualizers; return visualizers; } } + std::shared_ptr getVisualizerByName(const std::string &unlocalizedName) { + for (const auto &visualizer : impl::getVisualizers()) { + if (visualizer->getUnlocalizedName() == unlocalizedName) + return visualizer; + } + + return nullptr; + } + } diff --git a/main/source/init/tasks.cpp b/main/source/init/tasks.cpp index af01c9211..be00a966f 100644 --- a/main/source/init/tasks.cpp +++ b/main/source/init/tasks.cpp @@ -364,6 +364,7 @@ namespace hex::init { ContentRegistry::DataFormatter::impl::getEntries().clear(); ContentRegistry::FileHandler::impl::getEntries().clear(); ContentRegistry::Hashes::impl::getHashes().clear(); + ContentRegistry::HexEditor::impl::getVisualizers().clear(); ContentRegistry::BackgroundServices::impl::stopServices(); ContentRegistry::BackgroundServices::impl::getServices().clear(); @@ -374,12 +375,6 @@ namespace hex::init { ThemeManager::reset(); - { - auto &visualizers = ContentRegistry::HexEditor::impl::getVisualizers(); - for (auto &[name, visualizer] : visualizers) - delete visualizer; - visualizers.clear(); - } ProjectFile::getHandlers().clear(); ProjectFile::getProviderHandlers().clear(); diff --git a/plugins/builtin/include/ui/hex_editor.hpp b/plugins/builtin/include/ui/hex_editor.hpp index 36adceb7f..559e74f64 100644 --- a/plugins/builtin/include/ui/hex_editor.hpp +++ b/plugins/builtin/include/ui/hex_editor.hpp @@ -192,7 +192,7 @@ namespace hex::plugin::builtin::ui { float m_scrollPosition = 0; u16 m_bytesPerRow = 16; - ContentRegistry::HexEditor::DataVisualizer *m_currDataVisualizer; + std::shared_ptr m_currDataVisualizer; char m_unknownDataCharacter = '?'; bool m_shouldJumpToSelection = false; diff --git a/plugins/builtin/source/ui/hex_editor.cpp b/plugins/builtin/source/ui/hex_editor.cpp index a28b45c68..953704469 100644 --- a/plugins/builtin/source/ui/hex_editor.cpp +++ b/plugins/builtin/source/ui/hex_editor.cpp @@ -1,6 +1,5 @@ #include -#include #include #include @@ -71,7 +70,7 @@ namespace hex::plugin::builtin::ui { /* Hex Editor */ HexEditor::HexEditor(prv::Provider *provider) : m_provider(provider) { - this->m_currDataVisualizer = ContentRegistry::HexEditor::impl::getVisualizers()["hex.builtin.visualizer.hexadecimal.8bit"]; + this->m_currDataVisualizer = ContentRegistry::HexEditor::getVisualizerByName("hex.builtin.visualizer.hexadecimal.8bit"); EventManager::subscribe(this, [this] { { @@ -802,8 +801,8 @@ namespace hex::plugin::builtin::ui { ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x); if (ImGui::BeginCombo("##visualizer", LangEntry(this->m_currDataVisualizer->getUnlocalizedName()))) { - for (const auto &[unlocalizedName, visualizer] : visualizers) { - if (ImGui::Selectable(LangEntry(unlocalizedName))) { + for (const auto &visualizer : visualizers) { + if (ImGui::Selectable(LangEntry(visualizer->getUnlocalizedName()))) { this->m_currDataVisualizer = visualizer; } }