From f9a7cdf4dd9c1bcd166cbc94514989e76d3fc627 Mon Sep 17 00:00:00 2001 From: WerWolv Date: Sat, 17 Dec 2022 22:22:20 +0100 Subject: [PATCH] patterns: Improve editing of pattern values --- lib/external/pattern_language | 2 +- plugins/builtin/source/ui/pattern_drawer.cpp | 49 ++++++++++++++++---- 2 files changed, 41 insertions(+), 10 deletions(-) diff --git a/lib/external/pattern_language b/lib/external/pattern_language index d3e81e685..a160fac9d 160000 --- a/lib/external/pattern_language +++ b/lib/external/pattern_language @@ -1 +1 @@ -Subproject commit d3e81e685463416cf2dea4d3ab335b21aa2a39d6 +Subproject commit a160fac9dfc2beabb05196d6434a742d9486fe1b diff --git a/plugins/builtin/source/ui/pattern_drawer.cpp b/plugins/builtin/source/ui/pattern_drawer.cpp index d93567c14..5196c24ad 100644 --- a/plugins/builtin/source/ui/pattern_drawer.cpp +++ b/plugins/builtin/source/ui/pattern_drawer.cpp @@ -276,8 +276,11 @@ namespace hex::plugin::builtin::ui { if (ImGui::BeginCombo("##Enum", pattern.getFormattedValue().c_str())) { auto currValue = pl::core::Token::literalToUnsigned(pattern.getValue()); for (auto &value : pattern.getEnumValues()) { - bool isSelected = pl::core::Token::literalToUnsigned(value.min) <= currValue && pl::core::Token::literalToUnsigned(value.max) >= currValue; - if (ImGui::Selectable(value.name.c_str(), isSelected)) { + auto min = pl::core::Token::literalToUnsigned(value.min); + auto max = pl::core::Token::literalToUnsigned(value.max); + + bool isSelected = min <= currValue && max >= currValue; + if (ImGui::Selectable(fmt::format("{}::{} (0x{:0{}X})", pattern.getTypeName(), value.name, min, pattern.getSize() * 2).c_str(), isSelected)) { pattern.setValue(value.min); } if (isSelected) @@ -296,9 +299,12 @@ namespace hex::plugin::builtin::ui { ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0)); ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x); - auto value = pl::core::Token::literalToFloatingPoint(pattern.getValue()); - if (ImGui::InputDouble("##Value", &value, 0.0, 0.0, "%.6f", ImGuiInputTextFlags_AutoSelectAll | ImGuiInputTextFlags_EnterReturnsTrue)) { - pattern.setValue(value); + auto value = pattern.getFormattedValue(); + if (ImGui::InputText("##Value", value, ImGuiInputTextFlags_AutoSelectAll | ImGuiInputTextFlags_EnterReturnsTrue)) { + MathEvaluator mathEvaluator; + + if (auto result = mathEvaluator.evaluate(value); result.has_value()) + pattern.setValue(double(result.value())); } ImGui::PopItemWidth(); @@ -343,7 +349,7 @@ namespace hex::plugin::builtin::ui { ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x); auto value = pattern.getFormattedValue(); - if (ImGui::InputText("##Value", value.data(), value.size() + 1, ImGuiInputTextFlags_AutoSelectAll | ImGuiInputTextFlags_EnterReturnsTrue)) { + if (ImGui::InputText("##Value", value, ImGuiInputTextFlags_AutoSelectAll | ImGuiInputTextFlags_EnterReturnsTrue)) { MathEvaluator mathEvaluator; if (auto result = mathEvaluator.evaluate(value); result.has_value()) @@ -378,7 +384,20 @@ namespace hex::plugin::builtin::ui { drawOffsetColumn(pattern); drawSizeColumn(pattern); drawTypenameColumn(pattern, "struct"); - ImGui::TextFormatted("{}", pattern.getFormattedValue()); + + if (pattern.getWriteFormatterFunction().empty()) + ImGui::TextFormatted("{}", pattern.getFormattedValue()); + else { + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0)); + ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x); + auto value = pattern.getFormattedValue(); + if (ImGui::InputText("##Value", value, ImGuiInputTextFlags_AutoSelectAll | ImGuiInputTextFlags_EnterReturnsTrue)) { + pattern.setValue(value); + } + ImGui::PopItemWidth(); + ImGui::PopStyleVar(); + } + } if (open) { @@ -408,7 +427,19 @@ namespace hex::plugin::builtin::ui { drawOffsetColumn(pattern); drawSizeColumn(pattern); drawTypenameColumn(pattern, "union"); - ImGui::TextFormatted("{}", pattern.getFormattedValue()); + + if (pattern.getWriteFormatterFunction().empty()) + ImGui::TextFormatted("{}", pattern.getFormattedValue()); + else { + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0)); + ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x); + auto value = pattern.getFormattedValue(); + if (ImGui::InputText("##Value", value, ImGuiInputTextFlags_AutoSelectAll | ImGuiInputTextFlags_EnterReturnsTrue)) { + pattern.setValue(value); + } + ImGui::PopItemWidth(); + ImGui::PopStyleVar(); + } } if (open) { @@ -427,7 +458,7 @@ namespace hex::plugin::builtin::ui { ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0)); ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x); auto value = pattern.getFormattedValue(); - if (ImGui::InputText("##Value", value.data(), value.size() + 1, ImGuiInputTextFlags_AutoSelectAll | ImGuiInputTextFlags_EnterReturnsTrue)) { + if (ImGui::InputText("##Value", value, ImGuiInputTextFlags_AutoSelectAll | ImGuiInputTextFlags_EnterReturnsTrue)) { MathEvaluator mathEvaluator; if (auto result = mathEvaluator.evaluate(value); result.has_value())