mirror of https://github.com/WerWolv/ImHex
feat: Added hex editor minimap option to shade cells based on the byte's value
This commit is contained in:
parent
980438008c
commit
f4753a5bd8
|
|
@ -802,7 +802,7 @@ namespace hex::plugin::builtin {
|
||||||
ImGui::PopStyleVar();
|
ImGui::PopStyleVar();
|
||||||
|
|
||||||
// Right click menu
|
// Right click menu
|
||||||
if (ImGui::IsMouseDown(ImGuiMouseButton_Right) && ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows) && !ImGui::IsAnyItemHovered() && !ImGui::IsMouseDragging(ImGuiMouseButton_Right)) {
|
if (ImGui::IsMouseClicked(ImGuiMouseButton_Right) && ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows) && !ImGui::IsAnyItemHovered() && !ImGui::IsMouseDragging(ImGuiMouseButton_Right)) {
|
||||||
RequestOpenPopup::post("hex.builtin.menu.edit");
|
RequestOpenPopup::post("hex.builtin.menu.edit");
|
||||||
ImGui::SetWindowFocus();
|
ImGui::SetWindowFocus();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -111,6 +111,7 @@ namespace hex::ui {
|
||||||
void drawTooltip(u64 address, const u8 *data, size_t size) const;
|
void drawTooltip(u64 address, const u8 *data, size_t size) const;
|
||||||
void drawScrollbar(ImVec2 characterSize);
|
void drawScrollbar(ImVec2 characterSize);
|
||||||
void drawMinimap(ImVec2 characterSize);
|
void drawMinimap(ImVec2 characterSize);
|
||||||
|
void drawMinimapPopup();
|
||||||
|
|
||||||
void handleSelection(u64 address, u32 bytesPerCell, const u8 *data, bool cellHovered);
|
void handleSelection(u64 address, u32 bytesPerCell, const u8 *data, bool cellHovered);
|
||||||
std::optional<color_t> applySelectionColor(u64 byteAddress, std::optional<color_t> color);
|
std::optional<color_t> applySelectionColor(u64 byteAddress, std::optional<color_t> color);
|
||||||
|
|
@ -440,6 +441,7 @@ namespace hex::ui {
|
||||||
bool m_showMiniMap = false;
|
bool m_showMiniMap = false;
|
||||||
bool m_showSelectionInFooter = false;
|
bool m_showSelectionInFooter = false;
|
||||||
int m_miniMapWidth = 5;
|
int m_miniMapWidth = 5;
|
||||||
|
bool m_minimapValueBrightness = true;
|
||||||
u32 m_byteCellPadding = 0, m_characterCellPadding = 0;
|
u32 m_byteCellPadding = 0, m_characterCellPadding = 0;
|
||||||
bool m_footerCollapsed = true;
|
bool m_footerCollapsed = true;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -100,6 +100,7 @@
|
||||||
"hex.ui.hex_editor.no_separator": "No Segment Separators",
|
"hex.ui.hex_editor.no_separator": "No Segment Separators",
|
||||||
"hex.ui.hex_editor.uppercase_hex": "Upper case Hex characters",
|
"hex.ui.hex_editor.uppercase_hex": "Upper case Hex characters",
|
||||||
"hex.ui.hex_editor.visualizer": "Data visualizer",
|
"hex.ui.hex_editor.visualizer": "Data visualizer",
|
||||||
|
"hex.ui.hex_editor.minimap.value_brightness": "Shade cells based on value",
|
||||||
"hex.ui.pattern_drawer.color": "Color",
|
"hex.ui.pattern_drawer.color": "Color",
|
||||||
"hex.ui.pattern_drawer.comment": "Comment",
|
"hex.ui.pattern_drawer.comment": "Comment",
|
||||||
"hex.ui.pattern_drawer.double_click": "Double-click to see more items",
|
"hex.ui.pattern_drawer.double_click": "Double-click to see more items",
|
||||||
|
|
|
||||||
|
|
@ -318,6 +318,13 @@ namespace hex::ui {
|
||||||
(std::ceil(innerRect.Max.y - innerRect.Min.y) / characterSize.y),
|
(std::ceil(innerRect.Max.y - innerRect.Min.y) / characterSize.y),
|
||||||
std::nextafterf((numRows - m_visibleRowCount) + ImGui::GetWindowSize().y / characterSize.y, std::numeric_limits<float>::max()),
|
std::nextafterf((numRows - m_visibleRowCount) + ImGui::GetWindowSize().y / characterSize.y, std::numeric_limits<float>::max()),
|
||||||
roundingCorners);
|
roundingCorners);
|
||||||
|
|
||||||
|
if (ImGui::IsItemHovered() && ImGui::IsMouseClicked(ImGuiMouseButton_Right)) {
|
||||||
|
ImGui::OpenPopup("MiniMapOptions");
|
||||||
|
}
|
||||||
|
|
||||||
|
drawMinimapPopup();
|
||||||
|
|
||||||
ImGui::PopStyleVar(2);
|
ImGui::PopStyleVar(2);
|
||||||
ImGui::PopStyleColor(3);
|
ImGui::PopStyleColor(3);
|
||||||
ImGui::PopID();
|
ImGui::PopID();
|
||||||
|
|
@ -339,7 +346,13 @@ namespace hex::ui {
|
||||||
|
|
||||||
const auto cellSize = rowSize / ImVec2(rowColors.size(), 1);
|
const auto cellSize = rowSize / ImVec2(rowColors.size(), 1);
|
||||||
ImVec2 cellPos = rowStart;
|
ImVec2 cellPos = rowStart;
|
||||||
for (const auto &rowColor : rowColors) {
|
const auto stride = bytesPerRow / rowColors.size();
|
||||||
|
for (u32 i = 0; i < rowColors.size(); i += 1) {
|
||||||
|
auto rowColor = rowColors[i];
|
||||||
|
if (m_minimapValueBrightness) {
|
||||||
|
rowColor = ImColor(rowColor.Value + ImVec4(0.3F, 0.3F, 0.3F, 0.0F) * ((float(rowData[i * stride]) - 0x7F) / 0xFF));
|
||||||
|
}
|
||||||
|
|
||||||
drawList->AddRectFilled(cellPos, cellPos + cellSize, rowColor);
|
drawList->AddRectFilled(cellPos, cellPos + cellSize, rowColor);
|
||||||
cellPos.x += cellSize.x;
|
cellPos.x += cellSize.x;
|
||||||
}
|
}
|
||||||
|
|
@ -1087,6 +1100,27 @@ namespace hex::ui {
|
||||||
m_shouldScrollToSelection = false;
|
m_shouldScrollToSelection = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HexEditor::drawMinimapPopup() {
|
||||||
|
if (ImGui::BeginPopup("MiniMapOptions")) {
|
||||||
|
ImGui::SliderInt("hex.ui.hex_editor.minimap.width"_lang, &m_miniMapWidth, 1, 25, "%d", ImGuiSliderFlags_AlwaysClamp);
|
||||||
|
|
||||||
|
if (ImGui::BeginCombo("##minimap_visualizer", Lang(m_miniMapVisualizer->unlocalizedName))) {
|
||||||
|
|
||||||
|
for (const auto &visualizer : ContentRegistry::HexEditor::impl::getMiniMapVisualizers()) {
|
||||||
|
if (ImGui::Selectable(Lang(visualizer->unlocalizedName))) {
|
||||||
|
m_miniMapVisualizer = visualizer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::EndCombo();
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::Checkbox("hex.ui.hex_editor.minimap.value_brightness"_lang, &m_minimapValueBrightness);
|
||||||
|
|
||||||
|
ImGui::EndPopup();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void HexEditor::drawFooter(const ImVec2 &size) {
|
void HexEditor::drawFooter(const ImVec2 &size) {
|
||||||
const auto windowEndPos = ImGui::GetWindowPos() + size - ImGui::GetStyle().WindowPadding;
|
const auto windowEndPos = ImGui::GetWindowPos() + size - ImGui::GetStyle().WindowPadding;
|
||||||
ImGui::GetWindowDrawList()->AddLine(windowEndPos - ImVec2(0, size.y - 1_scaled), windowEndPos - size + ImVec2(0, 1_scaled), ImGui::GetColorU32(ImGuiCol_Separator), 2.0_scaled);
|
ImGui::GetWindowDrawList()->AddLine(windowEndPos - ImVec2(0, size.y - 1_scaled), windowEndPos - size + ImVec2(0, 1_scaled), ImGui::GetColorU32(ImGuiCol_Separator), 2.0_scaled);
|
||||||
|
|
@ -1152,22 +1186,7 @@ namespace hex::ui {
|
||||||
if (ImGui::IsItemClicked(ImGuiMouseButton_Right) && m_miniMapVisualizer != nullptr)
|
if (ImGui::IsItemClicked(ImGuiMouseButton_Right) && m_miniMapVisualizer != nullptr)
|
||||||
ImGui::OpenPopup("MiniMapOptions");
|
ImGui::OpenPopup("MiniMapOptions");
|
||||||
|
|
||||||
if (ImGui::BeginPopup("MiniMapOptions")) {
|
drawMinimapPopup();
|
||||||
ImGui::SliderInt("hex.ui.hex_editor.minimap.width"_lang, &m_miniMapWidth, 1, 25, "%d", ImGuiSliderFlags_AlwaysClamp);
|
|
||||||
|
|
||||||
if (ImGui::BeginCombo("##minimap_visualizer", Lang(m_miniMapVisualizer->unlocalizedName))) {
|
|
||||||
|
|
||||||
for (const auto &visualizer : ContentRegistry::HexEditor::impl::getMiniMapVisualizers()) {
|
|
||||||
if (ImGui::Selectable(Lang(visualizer->unlocalizedName))) {
|
|
||||||
m_miniMapVisualizer = visualizer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ImGui::EndCombo();
|
|
||||||
}
|
|
||||||
|
|
||||||
ImGui::EndPopup();
|
|
||||||
}
|
|
||||||
|
|
||||||
ImGui::SameLine(0, 1_scaled);
|
ImGui::SameLine(0, 1_scaled);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue