feat: Highlight patterns in pattern data view that are fully selected
Fixes #1741
This commit is contained in:
parent
c0dde570e4
commit
ea09bfe8ea
@ -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",
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user