From 994df0a3a4a82464c2cc0024d219dc2d6458d08a Mon Sep 17 00:00:00 2001 From: WerWolv Date: Sun, 7 Dec 2025 22:17:57 +0100 Subject: [PATCH] feat: Add shortcut to directly search for the selected bytes --- plugins/builtin/romfs/lang/en_US.json | 1 + .../source/content/views/view_find.cpp | 44 +++++++++++++++---- 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/plugins/builtin/romfs/lang/en_US.json b/plugins/builtin/romfs/lang/en_US.json index 75b3ad9de..32354e908 100644 --- a/plugins/builtin/romfs/lang/en_US.json +++ b/plugins/builtin/romfs/lang/en_US.json @@ -123,6 +123,7 @@ "hex.builtin.layouts.none.restore_default": "Restore default layout", "hex.builtin.menu.edit": "Edit", "hex.builtin.menu.edit.bookmark.create": "Create Bookmark", + "hex.builtin.menu.edit.find.find_selection": "Find occurrences", "hex.builtin.view.hex_editor.menu.edit.redo": "Redo", "hex.builtin.view.hex_editor.menu.edit.undo": "Undo", "hex.builtin.menu.extras": "Extras", diff --git a/plugins/builtin/source/content/views/view_find.cpp b/plugins/builtin/source/content/views/view_find.cpp index 67384c6a8..4434e9882 100644 --- a/plugins/builtin/source/content/views/view_find.cpp +++ b/plugins/builtin/source/content/views/view_find.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -18,6 +19,7 @@ #include #include +#include #include #include @@ -113,6 +115,32 @@ namespace hex::plugin::builtin { for (auto &occurrence : *m_sortedOccurrences) occurrence.selected = true; }); + + /* Find Selection */ + ContentRegistry::UserInterface::addMenuItem({ "hex.builtin.menu.edit", "hex.builtin.menu.edit.find.find_selection" }, ICON_VS_SEARCH_SPARKLE, 1950, CTRLCMD + SHIFT + Keys::F, [&] { + auto selection = ImHexApi::HexEditor::getSelection(); + if (!selection.has_value()) + return; + + std::string sequence; + { + std::vector buffer(selection->getSize()); + selection->getProvider()->read(selection->getStartAddress(), buffer.data(), buffer.size()); + sequence = hex::crypt::encode16(buffer); + } + + m_searchSettings.mode = SearchSettings::Mode::BinaryPattern; + m_searchSettings.region = { selection->getProvider()->getBaseAddress(), selection->getProvider()->getActualSize() }; + m_searchSettings.binaryPattern = { + .input = sequence, + .pattern = hex::BinaryPattern(sequence), + .alignment = 1 + }; + + this->runSearch(); + this->bringToFront(); + }, []{ return ImHexApi::Provider::isValid() && ImHexApi::HexEditor::isSelectionValid(); }, + ContentRegistry::Views::getViewByName("hex.builtin.view.hex_editor.name")); } template @@ -701,6 +729,14 @@ namespace hex::plugin::builtin { m_settingsCollapsed.get(provider) = !m_foundOccurrences->empty(); }); }); + + m_decodeSettings = m_searchSettings; + m_foundOccurrences->clear(); + m_sortedOccurrences->clear(); + m_occurrenceTree->clear(); + m_lastSelectedOccurrence = nullptr; + + EventHighlightingChanged::post(); } std::string ViewFind::decodeValue(prv::Provider *provider, const Occurrence &occurrence, size_t maxBytes) const { @@ -1079,14 +1115,6 @@ namespace hex::plugin::builtin { { if (ImGuiExt::DimmedIconButton(ICON_VS_SEARCH, ImGui::GetStyleColorVec4(ImGuiCol_Text))) { this->runSearch(); - - m_decodeSettings = m_searchSettings; - m_foundOccurrences->clear(); - m_sortedOccurrences->clear(); - m_occurrenceTree->clear(); - m_lastSelectedOccurrence = nullptr; - - EventHighlightingChanged::post(); } ImGui::SetItemTooltip("%s", "hex.builtin.view.find.search"_lang.get()); }