From d4df465633f01b8449035ef700e238eadccd0d83 Mon Sep 17 00:00:00 2001 From: WerWolv Date: Tue, 2 Dec 2025 23:02:44 +0100 Subject: [PATCH] feat: Replace useless constants view with a constant search option in the Find view --- .../api/content_registry/data_formatter.hpp | 3 +- plugins/builtin/CMakeLists.txt | 3 +- .../include/content/helpers/constants.hpp | 27 ++++ .../include/content/views/view_constants.hpp | 38 ----- .../include/content/views/view_find.hpp | 8 +- .../auto_extract/workspaces/default.hexws | 2 +- .../auto_extract/workspaces/minimal.hexws | 2 +- plugins/builtin/romfs/lang/de_DE.json | 6 +- plugins/builtin/romfs/lang/en_US.json | 7 +- plugins/builtin/romfs/lang/es_ES.json | 6 +- plugins/builtin/romfs/lang/fr_FR.json | 6 +- plugins/builtin/romfs/lang/hu_HU.json | 6 +- plugins/builtin/romfs/lang/it_IT.json | 6 +- plugins/builtin/romfs/lang/ja_JP.json | 6 +- plugins/builtin/romfs/lang/ko_KR.json | 6 +- plugins/builtin/romfs/lang/pl_PL.json | 6 +- plugins/builtin/romfs/lang/pt_BR.json | 6 +- plugins/builtin/romfs/lang/ru_RU.json | 6 +- plugins/builtin/romfs/lang/uk_UA.json | 6 +- plugins/builtin/romfs/lang/zh_CN.json | 6 +- plugins/builtin/romfs/lang/zh_TW.json | 6 +- plugins/builtin/romfs/layouts/default.hexlyt | 6 - plugins/builtin/romfs/layouts/minimal.hexlyt | 6 - .../source/content/helpers/constants.cpp | 37 +++++ plugins/builtin/source/content/views.cpp | 2 - .../source/content/views/view_constants.cpp | 152 ------------------ .../source/content/views/view_find.cpp | 138 ++++++++++++++-- 27 files changed, 218 insertions(+), 291 deletions(-) create mode 100644 plugins/builtin/include/content/helpers/constants.hpp delete mode 100644 plugins/builtin/include/content/views/view_constants.hpp create mode 100644 plugins/builtin/source/content/helpers/constants.cpp delete mode 100644 plugins/builtin/source/content/views/view_constants.cpp diff --git a/lib/libimhex/include/hex/api/content_registry/data_formatter.hpp b/lib/libimhex/include/hex/api/content_registry/data_formatter.hpp index b3bd2a0fa..9c52b1107 100644 --- a/lib/libimhex/include/hex/api/content_registry/data_formatter.hpp +++ b/lib/libimhex/include/hex/api/content_registry/data_formatter.hpp @@ -27,9 +27,10 @@ EXPORT_MODULE namespace hex { struct FindOccurrence { Region region; - enum class DecodeType { ASCII, UTF8, Binary, UTF16, Unsigned, Signed, Float, Double } decodeType; std::endian endian = std::endian::native; + enum class DecodeType : u8 { ASCII, UTF8, Binary, UTF16, Unsigned, Signed, Float, Double } decodeType; bool selected; + std::string string; }; using FindExporterCallback = std::function(const std::vector&, std::function)>; diff --git a/plugins/builtin/CMakeLists.txt b/plugins/builtin/CMakeLists.txt index 6faea9c60..499cfe79a 100644 --- a/plugins/builtin/CMakeLists.txt +++ b/plugins/builtin/CMakeLists.txt @@ -109,7 +109,6 @@ add_imhex_plugin( source/content/views/view_command_palette.cpp source/content/views/view_settings.cpp source/content/views/view_data_processor.cpp - source/content/views/view_constants.cpp source/content/views/view_store.cpp source/content/views/view_provider_settings.cpp source/content/views/view_find.cpp @@ -123,6 +122,8 @@ add_imhex_plugin( source/content/views/fullscreen/view_fullscreen_file_info.cpp source/content/text_highlighting/pattern_language.cpp + + source/content/helpers/constants.cpp INCLUDES include diff --git a/plugins/builtin/include/content/helpers/constants.hpp b/plugins/builtin/include/content/helpers/constants.hpp new file mode 100644 index 000000000..f55c57462 --- /dev/null +++ b/plugins/builtin/include/content/helpers/constants.hpp @@ -0,0 +1,27 @@ +#pragma once + +#include +#include + +#include + +namespace hex::plugin::builtin { + + struct Constant { + std::string name; + std::string description; + BinaryPattern value; + }; + + class ConstantGroup { + public: + explicit ConstantGroup(const std::fs::path &path); + + [[nodiscard]] const std::string& getName() const { return m_name; } + const std::vector& getConstants() const { return m_constants; } + private: + std::string m_name; + std::vector m_constants; + }; + +} \ No newline at end of file diff --git a/plugins/builtin/include/content/views/view_constants.hpp b/plugins/builtin/include/content/views/view_constants.hpp deleted file mode 100644 index f9334e3e3..000000000 --- a/plugins/builtin/include/content/views/view_constants.hpp +++ /dev/null @@ -1,38 +0,0 @@ -#pragma once - -#include - -#include - -namespace hex::plugin::builtin { - - enum class ConstantType - { - Int10, - Int16BigEndian, - Int16LittleEndian - }; - - struct Constant { - std::string name, description; - std::string category; - ConstantType type; - std::string value; - }; - - class ViewConstants : public View::Window { - public: - explicit ViewConstants(); - ~ViewConstants() override = default; - - void drawContent() override; - - private: - void reloadConstants(); - - std::vector m_constants; - std::vector m_filterIndices; - std::string m_filter; - }; - -} \ No newline at end of file diff --git a/plugins/builtin/include/content/views/view_find.hpp b/plugins/builtin/include/content/views/view_find.hpp index 89cf68125..0aefc5a5a 100644 --- a/plugins/builtin/include/content/views/view_find.hpp +++ b/plugins/builtin/include/content/views/view_find.hpp @@ -46,7 +46,8 @@ namespace hex::plugin::builtin { Sequence, Regex, BinaryPattern, - Value + Value, + Constants } mode = Mode::Strings; enum class StringType : int { ASCII = 0, UTF8 = 1, UTF16LE = 2, UTF16BE = 3, ASCII_UTF16LE = 4, ASCII_UTF16BE = 5 }; @@ -100,6 +101,10 @@ namespace hex::plugin::builtin { } type = Type::U8; } value; + struct Constants { + u32 alignment = 1; + } constants; + } m_searchSettings, m_decodeSettings; using OccurrenceTree = wolv::container::IntervalTree; @@ -120,6 +125,7 @@ namespace hex::plugin::builtin { static std::vector searchRegex(Task &task, prv::Provider *provider, Region searchRegion, const SearchSettings::Regex &settings); static std::vector searchBinaryPattern(Task &task, prv::Provider *provider, Region searchRegion, const SearchSettings::BinaryPattern &settings); static std::vector searchValue(Task &task, prv::Provider *provider, Region searchRegion, const SearchSettings::Value &settings); + static std::vector searchConstants(Task &task, prv::Provider *provider, Region searchRegion, const SearchSettings::Constants &settings); void drawContextMenu(Occurrence &target, const std::string &value); diff --git a/plugins/builtin/romfs/auto_extract/workspaces/default.hexws b/plugins/builtin/romfs/auto_extract/workspaces/default.hexws index 87c4ff62f..b9aaadf67 100644 --- a/plugins/builtin/romfs/auto_extract/workspaces/default.hexws +++ b/plugins/builtin/romfs/auto_extract/workspaces/default.hexws @@ -1,5 +1,5 @@ { - "layout": "[Window][ImHexDockSpace]\nPos=0,19\nSize=1393,765\nCollapsed=0\n\n[Window][Debug##Default]\nPos=0,55\nSize=400,400\nCollapsed=0\n\n[Window][###hex.builtin.view.settings.name]\nPos=346,191\nSize=700,400\nCollapsed=0\n\n[Window][Question]\nPos=496,338\nSize=400,105\nCollapsed=0\n\n[Window][Welcome Screen]\nPos=0,37\nSize=1393,728\nCollapsed=0\n\n[Window][###hex.builtin.view.hex_editor.name]\nPos=0,38\nSize=619,468\nCollapsed=0\nDockId=0x00000007,0\n\n[Window][###hex.builtin.view.data_inspector.name]\nPos=621,38\nSize=124,468\nCollapsed=0\nDockId=0x00000008,0\n\n[Window][###hex.builtin.view.pattern_data.name]\nPos=0,508\nSize=745,252\nCollapsed=0\nDockId=0x00000006,0\n\n[Window][###hex.builtin.view.pattern_editor.name]\nPos=747,38\nSize=646,722\nCollapsed=0\nDockId=0x00000009,0\n\n[Window][###hex.hashes.view.hashes.name]\nPos=1697,76\nSize=863,1427\nCollapsed=0\nDockId=0x00000009,4\n\n[Window][###hex.builtin.view.find.name]\nPos=1697,76\nSize=863,1427\nCollapsed=0\nDockId=0x00000009,3\n\n[Window][###hex.builtin.view.bookmarks.name]\nPos=1697,76\nSize=863,1427\nCollapsed=0\nDockId=0x00000009,2\n\n[Window][###hex.builtin.view.information.name]\nPos=-1889,-120\nSize=510,420\nCollapsed=0\n\n[Window][###hex.yara_rules.view.yara.name]\nPos=720,38\nSize=560,660\nCollapsed=0\n\n[Window][###hex.builtin.view.store.name]\nViewportPos=564,236\nViewportId=0xB51F9C4A\nSize=900,700\nCollapsed=0\n\n[Window][###hex.diffing.view.diff.name]\nPos=1372,38\nSize=1188,1333\nCollapsed=0\nDockId=0x00000009,1\n\n[Window][###hex.builtin.view.provider_settings.load_popup]\nPos=585,322\nSize=314,208\nCollapsed=0\n\n[Window][###hex.builtin.view.patches.name]\nPos=-1889,-120\nSize=510,420\nCollapsed=0\n\n[Window][###hex.builtin.view.data_processor.name]\nPos=747,38\nSize=646,722\nCollapsed=0\nDockId=0x00000009,1\n\n[Window][###hex.builtin.view.tools.name]\nPos=849,268\nSize=431,430\nCollapsed=0\nDockId=0x0000000A,0\n\n[Window][###hex.builtin.view.theme_manager.name]\nPos=391,302\nSize=469,400\nCollapsed=0\n\n[Window][###hex.builtin.tools.invariant_multiplication]\nPos=-1826,300\nSize=600,232\nCollapsed=0\n\n[Window][###hex.builtin.tools.regex_replacer]\nPos=-2091,104\nSize=600,305\nCollapsed=0\n\n[Window][###hex.builtin.tools.calc]\nPos=-1811,118\nSize=600,402\nCollapsed=0\n\n[Window][###hex.builtin.tools.permissions]\nPos=423,296\nSize=600,220\nCollapsed=0\n\n[Window][###hex.builtin.view.help.about.name]\nPos=377,193\nSize=677,400\nCollapsed=0\n\n[Window][###hex.builtin.view.constants.name]\nPos=419,-124\nSize=652,660\nCollapsed=0\n\n[Window][###hex.disassembler.view.disassembler.name]\nPos=1004,-204\nSize=1336,1320\nCollapsed=0\n\n[Window][##achievement_unlocked]\nPos=1093,0\nSize=200,55\nCollapsed=0\n\n[Window][hex.builtin.popup.blocking_task.title]\nPos=506,305\nSize=20,40\nCollapsed=0\n\n[Window][Waiting for Tasks]\nPos=60,60\nSize=16,35\nCollapsed=0\n\n[Window][Restore lost data]\nPos=555,349\nSize=283,84\nCollapsed=0\n\n[Window][Error]\nPos=440,301\nSize=400,118\nCollapsed=0\n\n[Window][###hex.builtin.view.highlight_rules.name]\nViewportPos=724,217\nViewportId=0x31C07F88\nSize=700,400\nCollapsed=0\n\n[Window][SideBarWindow]\nPos=19,37\nSize=660,1345\nCollapsed=0\n\n[Window][SideBarWindow/##Content_53A061AE]\nIsChild=1\nSize=644,1329\n\n[Window][Choose file]\nPos=382,131\nSize=516,458\nCollapsed=0\n\n[Window][###hex.builtin.view.logs.name]\nPos=60,60\nSize=549,466\nCollapsed=0\n\n[Window][###hex.builtin.view.achievements.name]\nPos=60,60\nSize=800,600\nCollapsed=0\n\n[Window][hex.builtin.welcome.start.recent.auto_backups]\nPos=580,365\nSize=233,52\nCollapsed=0\n\n[Window][Auto Backups]\nPos=580,331\nSize=233,120\nCollapsed=0\n\n[Window][hex.builtin.popup.create_workspace.title]\nPos=496,325\nSize=400,132\nCollapsed=0\n\n[Table][0x6A4694E4,3]\nRefScale=13\nColumn 0 Sort=0v\n\n[Table][0x7EE28D79,8]\nRefScale=13\nColumn 0 Width=13\nColumn 1 Weight=1.0000\nColumn 2 Weight=1.0000\nColumn 3 Weight=1.0000 Sort=0v\nColumn 4 Weight=1.0000\nColumn 5 Weight=1.0000\nColumn 6 Weight=1.0000\nColumn 7 Weight=1.0000\n\n[Table][0x6190819E,3]\nColumn 0 Weight=1.0000\nColumn 1 Weight=1.0000\nColumn 2 Weight=1.0000\n\n[Docking][Data]\nDockSpace ID=0x81A8BB71 Window=0xF9B0A590 Pos=225,133 Size=1393,722 Split=X\n DockNode ID=0x00000001 Parent=0x81A8BB71 SizeRef=1370,0 Split=Y\n DockNode ID=0x00000005 Parent=0x00000001 SizeRef=0,825 Split=X Selected=0x5708C63F\n DockNode ID=0x00000007 Parent=0x00000005 SizeRef=1140,701 Selected=0x5708C63F\n DockNode ID=0x00000008 Parent=0x00000005 SizeRef=228,701 Selected=0xFBA7A393\n DockNode ID=0x00000006 Parent=0x00000001 SizeRef=0,444 Selected=0x7AD1CDDD\n DockNode ID=0x00000002 Parent=0x81A8BB71 SizeRef=1188,0 Split=X\n DockNode ID=0x00000003 Parent=0x00000002 SizeRef=12,0\n DockNode ID=0x00000004 Parent=0x00000002 SizeRef=52,0 Split=Y Selected=0xCACA884B\n DockNode ID=0x00000009 Parent=0x00000004 SizeRef=420,228 Selected=0xCACA884B\n DockNode ID=0x0000000A Parent=0x00000004 SizeRef=420,430 Selected=0x1F041AD3\n\n[ImHex][General]\nhex.builtin.view.achievements.name=0\nhex.builtin.view.bookmarks.name=0\nhex.builtin.view.command_palette.name=0\nhex.builtin.view.constants.name=0\nhex.builtin.view.data_inspector.name=1\nhex.builtin.view.data_processor.name=1\nhex.diffing.view.diff.name=0\nhex.disassembler.view.disassembler.name=0\nhex.builtin.view.find.name=0\nhex.hashes.view.hashes.name=0\nhex.builtin.view.help.about.name=0\nhex.builtin.view.hex_editor.name=1\nhex.builtin.view.highlight_rules.name=0\nhex.builtin.view.information.name=0\nhex.builtin.view.logs.name=0\nhex.builtin.view.patches.name=0\nhex.builtin.view.pattern_data.name=1\nhex.builtin.view.pattern_editor.name=1\nhex.builtin.view.provider_settings.name=0\nhex.builtin.view.settings.name=0\nhex.builtin.view.store.name=0\nhex.builtin.view.theme_manager.name=0\nhex.builtin.view.tools.name=0\nhex.yara_rules.view.yara.name=0\nhex.windows.view.tty_console.name=0\nhex.builtin.tools.demangler=0\nhex.builtin.tools.ascii_table=0\nhex.builtin.tools.regex_replacer=0\nhex.builtin.tools.color=0\nhex.builtin.tools.calc=0\nhex.builtin.tools.graphing=0\nhex.builtin.tools.base_converter=0\nhex.builtin.tools.byte_swapper=0\nhex.builtin.tools.permissions=0\nhex.builtin.tools.wiki_explain=0\nhex.builtin.tools.file_tools=0\nhex.builtin.tools.ieee754=0\nhex.builtin.tools.invariant_multiplication=0\nhex.builtin.tools.tcp_client_server=0\nhex.builtin.tools.euclidean_algorithm=0\n\n", + "layout": "[Window][ImHexDockSpace]\nPos=0,19\nSize=1393,765\nCollapsed=0\n\n[Window][Debug##Default]\nPos=0,55\nSize=400,400\nCollapsed=0\n\n[Window][###hex.builtin.view.settings.name]\nPos=346,191\nSize=700,400\nCollapsed=0\n\n[Window][Question]\nPos=496,338\nSize=400,105\nCollapsed=0\n\n[Window][Welcome Screen]\nPos=0,37\nSize=1393,728\nCollapsed=0\n\n[Window][###hex.builtin.view.hex_editor.name]\nPos=0,38\nSize=619,468\nCollapsed=0\nDockId=0x00000007,0\n\n[Window][###hex.builtin.view.data_inspector.name]\nPos=621,38\nSize=124,468\nCollapsed=0\nDockId=0x00000008,0\n\n[Window][###hex.builtin.view.pattern_data.name]\nPos=0,508\nSize=745,252\nCollapsed=0\nDockId=0x00000006,0\n\n[Window][###hex.builtin.view.pattern_editor.name]\nPos=747,38\nSize=646,722\nCollapsed=0\nDockId=0x00000009,0\n\n[Window][###hex.hashes.view.hashes.name]\nPos=1697,76\nSize=863,1427\nCollapsed=0\nDockId=0x00000009,4\n\n[Window][###hex.builtin.view.find.name]\nPos=1697,76\nSize=863,1427\nCollapsed=0\nDockId=0x00000009,3\n\n[Window][###hex.builtin.view.bookmarks.name]\nPos=1697,76\nSize=863,1427\nCollapsed=0\nDockId=0x00000009,2\n\n[Window][###hex.builtin.view.information.name]\nPos=-1889,-120\nSize=510,420\nCollapsed=0\n\n[Window][###hex.yara_rules.view.yara.name]\nPos=720,38\nSize=560,660\nCollapsed=0\n\n[Window][###hex.builtin.view.store.name]\nViewportPos=564,236\nViewportId=0xB51F9C4A\nSize=900,700\nCollapsed=0\n\n[Window][###hex.diffing.view.diff.name]\nPos=1372,38\nSize=1188,1333\nCollapsed=0\nDockId=0x00000009,1\n\n[Window][###hex.builtin.view.provider_settings.load_popup]\nPos=585,322\nSize=314,208\nCollapsed=0\n\n[Window][###hex.builtin.view.patches.name]\nPos=-1889,-120\nSize=510,420\nCollapsed=0\n\n[Window][###hex.builtin.view.data_processor.name]\nPos=747,38\nSize=646,722\nCollapsed=0\nDockId=0x00000009,1\n\n[Window][###hex.builtin.view.tools.name]\nPos=849,268\nSize=431,430\nCollapsed=0\nDockId=0x0000000A,0\n\n[Window][###hex.builtin.view.theme_manager.name]\nPos=391,302\nSize=469,400\nCollapsed=0\n\n[Window][###hex.builtin.tools.invariant_multiplication]\nPos=-1826,300\nSize=600,232\nCollapsed=0\n\n[Window][###hex.builtin.tools.regex_replacer]\nPos=-2091,104\nSize=600,305\nCollapsed=0\n\n[Window][###hex.builtin.tools.calc]\nPos=-1811,118\nSize=600,402\nCollapsed=0\n\n[Window][###hex.builtin.tools.permissions]\nPos=423,296\nSize=600,220\nCollapsed=0\n\n[Window][###hex.builtin.view.help.about.name]\nPos=377,193\nSize=677,400\nCollapsed=0\n\n[Window][###hex.disassembler.view.disassembler.name]\nPos=1004,-204\nSize=1336,1320\nCollapsed=0\n\n[Window][##achievement_unlocked]\nPos=1093,0\nSize=200,55\nCollapsed=0\n\n[Window][hex.builtin.popup.blocking_task.title]\nPos=506,305\nSize=20,40\nCollapsed=0\n\n[Window][Waiting for Tasks]\nPos=60,60\nSize=16,35\nCollapsed=0\n\n[Window][Restore lost data]\nPos=555,349\nSize=283,84\nCollapsed=0\n\n[Window][Error]\nPos=440,301\nSize=400,118\nCollapsed=0\n\n[Window][###hex.builtin.view.highlight_rules.name]\nViewportPos=724,217\nViewportId=0x31C07F88\nSize=700,400\nCollapsed=0\n\n[Window][SideBarWindow]\nPos=19,37\nSize=660,1345\nCollapsed=0\n\n[Window][SideBarWindow/##Content_53A061AE]\nIsChild=1\nSize=644,1329\n\n[Window][Choose file]\nPos=382,131\nSize=516,458\nCollapsed=0\n\n[Window][###hex.builtin.view.logs.name]\nPos=60,60\nSize=549,466\nCollapsed=0\n\n[Window][###hex.builtin.view.achievements.name]\nPos=60,60\nSize=800,600\nCollapsed=0\n\n[Window][hex.builtin.welcome.start.recent.auto_backups]\nPos=580,365\nSize=233,52\nCollapsed=0\n\n[Window][Auto Backups]\nPos=580,331\nSize=233,120\nCollapsed=0\n\n[Window][hex.builtin.popup.create_workspace.title]\nPos=496,325\nSize=400,132\nCollapsed=0\n\n[Table][0x6A4694E4,3]\nRefScale=13\nColumn 0 Sort=0v\n\n[Table][0x7EE28D79,8]\nRefScale=13\nColumn 0 Width=13\nColumn 1 Weight=1.0000\nColumn 2 Weight=1.0000\nColumn 3 Weight=1.0000 Sort=0v\nColumn 4 Weight=1.0000\nColumn 5 Weight=1.0000\nColumn 6 Weight=1.0000\nColumn 7 Weight=1.0000\n\n[Table][0x6190819E,3]\nColumn 0 Weight=1.0000\nColumn 1 Weight=1.0000\nColumn 2 Weight=1.0000\n\n[Docking][Data]\nDockSpace ID=0x81A8BB71 Window=0xF9B0A590 Pos=225,133 Size=1393,722 Split=X\n DockNode ID=0x00000001 Parent=0x81A8BB71 SizeRef=1370,0 Split=Y\n DockNode ID=0x00000005 Parent=0x00000001 SizeRef=0,825 Split=X Selected=0x5708C63F\n DockNode ID=0x00000007 Parent=0x00000005 SizeRef=1140,701 Selected=0x5708C63F\n DockNode ID=0x00000008 Parent=0x00000005 SizeRef=228,701 Selected=0xFBA7A393\n DockNode ID=0x00000006 Parent=0x00000001 SizeRef=0,444 Selected=0x7AD1CDDD\n DockNode ID=0x00000002 Parent=0x81A8BB71 SizeRef=1188,0 Split=X\n DockNode ID=0x00000003 Parent=0x00000002 SizeRef=12,0\n DockNode ID=0x00000004 Parent=0x00000002 SizeRef=52,0 Split=Y Selected=0xCACA884B\n DockNode ID=0x00000009 Parent=0x00000004 SizeRef=420,228 Selected=0xCACA884B\n DockNode ID=0x0000000A Parent=0x00000004 SizeRef=420,430 Selected=0x1F041AD3\n\n[ImHex][General]\nhex.builtin.view.achievements.name=0\nhex.builtin.view.bookmarks.name=0\nhex.builtin.view.command_palette.name=0\nhex.builtin.view.data_inspector.name=1\nhex.builtin.view.data_processor.name=1\nhex.diffing.view.diff.name=0\nhex.disassembler.view.disassembler.name=0\nhex.builtin.view.find.name=0\nhex.hashes.view.hashes.name=0\nhex.builtin.view.help.about.name=0\nhex.builtin.view.hex_editor.name=1\nhex.builtin.view.highlight_rules.name=0\nhex.builtin.view.information.name=0\nhex.builtin.view.logs.name=0\nhex.builtin.view.patches.name=0\nhex.builtin.view.pattern_data.name=1\nhex.builtin.view.pattern_editor.name=1\nhex.builtin.view.provider_settings.name=0\nhex.builtin.view.settings.name=0\nhex.builtin.view.store.name=0\nhex.builtin.view.theme_manager.name=0\nhex.builtin.view.tools.name=0\nhex.yara_rules.view.yara.name=0\nhex.windows.view.tty_console.name=0\nhex.builtin.tools.demangler=0\nhex.builtin.tools.ascii_table=0\nhex.builtin.tools.regex_replacer=0\nhex.builtin.tools.color=0\nhex.builtin.tools.calc=0\nhex.builtin.tools.graphing=0\nhex.builtin.tools.base_converter=0\nhex.builtin.tools.byte_swapper=0\nhex.builtin.tools.permissions=0\nhex.builtin.tools.wiki_explain=0\nhex.builtin.tools.file_tools=0\nhex.builtin.tools.ieee754=0\nhex.builtin.tools.invariant_multiplication=0\nhex.builtin.tools.tcp_client_server=0\nhex.builtin.tools.euclidean_algorithm=0\n\n", "name": "Default", "builtin": true } \ No newline at end of file diff --git a/plugins/builtin/romfs/auto_extract/workspaces/minimal.hexws b/plugins/builtin/romfs/auto_extract/workspaces/minimal.hexws index aaf14d535..8d6c3b54e 100644 --- a/plugins/builtin/romfs/auto_extract/workspaces/minimal.hexws +++ b/plugins/builtin/romfs/auto_extract/workspaces/minimal.hexws @@ -1,5 +1,5 @@ { - "layout": "[Window][ImHexDockSpace]\nPos=0,19\nSize=600,783\nCollapsed=0\n\n[Window][Debug##Default]\nPos=0,55\nSize=400,400\nCollapsed=0\n\n[Window][###hex.builtin.view.settings.name]\nPos=259,200\nSize=700,400\nCollapsed=0\n\n[Window][Question]\nPos=496,338\nSize=400,105\nCollapsed=0\n\n[Window][Welcome Screen]\nPos=0,37\nSize=1393,728\nCollapsed=0\n\n[Window][###hex.builtin.view.hex_editor.name]\nPos=0,38\nSize=600,740\nCollapsed=0\nDockId=0x00000007,0\n\n[Window][###hex.builtin.view.data_inspector.name]\nPos=1142,76\nSize=553,980\nCollapsed=0\nDockId=0x00000008,0\n\n[Window][###hex.builtin.view.pattern_data.name]\nPos=0,1058\nSize=1695,445\nCollapsed=0\nDockId=0x00000006,0\n\n[Window][###hex.builtin.view.pattern_editor.name]\nPos=1697,76\nSize=863,1427\nCollapsed=0\nDockId=0x00000004,0\n\n[Window][###hex.hashes.view.hashes.name]\nPos=1697,76\nSize=863,1427\nCollapsed=0\nDockId=0x00000004,4\n\n[Window][###hex.builtin.view.find.name]\nPos=1697,76\nSize=863,1427\nCollapsed=0\nDockId=0x00000004,3\n\n[Window][###hex.builtin.view.bookmarks.name]\nPos=1697,76\nSize=863,1427\nCollapsed=0\nDockId=0x00000004,2\n\n[Window][###hex.builtin.view.information.name]\nPos=-1889,-120\nSize=510,420\nCollapsed=0\n\n[Window][###hex.yara_rules.view.yara.name]\nPos=720,38\nSize=560,660\nCollapsed=0\n\n[Window][###hex.builtin.view.store.name]\nPos=562,201\nSize=900,700\nCollapsed=0\n\n[Window][###hex.diffing.view.diff.name]\nPos=1233,38\nSize=687,1021\nCollapsed=0\n\n[Window][###hex.builtin.view.provider_settings.load_popup]\nPos=585,322\nSize=314,208\nCollapsed=0\n\n[Window][###hex.builtin.view.patches.name]\nPos=-1889,-120\nSize=510,420\nCollapsed=0\n\n[Window][###hex.builtin.view.data_processor.name]\nPos=1697,76\nSize=863,1427\nCollapsed=0\nDockId=0x00000004,1\n\n[Window][###hex.builtin.view.tools.name]\nViewportPos=952,218\nViewportId=0x9B385D8A\nSize=1306,1600\nCollapsed=0\n\n[Window][###hex.builtin.view.theme_manager.name]\nPos=391,302\nSize=469,400\nCollapsed=0\n\n[Window][###hex.builtin.tools.invariant_multiplication]\nPos=-1826,300\nSize=600,232\nCollapsed=0\n\n[Window][###hex.builtin.tools.regex_replacer]\nPos=-2091,104\nSize=600,305\nCollapsed=0\n\n[Window][###hex.builtin.tools.calc]\nPos=-1811,118\nSize=600,402\nCollapsed=0\n\n[Window][###hex.builtin.tools.permissions]\nPos=423,296\nSize=600,220\nCollapsed=0\n\n[Window][###hex.builtin.view.help.about.name]\nPos=214,201\nSize=600,350\nCollapsed=0\n\n[Window][###hex.builtin.view.constants.name]\nPos=419,-124\nSize=652,660\nCollapsed=0\n\n[Window][###hex.disassembler.view.disassembler.name]\nPos=1004,-204\nSize=1336,1320\nCollapsed=0\n\n[Window][##achievement_unlocked]\nPos=1093,0\nSize=200,55\nCollapsed=0\n\n[Window][hex.builtin.popup.blocking_task.title]\nPos=506,305\nSize=20,40\nCollapsed=0\n\n[Window][Waiting for Tasks]\nPos=60,60\nSize=16,35\nCollapsed=0\n\n[Window][Restore lost data]\nPos=555,349\nSize=283,84\nCollapsed=0\n\n[Window][Error]\nPos=440,301\nSize=400,118\nCollapsed=0\n\n[Window][###hex.builtin.view.highlight_rules.name]\nViewportPos=724,217\nViewportId=0x31C07F88\nSize=700,400\nCollapsed=0\n\n[Window][SideBarWindow]\nPos=19,37\nSize=660,1345\nCollapsed=0\n\n[Window][SideBarWindow/##Content_53A061AE]\nIsChild=1\nSize=644,1329\n\n[Window][Choose file]\nPos=382,131\nSize=516,458\nCollapsed=0\n\n[Window][###hex.builtin.view.logs.name]\nPos=60,60\nSize=549,466\nCollapsed=0\n\n[Window][###hex.builtin.view.achievements.name]\nPos=60,60\nSize=800,600\nCollapsed=0\n\n[Window][hex.builtin.welcome.start.recent.auto_backups]\nPos=580,365\nSize=233,52\nCollapsed=0\n\n[Window][Auto Backups]\nPos=580,331\nSize=233,120\nCollapsed=0\n\n[Window][hex.builtin.popup.create_workspace.title]\nPos=100,334\nSize=400,132\nCollapsed=0\n\n[Table][0x6A4694E4,3]\nRefScale=13\nColumn 0 Sort=0v\n\n[Table][0x7EE28D79,8]\nRefScale=13\nColumn 0 Width=13\nColumn 1 Weight=1.0000\nColumn 2 Weight=1.0000\nColumn 3 Weight=1.0000 Sort=0v\nColumn 4 Weight=1.0000\nColumn 5 Weight=1.0000\nColumn 6 Weight=1.0000\nColumn 7 Weight=1.0000\n\n[Table][0x6190819E,3]\nColumn 0 Weight=1.0000\nColumn 1 Weight=1.0000\nColumn 2 Weight=1.0000\n\n[Docking][Data]\nDockSpace ID=0x81A8BB71 Window=0xF9B0A590 Pos=220,131 Size=600,740 Split=X\n DockNode ID=0x00000001 Parent=0x81A8BB71 SizeRef=847,0 Split=Y\n DockNode ID=0x00000005 Parent=0x00000001 SizeRef=0,44 Split=X Selected=0x5708C63F\n DockNode ID=0x00000007 Parent=0x00000005 SizeRef=1140,701 Selected=0x5708C63F\n DockNode ID=0x00000008 Parent=0x00000005 SizeRef=553,701 Selected=0xFBA7A393\n DockNode ID=0x00000006 Parent=0x00000001 SizeRef=0,20 Selected=0x7AD1CDDD\n DockNode ID=0x00000002 Parent=0x81A8BB71 SizeRef=431,0 Split=X\n DockNode ID=0x00000003 Parent=0x00000002 SizeRef=12,0\n DockNode ID=0x00000004 Parent=0x00000002 SizeRef=52,0 Selected=0xCACA884B\n\n[ImHex][General]\nhex.builtin.view.achievements.name=0\nhex.builtin.view.bookmarks.name=0\nhex.builtin.view.command_palette.name=0\nhex.builtin.view.constants.name=0\nhex.builtin.view.data_inspector.name=0\nhex.builtin.view.data_processor.name=0\nhex.diffing.view.diff.name=0\nhex.disassembler.view.disassembler.name=0\nhex.builtin.view.find.name=0\nhex.hashes.view.hashes.name=0\nhex.builtin.view.help.about.name=0\nhex.builtin.view.hex_editor.name=1\nhex.builtin.view.highlight_rules.name=0\nhex.builtin.view.information.name=0\nhex.builtin.view.logs.name=0\nhex.builtin.view.patches.name=0\nhex.builtin.view.pattern_data.name=0\nhex.builtin.view.pattern_editor.name=0\nhex.builtin.view.provider_settings.name=0\nhex.builtin.view.settings.name=0\nhex.builtin.view.store.name=0\nhex.builtin.view.theme_manager.name=0\nhex.builtin.view.tools.name=0\nhex.yara_rules.view.yara.name=0\nhex.windows.view.tty_console.name=0\nhex.builtin.tools.demangler=0\nhex.builtin.tools.ascii_table=0\nhex.builtin.tools.regex_replacer=0\nhex.builtin.tools.color=0\nhex.builtin.tools.calc=0\nhex.builtin.tools.graphing=0\nhex.builtin.tools.base_converter=0\nhex.builtin.tools.byte_swapper=0\nhex.builtin.tools.permissions=0\nhex.builtin.tools.wiki_explain=0\nhex.builtin.tools.file_tools=0\nhex.builtin.tools.ieee754=0\nhex.builtin.tools.invariant_multiplication=0\nhex.builtin.tools.tcp_client_server=0\nhex.builtin.tools.euclidean_algorithm=0\n\n", + "layout": "[Window][ImHexDockSpace]\nPos=0,19\nSize=600,783\nCollapsed=0\n\n[Window][Debug##Default]\nPos=0,55\nSize=400,400\nCollapsed=0\n\n[Window][###hex.builtin.view.settings.name]\nPos=259,200\nSize=700,400\nCollapsed=0\n\n[Window][Question]\nPos=496,338\nSize=400,105\nCollapsed=0\n\n[Window][Welcome Screen]\nPos=0,37\nSize=1393,728\nCollapsed=0\n\n[Window][###hex.builtin.view.hex_editor.name]\nPos=0,38\nSize=600,740\nCollapsed=0\nDockId=0x00000007,0\n\n[Window][###hex.builtin.view.data_inspector.name]\nPos=1142,76\nSize=553,980\nCollapsed=0\nDockId=0x00000008,0\n\n[Window][###hex.builtin.view.pattern_data.name]\nPos=0,1058\nSize=1695,445\nCollapsed=0\nDockId=0x00000006,0\n\n[Window][###hex.builtin.view.pattern_editor.name]\nPos=1697,76\nSize=863,1427\nCollapsed=0\nDockId=0x00000004,0\n\n[Window][###hex.hashes.view.hashes.name]\nPos=1697,76\nSize=863,1427\nCollapsed=0\nDockId=0x00000004,4\n\n[Window][###hex.builtin.view.find.name]\nPos=1697,76\nSize=863,1427\nCollapsed=0\nDockId=0x00000004,3\n\n[Window][###hex.builtin.view.bookmarks.name]\nPos=1697,76\nSize=863,1427\nCollapsed=0\nDockId=0x00000004,2\n\n[Window][###hex.builtin.view.information.name]\nPos=-1889,-120\nSize=510,420\nCollapsed=0\n\n[Window][###hex.yara_rules.view.yara.name]\nPos=720,38\nSize=560,660\nCollapsed=0\n\n[Window][###hex.builtin.view.store.name]\nPos=562,201\nSize=900,700\nCollapsed=0\n\n[Window][###hex.diffing.view.diff.name]\nPos=1233,38\nSize=687,1021\nCollapsed=0\n\n[Window][###hex.builtin.view.provider_settings.load_popup]\nPos=585,322\nSize=314,208\nCollapsed=0\n\n[Window][###hex.builtin.view.patches.name]\nPos=-1889,-120\nSize=510,420\nCollapsed=0\n\n[Window][###hex.builtin.view.data_processor.name]\nPos=1697,76\nSize=863,1427\nCollapsed=0\nDockId=0x00000004,1\n\n[Window][###hex.builtin.view.tools.name]\nViewportPos=952,218\nViewportId=0x9B385D8A\nSize=1306,1600\nCollapsed=0\n\n[Window][###hex.builtin.view.theme_manager.name]\nPos=391,302\nSize=469,400\nCollapsed=0\n\n[Window][###hex.builtin.tools.invariant_multiplication]\nPos=-1826,300\nSize=600,232\nCollapsed=0\n\n[Window][###hex.builtin.tools.regex_replacer]\nPos=-2091,104\nSize=600,305\nCollapsed=0\n\n[Window][###hex.builtin.tools.calc]\nPos=-1811,118\nSize=600,402\nCollapsed=0\n\n[Window][###hex.builtin.tools.permissions]\nPos=423,296\nSize=600,220\nCollapsed=0\n\n[Window][###hex.builtin.view.help.about.name]\nPos=214,201\nSize=600,350\nCollapsed=0\n\n[Window][###hex.disassembler.view.disassembler.name]\nPos=1004,-204\nSize=1336,1320\nCollapsed=0\n\n[Window][##achievement_unlocked]\nPos=1093,0\nSize=200,55\nCollapsed=0\n\n[Window][hex.builtin.popup.blocking_task.title]\nPos=506,305\nSize=20,40\nCollapsed=0\n\n[Window][Waiting for Tasks]\nPos=60,60\nSize=16,35\nCollapsed=0\n\n[Window][Restore lost data]\nPos=555,349\nSize=283,84\nCollapsed=0\n\n[Window][Error]\nPos=440,301\nSize=400,118\nCollapsed=0\n\n[Window][###hex.builtin.view.highlight_rules.name]\nViewportPos=724,217\nViewportId=0x31C07F88\nSize=700,400\nCollapsed=0\n\n[Window][SideBarWindow]\nPos=19,37\nSize=660,1345\nCollapsed=0\n\n[Window][SideBarWindow/##Content_53A061AE]\nIsChild=1\nSize=644,1329\n\n[Window][Choose file]\nPos=382,131\nSize=516,458\nCollapsed=0\n\n[Window][###hex.builtin.view.logs.name]\nPos=60,60\nSize=549,466\nCollapsed=0\n\n[Window][###hex.builtin.view.achievements.name]\nPos=60,60\nSize=800,600\nCollapsed=0\n\n[Window][hex.builtin.welcome.start.recent.auto_backups]\nPos=580,365\nSize=233,52\nCollapsed=0\n\n[Window][Auto Backups]\nPos=580,331\nSize=233,120\nCollapsed=0\n\n[Window][hex.builtin.popup.create_workspace.title]\nPos=100,334\nSize=400,132\nCollapsed=0\n\n[Table][0x6A4694E4,3]\nRefScale=13\nColumn 0 Sort=0v\n\n[Table][0x7EE28D79,8]\nRefScale=13\nColumn 0 Width=13\nColumn 1 Weight=1.0000\nColumn 2 Weight=1.0000\nColumn 3 Weight=1.0000 Sort=0v\nColumn 4 Weight=1.0000\nColumn 5 Weight=1.0000\nColumn 6 Weight=1.0000\nColumn 7 Weight=1.0000\n\n[Table][0x6190819E,3]\nColumn 0 Weight=1.0000\nColumn 1 Weight=1.0000\nColumn 2 Weight=1.0000\n\n[Docking][Data]\nDockSpace ID=0x81A8BB71 Window=0xF9B0A590 Pos=220,131 Size=600,740 Split=X\n DockNode ID=0x00000001 Parent=0x81A8BB71 SizeRef=847,0 Split=Y\n DockNode ID=0x00000005 Parent=0x00000001 SizeRef=0,44 Split=X Selected=0x5708C63F\n DockNode ID=0x00000007 Parent=0x00000005 SizeRef=1140,701 Selected=0x5708C63F\n DockNode ID=0x00000008 Parent=0x00000005 SizeRef=553,701 Selected=0xFBA7A393\n DockNode ID=0x00000006 Parent=0x00000001 SizeRef=0,20 Selected=0x7AD1CDDD\n DockNode ID=0x00000002 Parent=0x81A8BB71 SizeRef=431,0 Split=X\n DockNode ID=0x00000003 Parent=0x00000002 SizeRef=12,0\n DockNode ID=0x00000004 Parent=0x00000002 SizeRef=52,0 Selected=0xCACA884B\n\n[ImHex][General]\nhex.builtin.view.achievements.name=0\nhex.builtin.view.bookmarks.name=0\nhex.builtin.view.command_palette.name=0\nhex.builtin.view.data_inspector.name=0\nhex.builtin.view.data_processor.name=0\nhex.diffing.view.diff.name=0\nhex.disassembler.view.disassembler.name=0\nhex.builtin.view.find.name=0\nhex.hashes.view.hashes.name=0\nhex.builtin.view.help.about.name=0\nhex.builtin.view.hex_editor.name=1\nhex.builtin.view.highlight_rules.name=0\nhex.builtin.view.information.name=0\nhex.builtin.view.logs.name=0\nhex.builtin.view.patches.name=0\nhex.builtin.view.pattern_data.name=0\nhex.builtin.view.pattern_editor.name=0\nhex.builtin.view.provider_settings.name=0\nhex.builtin.view.settings.name=0\nhex.builtin.view.store.name=0\nhex.builtin.view.theme_manager.name=0\nhex.builtin.view.tools.name=0\nhex.yara_rules.view.yara.name=0\nhex.windows.view.tty_console.name=0\nhex.builtin.tools.demangler=0\nhex.builtin.tools.ascii_table=0\nhex.builtin.tools.regex_replacer=0\nhex.builtin.tools.color=0\nhex.builtin.tools.calc=0\nhex.builtin.tools.graphing=0\nhex.builtin.tools.base_converter=0\nhex.builtin.tools.byte_swapper=0\nhex.builtin.tools.permissions=0\nhex.builtin.tools.wiki_explain=0\nhex.builtin.tools.file_tools=0\nhex.builtin.tools.ieee754=0\nhex.builtin.tools.invariant_multiplication=0\nhex.builtin.tools.tcp_client_server=0\nhex.builtin.tools.euclidean_algorithm=0\n\n", "name": "Minimal", "builtin": true } \ No newline at end of file diff --git a/plugins/builtin/romfs/lang/de_DE.json b/plugins/builtin/romfs/lang/de_DE.json index d62619bf1..cc6ac7f31 100644 --- a/plugins/builtin/romfs/lang/de_DE.json +++ b/plugins/builtin/romfs/lang/de_DE.json @@ -662,11 +662,7 @@ "hex.builtin.view.bookmarks.tooltip.open_in_view": "In View öffnen", "hex.builtin.view.bookmarks.tooltip.unlock": "Entsperren", "hex.builtin.view.command_palette.name": "Befehlspalette", - "hex.builtin.view.constants.name": "Konstanten", - "hex.builtin.view.constants.row.category": "Kategorie", - "hex.builtin.view.constants.row.desc": "Beschreibung", - "hex.builtin.view.constants.row.name": "Name", - "hex.builtin.view.constants.row.value": "Wert", + "hex.builtin.view.find.constants": "Konstanten", "hex.builtin.view.data_inspector.invert": "Invertieren", "hex.builtin.view.data_inspector.name": "Dateninspektor", "hex.builtin.view.data_inspector.no_data": "Keine Bytes ausgewählt", diff --git a/plugins/builtin/romfs/lang/en_US.json b/plugins/builtin/romfs/lang/en_US.json index a74472e9f..ed6c9d8f3 100644 --- a/plugins/builtin/romfs/lang/en_US.json +++ b/plugins/builtin/romfs/lang/en_US.json @@ -739,11 +739,7 @@ "hex.builtin.view.bookmarks.tooltip.open_in_view": "Open in new View", "hex.builtin.view.bookmarks.tooltip.unlock": "Unlock", "hex.builtin.view.command_palette.name": "Command Palette", - "hex.builtin.view.constants.name": "Constants", - "hex.builtin.view.constants.row.category": "Category", - "hex.builtin.view.constants.row.desc": "Description", - "hex.builtin.view.constants.row.name": "Name", - "hex.builtin.view.constants.row.value": "Value", + "hex.builtin.view.find.constants": "Constants", "hex.builtin.view.data_inspector.menu.copy": "Copy Value", "hex.builtin.view.data_inspector.menu.edit": "Edit Value", "hex.builtin.view.data_inspector.execution_error": "Custom row evaluation error", @@ -770,6 +766,7 @@ "hex.builtin.view.find.context.replace": "Replace", "hex.builtin.view.find.context.replace.ascii": "ASCII", "hex.builtin.view.find.context.replace.hex": "Hex", + "hex.builtin.view.find.constants": "Constants", "hex.builtin.view.find.demangled": "Demangled", "hex.builtin.view.find.name": "Find", "hex.builtin.view.replace.name": "Replace", diff --git a/plugins/builtin/romfs/lang/es_ES.json b/plugins/builtin/romfs/lang/es_ES.json index 48363c9f0..91b9829db 100644 --- a/plugins/builtin/romfs/lang/es_ES.json +++ b/plugins/builtin/romfs/lang/es_ES.json @@ -658,11 +658,7 @@ "hex.builtin.view.bookmarks.tooltip.open_in_view": "Abrir en nueva vista", "hex.builtin.view.bookmarks.tooltip.unlock": "Desbloquear", "hex.builtin.view.command_palette.name": "Paleta de Comandos", - "hex.builtin.view.constants.name": "Constantes", - "hex.builtin.view.constants.row.category": "Categoría", - "hex.builtin.view.constants.row.desc": "Descripción", - "hex.builtin.view.constants.row.name": "Nombre", - "hex.builtin.view.constants.row.value": "Valor", + "hex.builtin.view.find.constants": "Constantes", "hex.builtin.view.data_inspector.invert": "Invertir", "hex.builtin.view.data_inspector.name": "Inspector de Datos", "hex.builtin.view.data_inspector.no_data": "No se han seleccionado bytes", diff --git a/plugins/builtin/romfs/lang/fr_FR.json b/plugins/builtin/romfs/lang/fr_FR.json index 4509327ab..37677bbb1 100644 --- a/plugins/builtin/romfs/lang/fr_FR.json +++ b/plugins/builtin/romfs/lang/fr_FR.json @@ -712,11 +712,7 @@ "hex.builtin.view.bookmarks.tooltip.open_in_view": "Ouvrir dans une nouvelle vue", "hex.builtin.view.bookmarks.tooltip.unlock": "Déverrouiller", "hex.builtin.view.command_palette.name": "Palette de commandes", - "hex.builtin.view.constants.name": "Constantes", - "hex.builtin.view.constants.row.category": "Catégorie", - "hex.builtin.view.constants.row.desc": "Description", - "hex.builtin.view.constants.row.name": "Nom", - "hex.builtin.view.constants.row.value": "Valeur", + "hex.builtin.view.find.constants": "Constantes", "hex.builtin.view.data_inspector.menu.copy": "Copier la valeur", "hex.builtin.view.data_inspector.menu.edit": "Modifier la valeur", "hex.builtin.view.data_inspector.execution_error": "Erreur d'évaluation de ligne personnalisée", diff --git a/plugins/builtin/romfs/lang/hu_HU.json b/plugins/builtin/romfs/lang/hu_HU.json index 41217039d..baa0a6b4d 100644 --- a/plugins/builtin/romfs/lang/hu_HU.json +++ b/plugins/builtin/romfs/lang/hu_HU.json @@ -656,11 +656,7 @@ "hex.builtin.view.bookmarks.tooltip.open_in_view": "Megnyitás új nézetben", "hex.builtin.view.bookmarks.tooltip.unlock": "Feloldás", "hex.builtin.view.command_palette.name": "Parancspaletta", - "hex.builtin.view.constants.name": "Konstansok", - "hex.builtin.view.constants.row.category": "Kategória", - "hex.builtin.view.constants.row.desc": "Leírás", - "hex.builtin.view.constants.row.name": "Név", - "hex.builtin.view.constants.row.value": "Érték", + "hex.builtin.view.find.constants": "Konstansok", "hex.builtin.view.data_inspector.invert": "Megfordít", "hex.builtin.view.data_inspector.name": "Adatértelmező", "hex.builtin.view.data_inspector.no_data": "Nincs kijelölt bájt", diff --git a/plugins/builtin/romfs/lang/it_IT.json b/plugins/builtin/romfs/lang/it_IT.json index 97c1e90aa..34394a394 100644 --- a/plugins/builtin/romfs/lang/it_IT.json +++ b/plugins/builtin/romfs/lang/it_IT.json @@ -658,11 +658,7 @@ "hex.builtin.view.bookmarks.tooltip.open_in_view": "", "hex.builtin.view.bookmarks.tooltip.unlock": "", "hex.builtin.view.command_palette.name": "Tavola dei Comandi", - "hex.builtin.view.constants.name": "Costanti", - "hex.builtin.view.constants.row.category": "Categoria", - "hex.builtin.view.constants.row.desc": "Descrizione", - "hex.builtin.view.constants.row.name": "Nome", - "hex.builtin.view.constants.row.value": "Valore", + "hex.builtin.view.find.constants": "Costanti", "hex.builtin.view.data_inspector.invert": "", "hex.builtin.view.data_inspector.name": "Ispezione Dati", "hex.builtin.view.data_inspector.no_data": "Nessun byte selezionato", diff --git a/plugins/builtin/romfs/lang/ja_JP.json b/plugins/builtin/romfs/lang/ja_JP.json index 0e327f1ff..887c7e574 100644 --- a/plugins/builtin/romfs/lang/ja_JP.json +++ b/plugins/builtin/romfs/lang/ja_JP.json @@ -658,11 +658,7 @@ "hex.builtin.view.bookmarks.tooltip.open_in_view": "", "hex.builtin.view.bookmarks.tooltip.unlock": "", "hex.builtin.view.command_palette.name": "コマンドパレット", - "hex.builtin.view.constants.name": "定数", - "hex.builtin.view.constants.row.category": "カテゴリ", - "hex.builtin.view.constants.row.desc": "記述", - "hex.builtin.view.constants.row.name": "名前", - "hex.builtin.view.constants.row.value": "値", + "hex.builtin.view.find.constants": "定数", "hex.builtin.view.data_inspector.invert": "反転", "hex.builtin.view.data_inspector.name": "データインスペクタ", "hex.builtin.view.data_inspector.no_data": "範囲が選択されていません", diff --git a/plugins/builtin/romfs/lang/ko_KR.json b/plugins/builtin/romfs/lang/ko_KR.json index 20b63a22d..79d0cc378 100644 --- a/plugins/builtin/romfs/lang/ko_KR.json +++ b/plugins/builtin/romfs/lang/ko_KR.json @@ -658,11 +658,7 @@ "hex.builtin.view.bookmarks.tooltip.open_in_view": "새 보기에서 열기", "hex.builtin.view.bookmarks.tooltip.unlock": "잠금 해제", "hex.builtin.view.command_palette.name": "명령 팔레트", - "hex.builtin.view.constants.name": "상수", - "hex.builtin.view.constants.row.category": "종류", - "hex.builtin.view.constants.row.desc": "설명", - "hex.builtin.view.constants.row.name": "이름", - "hex.builtin.view.constants.row.value": "값", + "hex.builtin.view.find.constants": "상수", "hex.builtin.view.data_inspector.invert": "반전", "hex.builtin.view.data_inspector.name": "데이터 변환기", "hex.builtin.view.data_inspector.no_data": "선택된 바이트가 없습니다", diff --git a/plugins/builtin/romfs/lang/pl_PL.json b/plugins/builtin/romfs/lang/pl_PL.json index a820ff30c..190f1f8df 100644 --- a/plugins/builtin/romfs/lang/pl_PL.json +++ b/plugins/builtin/romfs/lang/pl_PL.json @@ -714,11 +714,7 @@ "hex.builtin.view.bookmarks.tooltip.open_in_view": "Otwórz w nowym widoku", "hex.builtin.view.bookmarks.tooltip.unlock": "Odblokuj", "hex.builtin.view.command_palette.name": "Paleta poleceń", - "hex.builtin.view.constants.name": "Stałe", - "hex.builtin.view.constants.row.category": "Kategoria", - "hex.builtin.view.constants.row.desc": "Opis", - "hex.builtin.view.constants.row.name": "Nazwa", - "hex.builtin.view.constants.row.value": "Wartość", + "hex.builtin.view.find.constants": "Stałe", "hex.builtin.view.data_inspector.menu.copy": "Kopiuj wartość", "hex.builtin.view.data_inspector.menu.edit": "Edytuj wartość", "hex.builtin.view.data_inspector.execution_error": "Błąd ewaluacji niestandardowego wiersza", diff --git a/plugins/builtin/romfs/lang/pt_BR.json b/plugins/builtin/romfs/lang/pt_BR.json index c348df695..47099bf9b 100644 --- a/plugins/builtin/romfs/lang/pt_BR.json +++ b/plugins/builtin/romfs/lang/pt_BR.json @@ -658,11 +658,7 @@ "hex.builtin.view.bookmarks.tooltip.open_in_view": "", "hex.builtin.view.bookmarks.tooltip.unlock": "", "hex.builtin.view.command_palette.name": "Paleta de Comandos", - "hex.builtin.view.constants.name": "Constantes", - "hex.builtin.view.constants.row.category": "Categoria", - "hex.builtin.view.constants.row.desc": "Descrição", - "hex.builtin.view.constants.row.name": "Nome", - "hex.builtin.view.constants.row.value": "Valor", + "hex.builtin.view.find.constants": "Constantes", "hex.builtin.view.data_inspector.invert": "Inverter", "hex.builtin.view.data_inspector.name": "Inspecionador de Dados", "hex.builtin.view.data_inspector.no_data": "Nenhum Byte Selecionado", diff --git a/plugins/builtin/romfs/lang/ru_RU.json b/plugins/builtin/romfs/lang/ru_RU.json index 961eb2b24..bbf6e68b2 100644 --- a/plugins/builtin/romfs/lang/ru_RU.json +++ b/plugins/builtin/romfs/lang/ru_RU.json @@ -690,11 +690,7 @@ "hex.builtin.view.bookmarks.tooltip.open_in_view": "Открыть в другом пространстве", "hex.builtin.view.bookmarks.tooltip.unlock": "Разблокировать", "hex.builtin.view.command_palette.name": "Палитра комманд", - "hex.builtin.view.constants.name": "Константы", - "hex.builtin.view.constants.row.category": "Категория", - "hex.builtin.view.constants.row.desc": "Описание", - "hex.builtin.view.constants.row.name": "Имя", - "hex.builtin.view.constants.row.value": "Значение", + "hex.builtin.view.find.constants": "Константы", "hex.builtin.view.data_inspector.execution_error": "Ошибка обработки пользовательского ряда", "hex.builtin.view.data_inspector.invert": "Инвертировать", "hex.builtin.view.data_inspector.name": "Анализатор данных", diff --git a/plugins/builtin/romfs/lang/uk_UA.json b/plugins/builtin/romfs/lang/uk_UA.json index a4d763a57..a8248a07a 100644 --- a/plugins/builtin/romfs/lang/uk_UA.json +++ b/plugins/builtin/romfs/lang/uk_UA.json @@ -712,11 +712,7 @@ "hex.builtin.view.bookmarks.tooltip.open_in_view": "Відкрити у новому вікні", "hex.builtin.view.bookmarks.tooltip.unlock": "Розблокувати", "hex.builtin.view.command_palette.name": "Палітра команд", - "hex.builtin.view.constants.name": "Константи", - "hex.builtin.view.constants.row.category": "Категорія", - "hex.builtin.view.constants.row.desc": "Опис", - "hex.builtin.view.constants.row.name": "Ім'я", - "hex.builtin.view.constants.row.value": "Значення", + "hex.builtin.view.find.constants": "Константи", "hex.builtin.view.data_inspector.menu.copy": "Копіювати значення", "hex.builtin.view.data_inspector.execution_error": "Помилка обробки користувацького рядка", "hex.builtin.view.data_inspector.invert": "Інвертувати", diff --git a/plugins/builtin/romfs/lang/zh_CN.json b/plugins/builtin/romfs/lang/zh_CN.json index 0eb2dba58..3a4b5bd65 100644 --- a/plugins/builtin/romfs/lang/zh_CN.json +++ b/plugins/builtin/romfs/lang/zh_CN.json @@ -716,11 +716,7 @@ "hex.builtin.view.bookmarks.tooltip.open_in_view": "在新窗口打开", "hex.builtin.view.bookmarks.tooltip.unlock": "解锁", "hex.builtin.view.command_palette.name": "命令栏", - "hex.builtin.view.constants.name": "常量", - "hex.builtin.view.constants.row.category": "分类", - "hex.builtin.view.constants.row.desc": "描述", - "hex.builtin.view.constants.row.name": "名称", - "hex.builtin.view.constants.row.value": "值", + "hex.builtin.view.find.constants": "常量", "hex.builtin.view.data_inspector.menu.copy": "复制值", "hex.builtin.view.data_inspector.menu.edit": "编辑值", "hex.builtin.view.data_inspector.execution_error": "自定义行计算错误", diff --git a/plugins/builtin/romfs/lang/zh_TW.json b/plugins/builtin/romfs/lang/zh_TW.json index f47c37914..6727687f8 100644 --- a/plugins/builtin/romfs/lang/zh_TW.json +++ b/plugins/builtin/romfs/lang/zh_TW.json @@ -658,11 +658,7 @@ "hex.builtin.view.bookmarks.tooltip.open_in_view": "", "hex.builtin.view.bookmarks.tooltip.unlock": "解鎖", "hex.builtin.view.command_palette.name": "命令選擇區", - "hex.builtin.view.constants.name": "常數", - "hex.builtin.view.constants.row.category": "類別", - "hex.builtin.view.constants.row.desc": "說明", - "hex.builtin.view.constants.row.name": "名稱", - "hex.builtin.view.constants.row.value": "數值", + "hex.builtin.view.find.constants": "常數", "hex.builtin.view.data_inspector.invert": "反轉", "hex.builtin.view.data_inspector.name": "資料檢查器", "hex.builtin.view.data_inspector.no_data": "未選取位元組", diff --git a/plugins/builtin/romfs/layouts/default.hexlyt b/plugins/builtin/romfs/layouts/default.hexlyt index 40e1b6f42..5f872de12 100644 --- a/plugins/builtin/romfs/layouts/default.hexlyt +++ b/plugins/builtin/romfs/layouts/default.hexlyt @@ -122,11 +122,6 @@ Pos=214,201 Size=600,350 Collapsed=0 -[Window][###hex.builtin.view.constants.name] -Pos=419,-124 -Size=652,660 -Collapsed=0 - [Window][###hex.disassembler.view.disassembler.name] Pos=1004,-204 Size=1336,1320 @@ -146,7 +141,6 @@ DockSpace ID=0x81A8BB71 Window=0xF9B0A590 Pos=161,350 Size=2560,1427 Split [ImHex][General] hex.builtin.view.bookmarks.name=0 hex.builtin.view.command_palette.name=0 -hex.builtin.view.constants.name=0 hex.builtin.view.data_inspector.name=1 hex.builtin.view.data_processor.name=0 hex.diffing.view.diff.name=0 diff --git a/plugins/builtin/romfs/layouts/minimal.hexlyt b/plugins/builtin/romfs/layouts/minimal.hexlyt index d511b9611..0f76b079c 100644 --- a/plugins/builtin/romfs/layouts/minimal.hexlyt +++ b/plugins/builtin/romfs/layouts/minimal.hexlyt @@ -122,11 +122,6 @@ Pos=214,201 Size=600,350 Collapsed=0 -[Window][###hex.builtin.view.constants.name] -Pos=419,-124 -Size=652,660 -Collapsed=0 - [Window][###hex.disassembler.view.disassembler.name] Pos=1004,-204 Size=1336,1320 @@ -147,7 +142,6 @@ DockSpace ID=0x81A8BB71 Window=0xF9B0A590 Pos=161,350 Size=2560,1427 Split hex.builtin.view.achievements.name=0 hex.builtin.view.bookmarks.name=0 hex.builtin.view.command_palette.name=0 -hex.builtin.view.constants.name=0 hex.builtin.view.data_inspector.name=0 hex.builtin.view.data_processor.name=0 hex.diffing.view.diff.name=0 diff --git a/plugins/builtin/source/content/helpers/constants.cpp b/plugins/builtin/source/content/helpers/constants.cpp new file mode 100644 index 000000000..3de31f434 --- /dev/null +++ b/plugins/builtin/source/content/helpers/constants.cpp @@ -0,0 +1,37 @@ +#include + +#include +#include +#include + +namespace hex::plugin::builtin { + + ConstantGroup::ConstantGroup(const std::fs::path &path) { + if (!wolv::io::fs::exists(path)) + throw std::runtime_error("Path does not exist"); + + if (path.extension() != ".json") + throw std::runtime_error("Invalid constants file extension"); + + try { + auto fileData = wolv::io::File(path, wolv::io::File::Mode::Read).readString(); + auto content = nlohmann::json::parse(fileData); + + m_name = content.at("name").get(); + const auto values = content.at("values"); + for (const auto &value : values) { + Constant constant = {}; + constant.name = value.at("name").get(); + if (value.contains("desc")) + constant.description = value.at("desc").get(); + + constant.value = BinaryPattern(value.at("value").get()); + + m_constants.push_back(constant); + } + } catch (...) { + throw std::runtime_error("Failed to parse constants file " + wolv::util::toUTF8String(path)); + } + } + +} diff --git a/plugins/builtin/source/content/views.cpp b/plugins/builtin/source/content/views.cpp index b3711c1c4..d704d69c1 100644 --- a/plugins/builtin/source/content/views.cpp +++ b/plugins/builtin/source/content/views.cpp @@ -10,7 +10,6 @@ #include "content/views/view_command_palette.hpp" #include "content/views/view_settings.hpp" #include "content/views/view_data_processor.hpp" -#include "content/views/view_constants.hpp" #include "content/views/view_store.hpp" #include "content/views/view_provider_settings.hpp" #include "content/views/view_find.hpp" @@ -37,7 +36,6 @@ namespace hex::plugin::builtin { ContentRegistry::Views::add(); ContentRegistry::Views::add(); ContentRegistry::Views::add(); - //ContentRegistry::Views::add(); ContentRegistry::Views::add(); ContentRegistry::Views::add(); ContentRegistry::Views::add(); diff --git a/plugins/builtin/source/content/views/view_constants.cpp b/plugins/builtin/source/content/views/view_constants.cpp deleted file mode 100644 index 3ef12cac2..000000000 --- a/plugins/builtin/source/content/views/view_constants.cpp +++ /dev/null @@ -1,152 +0,0 @@ -#include "content/views/view_constants.hpp" - -#include -#include -#include - -#include -#include - -#include -#include - -#include - -namespace hex::plugin::builtin { - - ViewConstants::ViewConstants() : View::Window("hex.builtin.view.constants.name", ICON_VS_SYMBOL_CONSTANT) { - this->reloadConstants(); - } - - void ViewConstants::reloadConstants() { - m_constants.clear(); - m_filterIndices.clear(); - - for (const auto &path : paths::Constants.read()) { - if (!wolv::io::fs::exists(path)) continue; - - std::error_code error; - for (auto &file : std::fs::directory_iterator(path, error)) { - if (!file.is_regular_file()) continue; - - if (file.path().extension() != ".json") continue; - if (file.path().filename().u8string().starts_with('_')) continue; - - try { - auto fileData = wolv::io::File(file.path(), wolv::io::File::Mode::Read).readString(); - auto content = nlohmann::json::parse(fileData); - - for (auto value : content.at("values")) { - Constant constant; - constant.category = content.at("name").get(); - constant.name = value.at("name").get(); - if (value.contains("desc")) - constant.description = value.at("desc").get(); - constant.value = value.at("value").get(); - - auto type = value.at("type"); - if (type == "int10") - constant.type = ConstantType::Int10; - else if (type == "int16be") - constant.type = ConstantType::Int16BigEndian; - else if (type == "int16le") - constant.type = ConstantType::Int16LittleEndian; - else - throw std::runtime_error("Invalid type"); - - m_filterIndices.push_back(m_constants.size()); - m_constants.push_back(constant); - } - } catch (...) { - log::error("Failed to parse constants file {}", wolv::util::toUTF8String(file.path())); - } - } - } - } - - void ViewConstants::drawContent() { - ImGui::PushItemWidth(-1); - - if (ImGuiExt::InputTextIcon("##search", ICON_VS_FILTER, m_filter)) { - m_filterIndices.clear(); - - // Filter the constants according to the entered value - for (u64 i = 0; i < m_constants.size(); i++) { - auto &constant = m_constants[i]; - if (hex::containsIgnoreCase(constant.name, m_filter) || - hex::containsIgnoreCase(constant.category, m_filter) || - hex::containsIgnoreCase(constant.description, m_filter) || - hex::containsIgnoreCase(constant.value, m_filter)) - m_filterIndices.push_back(i); - } - } - - ImGui::PopItemWidth(); - - if (ImGui::BeginTable("##strings", 4, ImGuiTableFlags_Borders | ImGuiTableFlags_Resizable | ImGuiTableFlags_Sortable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_RowBg | ImGuiTableFlags_ScrollY)) { - ImGui::TableSetupScrollFreeze(0, 1); - ImGui::TableSetupColumn("hex.builtin.view.constants.row.category"_lang, 0, -1, ImGui::GetID("category")); - ImGui::TableSetupColumn("hex.builtin.view.constants.row.name"_lang, 0, -1, ImGui::GetID("name")); - ImGui::TableSetupColumn("hex.builtin.view.constants.row.desc"_lang, 0, -1, ImGui::GetID("desc")); - ImGui::TableSetupColumn("hex.builtin.view.constants.row.value"_lang, 0, -1, ImGui::GetID("value")); - - auto sortSpecs = ImGui::TableGetSortSpecs(); - - // Handle table sorting - if (sortSpecs->SpecsDirty) { - std::sort(m_constants.begin(), m_constants.end(), [&sortSpecs](const Constant &left, const Constant &right) -> bool { - if (sortSpecs->Specs->ColumnUserID == ImGui::GetID("category")) { - if (sortSpecs->Specs->SortDirection == ImGuiSortDirection_Ascending) - return left.category > right.category; - else - return left.category < right.category; - } else if (sortSpecs->Specs->ColumnUserID == ImGui::GetID("name")) { - if (sortSpecs->Specs->SortDirection == ImGuiSortDirection_Ascending) - return left.name > right.name; - else - return left.name < right.name; - } else if (sortSpecs->Specs->ColumnUserID == ImGui::GetID("desc")) { - if (sortSpecs->Specs->SortDirection == ImGuiSortDirection_Ascending) - return left.description > right.description; - else - return left.description < right.description; - } else if (sortSpecs->Specs->ColumnUserID == ImGui::GetID("value")) { - if (sortSpecs->Specs->SortDirection == ImGuiSortDirection_Ascending) - return left.value > right.value; - else - return left.value < right.value; - } - - return false; - }); - - sortSpecs->SpecsDirty = false; - } - - ImGui::TableHeadersRow(); - - ImGuiListClipper clipper; - clipper.Begin(m_filterIndices.size()); - - // Draw the constants table - while (clipper.Step()) { - for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++) { - auto &constant = m_constants[m_filterIndices[i]]; - ImGui::TableNextRow(); - ImGui::TableNextColumn(); - ImGui::TextUnformatted(constant.category.c_str()); - ImGui::TableNextColumn(); - ImGui::TextUnformatted(constant.name.c_str()); - ImGui::TableNextColumn(); - ImGui::TextUnformatted(constant.description.c_str()); - ImGui::TableNextColumn(); - ImGui::TextUnformatted(constant.value.c_str()); - } - } - clipper.End(); - - ImGui::EndTable(); - } - } - -} \ No newline at end of file diff --git a/plugins/builtin/source/content/views/view_find.cpp b/plugins/builtin/source/content/views/view_find.cpp index e1fee685b..a502e17ec 100644 --- a/plugins/builtin/source/content/views/view_find.cpp +++ b/plugins/builtin/source/content/views/view_find.cpp @@ -17,6 +17,10 @@ #include +#include +#include +#include + namespace hex::plugin::builtin { ViewFind::ViewFind() : View::Window("hex.builtin.view.find.name", ICON_VS_SEARCH) { @@ -55,8 +59,8 @@ namespace hex::plugin::builtin { ImGui::TableNextColumn(); { - auto region = occurrence.value.region; - const auto value = this->decodeValue(ImHexApi::Provider::get(), occurrence.value, 256); + auto region = occurrence.value->region; + const auto value = this->decodeValue(ImHexApi::Provider::get(), *occurrence.value, 256); ImGui::ColorButton("##color", ImColor(HighlightColor()), ImGuiColorEditFlags_AlphaOpaque); ImGui::SameLine(0, 10); @@ -291,7 +295,7 @@ namespace hex::plugin::builtin { if (!validChar || startAddress + countedCharacters == endAddress) { if (countedCharacters >= settings.minLength) { if (!settings.nullTermination || byte == 0x00) { - results.push_back(Occurrence { Region { startAddress, size_t(countedCharacters) }, decodeType, endian, false }); + results.push_back(Occurrence { Region { startAddress, size_t(countedCharacters) }, endian, decodeType, false, {} }); } } @@ -379,7 +383,7 @@ namespace hex::plugin::builtin { auto address = occurrence.getAddress(); reader.seek(address + 1); - results.push_back(Occurrence{ Region { address, bytes.size() }, decodeType, endian, false }); + results.push_back(Occurrence{ Region { address, bytes.size() }, endian, decodeType, false, {} }); progress = address - searchRegion.getStartAddress(); } @@ -440,7 +444,7 @@ namespace hex::plugin::builtin { if (matchedBytes == settings.pattern.getSize()) { auto occurrenceAddress = it.getAddress() - (patternSize - 1); - results.push_back(Occurrence { Region { occurrenceAddress, patternSize }, Occurrence::DecodeType::Binary, std::endian::native, false }); + results.push_back(Occurrence { Region { occurrenceAddress, patternSize }, std::endian::native, Occurrence::DecodeType::Binary, false, {} }); it.setAddress(occurrenceAddress); matchedBytes = 0; } @@ -466,7 +470,7 @@ namespace hex::plugin::builtin { } if (match) - results.push_back(Occurrence { Region { address, patternSize }, Occurrence::DecodeType::Binary, std::endian::native, false }); + results.push_back(Occurrence { Region { address, patternSize }, std::endian::native, Occurrence::DecodeType::Binary, false, {} }); } } @@ -550,7 +554,96 @@ namespace hex::plugin::builtin { } }(); - results.push_back(Occurrence { Region { address, size }, decodeType, settings.endian, false }); + results.push_back(Occurrence { Region { address, size }, settings.endian, decodeType, false, {} }); + } + } + + return results; + } + + std::vector ViewFind::searchConstants(Task &task, prv::Provider* provider, Region searchRegion, const SearchSettings::Constants &settings) { + std::vector results; + + std::vector constantGroups; + for (const auto &path : paths::Constants.read()) { + for (const auto &entry : std::fs::directory_iterator(path)) { + try { + constantGroups.emplace_back(entry.path()); + } catch (const std::exception &e) { + ui::ToastError::open(fmt::format("Failed to load constant group from {}: {}", wolv::util::toUTF8String(entry.path()), e.what())); + } + } + } + + auto reader = prv::ProviderReader(provider); + reader.seek(searchRegion.getStartAddress()); + reader.setEndAddress(searchRegion.getEndAddress()); + + u64 constantCount = 0; + for (const auto &group : constantGroups) { + constantCount += group.getConstants().size(); + } + task.setMaxValue(constantCount * searchRegion.getSize()); + + u64 progress = 0; + for (const auto &group : constantGroups) { + for (const auto &constant : group.getConstants()) { + const auto &pattern = constant.value; + const size_t patternSize = pattern.getSize(); + if (settings.alignment == 1) { + u32 matchedBytes = 0; + for (auto it = reader.begin(); it < reader.end(); it += 1) { + auto byte = *it; + + task.update(progress + it.getAddress()); + if (pattern.matchesByte(byte, matchedBytes)) { + matchedBytes++; + if (matchedBytes == pattern.getSize()) { + auto occurrenceAddress = it.getAddress() - (patternSize - 1); + + results.push_back(Occurrence { + Region { occurrenceAddress, patternSize }, + std::endian::native, + Occurrence::DecodeType::ASCII, + false, + fmt::format("[{}] {}", group.getName(), constant.name) + }); + it.setAddress(occurrenceAddress); + matchedBytes = 0; + } + } else { + if (matchedBytes > 0) + it -= matchedBytes; + matchedBytes = 0; + } + } + } else { + std::vector data(patternSize); + for (u64 address = searchRegion.getStartAddress(); address < searchRegion.getEndAddress(); address += settings.alignment) { + reader.read(address, data.data(), data.size()); + + task.update(address); + + bool match = true; + for (u32 i = 0; i < patternSize; i++) { + if (!pattern.matchesByte(data[i], i)) { + match = false; + break; + } + } + + if (match) + results.push_back(Occurrence { + Region { address, patternSize }, + std::endian::native, + Occurrence::DecodeType::ASCII, + false, + fmt::format("[] {}", group.getName(), constant.name) + }); + } + } + + progress += searchRegion.getSize(); } } @@ -592,9 +685,12 @@ namespace hex::plugin::builtin { case Value: m_foundOccurrences.get(provider) = searchValue(task, provider, searchRegion, settings.value); break; + case Constants: + m_foundOccurrences.get(provider) = searchConstants(task, provider, searchRegion, settings.constants); + break; } - m_sortedOccurrences.get(provider) = m_foundOccurrences.get(provider); + m_sortedOccurrences.get(provider).clear(); m_lastSelectedOccurrence = nullptr; for (const auto &occurrence : m_foundOccurrences.get(provider)) @@ -636,16 +732,16 @@ namespace hex::plugin::builtin { result += hex::encodeByteString({ bytes[i] }); break; case Unsigned: - result += formatBytes(bytes, occurrence.endian); + result = formatBytes(bytes, occurrence.endian); break; case Signed: - result += formatBytes(bytes, occurrence.endian); + result = formatBytes(bytes, occurrence.endian); break; case Float: - result += formatBytes(bytes, occurrence.endian); + result = formatBytes(bytes, occurrence.endian); break; case Double: - result += formatBytes(bytes, occurrence.endian); + result = formatBytes(bytes, occurrence.endian); break; } } @@ -653,6 +749,9 @@ namespace hex::plugin::builtin { case BinaryPattern: result = hex::encodeByteString(bytes); break; + case Constants: + result = occurrence.string; + break; } if (occurrence.region.getSize() > maxBytes) @@ -958,6 +1057,16 @@ namespace hex::plugin::builtin { ImGui::EndTabItem(); } + if (ImGui::BeginTabItem("hex.builtin.view.find.constants"_lang)) { + auto &settings = m_searchSettings.constants; + + mode = SearchSettings::Mode::Constants; + + constexpr static u32 min = 1, max = 0x1000; + ImGui::SliderScalar("hex.builtin.view.find.binary_pattern.alignment"_lang, ImGuiDataType_U32, &settings.alignment, &min, &max); + + ImGui::EndTabItem(); + } ImGui::EndTabBar(); } @@ -1075,6 +1184,11 @@ namespace hex::plugin::builtin { auto sortSpecs = ImGui::TableGetSortSpecs(); + if (m_sortedOccurrences->empty() && !m_foundOccurrences->empty()) { + currOccurrences = *m_foundOccurrences; + sortSpecs->SpecsDirty = true; + } + if (sortSpecs->SpecsDirty) { std::sort(currOccurrences.begin(), currOccurrences.end(), [this, &sortSpecs, provider](const Occurrence &left, const Occurrence &right) -> bool { if (sortSpecs->Specs->ColumnUserID == ImGui::GetID("offset")) {