mirror of
https://github.com/WerWolv/ImHex.git
synced 2026-03-30 21:05:56 -05:00
Added math evaluator / calculator to tools window
This commit is contained in:
@@ -2,8 +2,9 @@
|
||||
|
||||
#include <cstring>
|
||||
#include <regex>
|
||||
#include <optional>
|
||||
|
||||
#include "utils.hpp"
|
||||
#include "helpers/utils.hpp"
|
||||
|
||||
#include <llvm/Demangle/Demangle.h>
|
||||
|
||||
@@ -11,7 +12,6 @@ namespace hex {
|
||||
|
||||
ViewTools::ViewTools() : View("Tools") {
|
||||
this->m_mangledBuffer = new char[0xF'FFFF];
|
||||
|
||||
std::memset(this->m_mangledBuffer, 0x00, 0xF'FFFF);
|
||||
|
||||
this->m_regexInput = new char[0xF'FFFF];
|
||||
@@ -20,6 +20,19 @@ namespace hex {
|
||||
std::memset(this->m_regexInput, 0x00, 0xF'FFFF);
|
||||
std::memset(this->m_regexPattern, 0x00, 0xF'FFFF);
|
||||
std::memset(this->m_replacePattern, 0x00, 0xF'FFFF);
|
||||
|
||||
|
||||
this->m_mathInput = new char[0xFFFF];
|
||||
std::memset(this->m_mathInput, 0x00, 0xFFFF);
|
||||
this->m_mathEvaluator.registerStandardVariables();
|
||||
this->m_mathEvaluator.registerStandardFunctions();
|
||||
this->m_mathEvaluator.setFunction("clear", [this](auto args) -> std::optional<long double> {
|
||||
this->m_mathHistory.clear();
|
||||
this->m_lastMathError.clear();
|
||||
std::memset(this->m_mathInput, 0x00, 0xFFFF);
|
||||
|
||||
return { };
|
||||
}, 0, 0);
|
||||
}
|
||||
|
||||
ViewTools::~ViewTools() {
|
||||
@@ -28,6 +41,8 @@ namespace hex {
|
||||
delete[] this->m_regexInput;
|
||||
delete[] this->m_regexPattern;
|
||||
delete[] this->m_replacePattern;
|
||||
|
||||
delete[] this->m_mathInput;
|
||||
}
|
||||
|
||||
void ViewTools::drawDemangler() {
|
||||
@@ -124,12 +139,131 @@ namespace hex {
|
||||
}
|
||||
}
|
||||
|
||||
void ViewTools::drawMathEvaluator() {
|
||||
if (ImGui::CollapsingHeader("Calculator")) {
|
||||
if (ImGui::InputText("Input", this->m_mathInput, 0xFFFF, ImGuiInputTextFlags_EnterReturnsTrue | ImGuiInputTextFlags_AutoSelectAll)) {
|
||||
ImGui::SetKeyboardFocusHere();
|
||||
std::optional<long double> result;
|
||||
|
||||
try {
|
||||
result = this->m_mathEvaluator.evaluate(this->m_mathInput);
|
||||
} catch (std::invalid_argument &e) {
|
||||
this->m_lastMathError = e.what();
|
||||
}
|
||||
|
||||
if (result.has_value()) {
|
||||
this->m_mathHistory.push_back(result.value());
|
||||
std::memset(this->m_mathInput, 0x00, 0xFFFF);
|
||||
this->m_lastMathError.clear();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (!this->m_lastMathError.empty())
|
||||
ImGui::TextColored(ImColor(0xA00040FF), "Last Error: %s", this->m_lastMathError.c_str());
|
||||
else
|
||||
ImGui::NewLine();
|
||||
|
||||
enum class MathDisplayType { Standard, Scientific, Programmer } mathDisplayType;
|
||||
if (ImGui::BeginTabBar("##mathFormatTabBar")) {
|
||||
if (ImGui::BeginTabItem("Standard")) {
|
||||
mathDisplayType = MathDisplayType::Standard;
|
||||
ImGui::EndTabItem();
|
||||
}
|
||||
if (ImGui::BeginTabItem("Scientific")) {
|
||||
mathDisplayType = MathDisplayType::Scientific;
|
||||
ImGui::EndTabItem();
|
||||
}
|
||||
if (ImGui::BeginTabItem("Programmer")) {
|
||||
mathDisplayType = MathDisplayType::Programmer;
|
||||
ImGui::EndTabItem();
|
||||
}
|
||||
|
||||
ImGui::EndTabBar();
|
||||
}
|
||||
|
||||
if (ImGui::BeginTable("##mathWrapper", 2)) {
|
||||
ImGui::TableSetupColumn("##results");
|
||||
ImGui::TableSetupColumn("##variables", ImGuiTableColumnFlags_WidthStretch, 0.7);
|
||||
|
||||
ImGui::TableNextRow();
|
||||
ImGui::TableNextColumn();
|
||||
if (ImGui::BeginTable("##mathHistory", 1, ImGuiTableFlags_ScrollY | ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg, ImVec2(0, 400))) {
|
||||
ImGui::TableSetupScrollFreeze(0, 1);
|
||||
ImGui::TableSetupColumn("History");
|
||||
|
||||
ImGuiListClipper clipper;
|
||||
clipper.Begin(this->m_mathHistory.size());
|
||||
|
||||
ImGui::TableHeadersRow();
|
||||
while (clipper.Step()) {
|
||||
for (u64 i = clipper.DisplayStart; i < clipper.DisplayEnd; i++) {
|
||||
ImGui::TableNextRow();
|
||||
ImGui::TableNextColumn();
|
||||
|
||||
switch (mathDisplayType) {
|
||||
case MathDisplayType::Standard:
|
||||
ImGui::Text("%.3Lf", this->m_mathHistory[(this->m_mathHistory.size() - 1) - i]);
|
||||
break;
|
||||
case MathDisplayType::Scientific:
|
||||
ImGui::Text("%.6Le", this->m_mathHistory[(this->m_mathHistory.size() - 1) - i]);
|
||||
break;
|
||||
case MathDisplayType::Programmer:
|
||||
ImGui::Text("0x%llX (%llu)",
|
||||
u64(this->m_mathHistory[(this->m_mathHistory.size() - 1) - i]),
|
||||
u64(this->m_mathHistory[(this->m_mathHistory.size() - 1) - i]));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
clipper.End();
|
||||
|
||||
ImGui::EndTable();
|
||||
}
|
||||
|
||||
ImGui::TableNextColumn();
|
||||
if (ImGui::BeginTable("##mathVariables", 2, ImGuiTableFlags_ScrollY | ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg, ImVec2(0, 400))) {
|
||||
ImGui::TableSetupScrollFreeze(0, 1);
|
||||
ImGui::TableSetupColumn("Name");
|
||||
ImGui::TableSetupColumn("Value");
|
||||
|
||||
ImGui::TableHeadersRow();
|
||||
for (const auto &[name, value] : this->m_mathEvaluator.getVariables()) {
|
||||
ImGui::TableNextRow();
|
||||
ImGui::TableNextColumn();
|
||||
ImGui::TextUnformatted(name.c_str());
|
||||
|
||||
ImGui::TableNextColumn();
|
||||
switch (mathDisplayType) {
|
||||
case MathDisplayType::Standard:
|
||||
ImGui::Text("%.3Lf", value);
|
||||
break;
|
||||
case MathDisplayType::Scientific:
|
||||
ImGui::Text("%.6Le", value);
|
||||
break;
|
||||
case MathDisplayType::Programmer:
|
||||
ImGui::Text("0x%llX (%llu)", u64(value), u64(value));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
ImGui::EndTable();
|
||||
}
|
||||
|
||||
ImGui::EndTable();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void ViewTools::createView() {
|
||||
if (ImGui::Begin("Tools", &this->getWindowOpenState(), ImGuiWindowFlags_NoCollapse)) {
|
||||
|
||||
this->drawDemangler();
|
||||
this->drawASCIITable();
|
||||
this->drawRegexReplacer();
|
||||
this->drawMathEvaluator();
|
||||
this->drawColorPicker();
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user