1
0
mirror of synced 2024-12-01 02:37:18 +01:00

feat: Highlight patterns in pattern data view that are fully selected

Fixes #1741
This commit is contained in:
WerWolv 2024-06-07 19:59:11 +02:00
parent c0dde570e4
commit ea09bfe8ea
2 changed files with 19 additions and 7 deletions

View File

@ -90,7 +90,7 @@
"advanced-encoding-multi": "#F1C40FFF", "advanced-encoding-multi": "#F1C40FFF",
"advanced-encoding-unknown": "#E74C3CFF", "advanced-encoding-unknown": "#E74C3CFF",
"patches": "#E74C3CFF", "patches": "#E74C3CFF",
"pattern-selected": "#06539BFF" "pattern-selected": "#3683CBFF"
}, },
"imnodes": { "imnodes": {
"box-selector": "#3D85E01E", "box-selector": "#3D85E01E",

View File

@ -44,7 +44,7 @@ namespace hex::ui {
using namespace ::std::literals::string_literals; using namespace ::std::literals::string_literals;
bool isPatternSelected(u64 address, u64 size) { bool isPatternOverlapSelected(u64 address, u64 size) {
auto currSelection = ImHexApi::HexEditor::getSelection(); auto currSelection = ImHexApi::HexEditor::getSelection();
if (!currSelection.has_value()) if (!currSelection.has_value())
return false; return false;
@ -52,26 +52,38 @@ namespace hex::ui {
return Region{ address, size }.overlaps(*currSelection); return Region{ address, size }.overlaps(*currSelection);
} }
bool isPatternFullySelected(u64 address, u64 size) {
auto currSelection = ImHexApi::HexEditor::getSelection();
if (!currSelection.has_value())
return false;
return currSelection->address == address && currSelection->size == size;
}
template<typename T> template<typename T>
auto highlightWhenSelected(u64 address, u64 size, const T &callback) { auto highlightWhenSelected(u64 address, u64 size, const T &callback) {
constexpr static bool HasReturn = !requires(T t) { { t() } -> std::same_as<void>; }; constexpr static bool HasReturn = !requires(T t) { { t() } -> std::same_as<void>; };
auto selected = isPatternSelected(address, size); const auto overlapSelected = isPatternOverlapSelected(address, size);
const auto fullySelected = isPatternFullySelected(address, size);
if (selected) const u32 selectionColor = ImColor(ImGuiExt::GetCustomColorVec4(ImGuiCustomCol_PatternSelected));
ImGui::PushStyleColor(ImGuiCol_Text, ImGuiExt::GetCustomColorVec4(ImGuiCustomCol_PatternSelected)); if (overlapSelected)
ImGui::PushStyleColor(ImGuiCol_Text, selectionColor);
if (fullySelected)
ImGui::TableSetBgColor(ImGuiTableBgTarget_RowBg0, (selectionColor & 0x00'FF'FF'FF) | 0x30'00'00'00);
if constexpr (HasReturn) { if constexpr (HasReturn) {
auto result = callback(); auto result = callback();
if (selected) if (overlapSelected)
ImGui::PopStyleColor(); ImGui::PopStyleColor();
return result; return result;
} else { } else {
callback(); callback();
if (selected) if (overlapSelected)
ImGui::PopStyleColor(); ImGui::PopStyleColor();
} }
} }