From 11f63f9b026ec6f35fa698efce039ac777bbedbf Mon Sep 17 00:00:00 2001 From: WerWolv Date: Fri, 7 Oct 2022 11:28:44 +0200 Subject: [PATCH] ui: Added optional byte cell and char cell padding Closes #771 --- .../include/content/views/view_hex_editor.hpp | 1 + .../include/content/views/view_settings.hpp | 4 +-- .../source/content/settings_entries.cpp | 22 +++++++++++++++ .../source/content/views/view_hex_editor.cpp | 27 +++++++++++++++---- plugins/builtin/source/lang/de_DE.cpp | 2 ++ plugins/builtin/source/lang/en_US.cpp | 2 ++ plugins/builtin/source/lang/it_IT.cpp | 2 ++ plugins/builtin/source/lang/ja_JP.cpp | 2 ++ plugins/builtin/source/lang/ko_KR.cpp | 2 ++ plugins/builtin/source/lang/pt_BR.cpp | 2 ++ plugins/builtin/source/lang/zh_CN.cpp | 2 ++ plugins/builtin/source/lang/zh_TW.cpp | 2 ++ 12 files changed, 63 insertions(+), 7 deletions(-) diff --git a/plugins/builtin/include/content/views/view_hex_editor.hpp b/plugins/builtin/include/content/views/view_hex_editor.hpp index 736897029..bb13d0bbb 100644 --- a/plugins/builtin/include/content/views/view_hex_editor.hpp +++ b/plugins/builtin/include/content/views/view_hex_editor.hpp @@ -137,6 +137,7 @@ namespace hex::plugin::builtin { bool m_grayOutZero = true; bool m_showAscii = true; bool m_syncScrolling = false; + u32 m_byteCellPadding = 0, m_characterCellPadding = 0; bool m_shouldOpenPopup = false; std::unique_ptr m_currPopup; diff --git a/plugins/builtin/include/content/views/view_settings.hpp b/plugins/builtin/include/content/views/view_settings.hpp index 3300f444c..90ed80200 100644 --- a/plugins/builtin/include/content/views/view_settings.hpp +++ b/plugins/builtin/include/content/views/view_settings.hpp @@ -17,8 +17,8 @@ namespace hex::plugin::builtin { [[nodiscard]] bool isAvailable() const override { return true; } [[nodiscard]] bool hasViewMenuItemEntry() const override { return false; } - [[nodiscard]] ImVec2 getMinSize() const override { return { 500, 300 }; } - [[nodiscard]] ImVec2 getMaxSize() const override { return { 500, 300 }; } + [[nodiscard]] ImVec2 getMinSize() const override { return { 700, 400 }; } + [[nodiscard]] ImVec2 getMaxSize() const override { return { 700, 400 }; } private: bool m_restartRequested = false; diff --git a/plugins/builtin/source/content/settings_entries.cpp b/plugins/builtin/source/content/settings_entries.cpp index 2c3ee1beb..85bd61de6 100644 --- a/plugins/builtin/source/content/settings_entries.cpp +++ b/plugins/builtin/source/content/settings_entries.cpp @@ -308,6 +308,28 @@ namespace hex::plugin::builtin { return false; }); + ContentRegistry::Settings::add("hex.builtin.setting.hex_editor", "hex.builtin.setting.hex_editor.byte_padding", 0, [](auto name, nlohmann::json &setting) { + static int padding = static_cast(setting); + + if (ImGui::SliderInt(name.data(), &padding, 0, 50)) { + setting = padding; + return true; + } + + return false; + }); + + ContentRegistry::Settings::add("hex.builtin.setting.hex_editor", "hex.builtin.setting.hex_editor.char_padding", 0, [](auto name, nlohmann::json &setting) { + static int padding = static_cast(setting); + + if (ImGui::SliderInt(name.data(), &padding, 0, 50)) { + setting = padding; + return true; + } + + return false; + }); + /* Fonts */ diff --git a/plugins/builtin/source/content/views/view_hex_editor.cpp b/plugins/builtin/source/content/views/view_hex_editor.cpp index 9f798197d..84b53d171 100644 --- a/plugins/builtin/source/content/views/view_hex_editor.cpp +++ b/plugins/builtin/source/content/views/view_hex_editor.cpp @@ -746,12 +746,12 @@ namespace hex::plugin::builtin { if (isColumnSeparatorColumn(i, columnCount)) ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed, SeparatorColumWidth); - ImGui::TableSetupColumn(hex::format(this->m_upperCaseHex ? "{:0{}X}" : "{:0{}x}", i * bytesPerCell, this->m_currDataVisualizer->getMaxCharsPerCell()).c_str(), ImGuiTableColumnFlags_WidthFixed, CharacterSize.x * this->m_currDataVisualizer->getMaxCharsPerCell() + 6); + ImGui::TableSetupColumn(hex::format(this->m_upperCaseHex ? "{:0{}X}" : "{:0{}x}", i * bytesPerCell, this->m_currDataVisualizer->getMaxCharsPerCell()).c_str(), ImGuiTableColumnFlags_WidthFixed, CharacterSize.x * this->m_currDataVisualizer->getMaxCharsPerCell() + 6 + this->m_byteCellPadding); } // ASCII column ImGui::TableSetupColumn(""); - ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed, CharacterSize.x * this->m_bytesPerRow); + ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed, (CharacterSize.x + this->m_characterCellPadding) * this->m_bytesPerRow); // Custom encoding column ImGui::TableSetupColumn(""); @@ -856,7 +856,7 @@ namespace hex::plugin::builtin { if (x < std::ceil(float(validBytes) / bytesPerCell)) { auto cellStartPos = getCellPosition(); - auto cellSize = (CharacterSize * ImVec2(this->m_currDataVisualizer->getMaxCharsPerCell(), 1) + (ImVec2(3, 2) * ImGui::GetStyle().CellPadding) - ImVec2(1, 0) * ImGui::GetStyle().CellPadding) + ImVec2(1, 0); + auto cellSize = (CharacterSize * ImVec2(this->m_currDataVisualizer->getMaxCharsPerCell(), 1) + (ImVec2(3, 2) * ImGui::GetStyle().CellPadding) - ImVec2(1, 0) * ImGui::GetStyle().CellPadding) + ImVec2(1 + this->m_byteCellPadding, 0); auto maxCharsPerCell = this->m_currDataVisualizer->getMaxCharsPerCell(); auto [foregroundColor, backgroundColor] = cellColors[x]; @@ -910,7 +910,10 @@ namespace hex::plugin::builtin { // Draw ASCII column if (this->m_showAscii) { ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, ImVec2(0, 0)); - if (ImGui::BeginTable("##ascii_cell", this->m_bytesPerRow)) { + if (ImGui::BeginTable("##ascii_column", this->m_bytesPerRow)) { + for (u64 x = 0; x < this->m_bytesPerRow; x++) + ImGui::TableSetupColumn(hex::format("##ascii_cell{}", x).c_str(), ImGuiTableColumnFlags_WidthFixed, CharacterSize.x + this->m_characterCellPadding); + ImGui::TableNextRow(); for (u64 x = 0; x < this->m_bytesPerRow; x++) { @@ -919,7 +922,7 @@ namespace hex::plugin::builtin { const u64 byteAddress = y * this->m_bytesPerRow + x + provider->getBaseAddress() + provider->getCurrentPageAddress(); const auto cellStartPos = getCellPosition(); - const auto cellSize = CharacterSize; + const auto cellSize = CharacterSize + ImVec2(this->m_characterCellPadding, 0); const bool cellHovered = ImGui::IsMouseHoveringRect(cellStartPos, cellStartPos + cellSize, true); @@ -1525,6 +1528,20 @@ namespace hex::plugin::builtin { this->m_syncScrolling = static_cast(syncScrolling); } + { + auto padding = ContentRegistry::Settings::getSetting("hex.builtin.setting.hex_editor", "hex.builtin.setting.hex_editor.byte_padding"); + + if (padding.is_number()) + this->m_byteCellPadding = static_cast(padding); + } + + { + auto padding = ContentRegistry::Settings::getSetting("hex.builtin.setting.hex_editor", "hex.builtin.setting.hex_editor.char_padding"); + + if (padding.is_number()) + this->m_characterCellPadding = static_cast(padding); + } + }); } diff --git a/plugins/builtin/source/lang/de_DE.cpp b/plugins/builtin/source/lang/de_DE.cpp index 9a91f3178..6bbb6bf3d 100644 --- a/plugins/builtin/source/lang/de_DE.cpp +++ b/plugins/builtin/source/lang/de_DE.cpp @@ -780,6 +780,8 @@ namespace hex::plugin::builtin { { "hex.builtin.setting.hex_editor.uppercase_hex", "Hex Zeichen als Grossbuchstaben" }, { "hex.builtin.setting.hex_editor.visualizer", "Data visualizer" }, { "hex.builtin.setting.hex_editor.sync_scrolling", "Editorposition synchronisieren" }, + { "hex.builtin.setting.hex_editor.byte_padding", "Extra Byte-Zellenabstand" }, + { "hex.builtin.setting.hex_editor.char_padding", "Extra Character-Zellenabstand" }, { "hex.builtin.setting.folders", "Ordner" }, { "hex.builtin.setting.folders.description", "Gib zusätzliche Orderpfade an in welchen Pattern, Scripts, Yara Rules und anderes gesucht wird" }, { "hex.builtin.setting.folders.add_folder", "Neuer Ordner hinzufügen" }, diff --git a/plugins/builtin/source/lang/en_US.cpp b/plugins/builtin/source/lang/en_US.cpp index 68beff29c..f29e77cf5 100644 --- a/plugins/builtin/source/lang/en_US.cpp +++ b/plugins/builtin/source/lang/en_US.cpp @@ -784,6 +784,8 @@ namespace hex::plugin::builtin { { "hex.builtin.setting.hex_editor.uppercase_hex", "Upper case Hex characters" }, { "hex.builtin.setting.hex_editor.visualizer", "Data visualizer" }, { "hex.builtin.setting.hex_editor.sync_scrolling", "Synchronize editor position" }, + { "hex.builtin.setting.hex_editor.byte_padding", "Extra byte cell padding" }, + { "hex.builtin.setting.hex_editor.char_padding", "Extra character cell padding" }, { "hex.builtin.setting.folders", "Folders" }, { "hex.builtin.setting.folders.description", "Specify additional search paths for patterns, scripts, Yara rules and more" }, { "hex.builtin.setting.folders.add_folder", "Add new folder" }, diff --git a/plugins/builtin/source/lang/it_IT.cpp b/plugins/builtin/source/lang/it_IT.cpp index 0f86433bd..8e135e6e5 100644 --- a/plugins/builtin/source/lang/it_IT.cpp +++ b/plugins/builtin/source/lang/it_IT.cpp @@ -790,6 +790,8 @@ namespace hex::plugin::builtin { { "hex.builtin.setting.hex_editor.uppercase_hex", "Caratteri esadecimali maiuscoli" }, //{ "hex.builtin.setting.hex_editor.visualizer", "Data visualizer" }, //{ "hex.builtin.setting.hex_editor.sync_scrolling", "Synchronize editor position" }, + //{ "hex.builtin.setting.hex_editor.byte_padding", "Extra byte cell padding" }, + //{ "hex.builtin.setting.hex_editor.char_padding", "Extra character cell padding" }, //{ "hex.builtin.setting.folders", "Folders" }, //{ "hex.builtin.setting.folders.description", "Specify additional search paths for patterns, scripts, rules and more" }, // { "hex.builtin.setting.folders.add_folder", "Add new folder" }, diff --git a/plugins/builtin/source/lang/ja_JP.cpp b/plugins/builtin/source/lang/ja_JP.cpp index b4b1718f0..025bc8712 100644 --- a/plugins/builtin/source/lang/ja_JP.cpp +++ b/plugins/builtin/source/lang/ja_JP.cpp @@ -786,6 +786,8 @@ namespace hex::plugin::builtin { { "hex.builtin.setting.hex_editor.uppercase_hex", "16進数を大文字表記" }, { "hex.builtin.setting.hex_editor.visualizer", "データ表示方式" }, //{ "hex.builtin.setting.hex_editor.sync_scrolling", "Synchronize editor position" }, + //{ "hex.builtin.setting.hex_editor.byte_padding", "Extra byte cell padding" }, + //{ "hex.builtin.setting.hex_editor.char_padding", "Extra character cell padding" }, { "hex.builtin.setting.folders", "フォルダ" }, { "hex.builtin.setting.folders.description", "パターン、スクリプト、ルールなどのための検索パスを指定して追加できます。" }, { "hex.builtin.setting.folders.add_folder", "フォルダを追加…" }, diff --git a/plugins/builtin/source/lang/ko_KR.cpp b/plugins/builtin/source/lang/ko_KR.cpp index 6de04faaf..24fe96e0d 100644 --- a/plugins/builtin/source/lang/ko_KR.cpp +++ b/plugins/builtin/source/lang/ko_KR.cpp @@ -783,6 +783,8 @@ namespace hex::plugin::builtin { { "hex.builtin.setting.hex_editor.uppercase_hex", "16진수 값을 대문자로 표시" }, { "hex.builtin.setting.hex_editor.visualizer", "데이터 표시" }, //{ "hex.builtin.setting.hex_editor.sync_scrolling", "Synchronize editor position" }, + //{ "hex.builtin.setting.hex_editor.byte_padding", "Extra byte cell padding" }, + //{ "hex.builtin.setting.hex_editor.char_padding", "Extra character cell padding" }, { "hex.builtin.setting.folders", "폴더" }, { "hex.builtin.setting.folders.description", "패턴, 스크립트, YARA 규칙 등을 찾아볼 추가적인 폴더 경로를 지정하세요" }, { "hex.builtin.setting.folders.add_folder", "새 폴더 추가" }, diff --git a/plugins/builtin/source/lang/pt_BR.cpp b/plugins/builtin/source/lang/pt_BR.cpp index e3f189b5a..e78a1f73f 100644 --- a/plugins/builtin/source/lang/pt_BR.cpp +++ b/plugins/builtin/source/lang/pt_BR.cpp @@ -782,6 +782,8 @@ namespace hex::plugin::builtin { //{ "hex.builtin.setting.hex_editor.uppercase_hex", "Upper case Hex characters" }, { "hex.builtin.setting.hex_editor.visualizer", "Visualizador de Dados" }, //{ "hex.builtin.setting.hex_editor.sync_scrolling", "Synchronize editor position" }, + //{ "hex.builtin.setting.hex_editor.byte_padding", "Extra byte cell padding" }, + //{ "hex.builtin.setting.hex_editor.char_padding", "Extra character cell padding" }, { "hex.builtin.setting.folders", "Pastas" }, { "hex.builtin.setting.folders.description", "Especifique caminhos de pesquisa adicionais para padrões, scripts, regras Yara e muito mais" }, { "hex.builtin.setting.folders.add_folder", "Adicionar nova pasta" }, diff --git a/plugins/builtin/source/lang/zh_CN.cpp b/plugins/builtin/source/lang/zh_CN.cpp index 6338c1e07..3a2547e14 100644 --- a/plugins/builtin/source/lang/zh_CN.cpp +++ b/plugins/builtin/source/lang/zh_CN.cpp @@ -785,6 +785,8 @@ namespace hex::plugin::builtin { { "hex.builtin.setting.hex_editor.uppercase_hex", "大写十六进制" }, { "hex.builtin.setting.hex_editor.visualizer", "数据处理器的数据可视化格式" }, { "hex.builtin.setting.hex_editor.sync_scrolling", "同步编辑器位置" }, + //{ "hex.builtin.setting.hex_editor.byte_padding", "Extra byte cell padding" }, + //{ "hex.builtin.setting.hex_editor.char_padding", "Extra character cell padding" }, { "hex.builtin.setting.folders", "扩展搜索路径" }, { "hex.builtin.setting.folders.description", "为模式、脚本和规则等指定额外的搜索路径" }, { "hex.builtin.setting.folders.add_folder", "添加新的目录" }, diff --git a/plugins/builtin/source/lang/zh_TW.cpp b/plugins/builtin/source/lang/zh_TW.cpp index c11144c4e..2c2c35e26 100644 --- a/plugins/builtin/source/lang/zh_TW.cpp +++ b/plugins/builtin/source/lang/zh_TW.cpp @@ -782,6 +782,8 @@ namespace hex::plugin::builtin { //{ "hex.builtin.setting.hex_editor.uppercase_hex", "Upper case Hex characters" }, //{ "hex.builtin.setting.hex_editor.visualizer", "Data visualizer" }, //{ "hex.builtin.setting.hex_editor.sync_scrolling", "Synchronize editor position" }, + //{ "hex.builtin.setting.hex_editor.byte_padding", "Extra byte cell padding" }, + //{ "hex.builtin.setting.hex_editor.char_padding", "Extra character cell padding" }, { "hex.builtin.setting.folders", "資料夾" }, //{ "hex.builtin.setting.folders.description", "Specify additional search paths for patterns, scripts, Yara rules and more" }, { "hex.builtin.setting.folders.add_folder", "新增資料夾" },