diff --git a/src/gui/widgets/registers.cc b/src/gui/widgets/registers.cc index 732b020dd..f3d4bacde 100644 --- a/src/gui/widgets/registers.cc +++ b/src/gui/widgets/registers.cc @@ -31,7 +31,7 @@ #include "imgui.h" #include "imgui_stdlib.h" -void PCSX::Widgets::Registers::makeEditableRegister(const char* name, uint32_t reg) { +void PCSX::Widgets::Registers::contextMenu(const char* name, uint32_t reg, uint32_t radix) { std::string contextLabel = fmt::format(f_("Context##{}"), name); if (ImGui::BeginPopupContextItem(contextLabel.c_str())) { if (ImGui::MenuItem(_("Go to in Assembly"))) { @@ -41,18 +41,16 @@ void PCSX::Widgets::Registers::makeEditableRegister(const char* name, uint32_t r g_system->m_eventBus->signal(PCSX::Events::GUI::JumpToMemory{reg, 1}); } if (ImGui::MenuItem(_("Copy Value"))) { - char strVal[10]; - std::snprintf(strVal, sizeof(strVal), "%8.8x", reg); + char strVal[20]; + if (radix == 16) { + std::snprintf(strVal, sizeof(strVal), "%8.8x", reg); + } else { + std::snprintf(strVal, sizeof(strVal), "%d", (int32_t)reg); + } ImGui::SetClipboardText(strVal); } ImGui::EndPopup(); - } - ImGui::SameLine(); - std::string label = fmt::format(f_("Edit##{}"), name); - if (ImGui::SmallButton(label.c_str())) { - m_editorToOpen = fmt::format(f_("Edit value of {}"), name); - snprintf(m_registerEditor, 19, "%08x", reg); - } + } } static constexpr std::string_view irqName(unsigned n) { @@ -105,6 +103,25 @@ static constexpr std::string_view dmaName(unsigned n) { } } +void PCSX::Widgets::Registers::updateRegisterValue(PCSX::psxRegisters* registers, const std::string& val, int reg, + int radix) { + uint32_t newReg; + char* endPtr; + if (radix == 16) { + newReg = strtoul(val.c_str(), &endPtr, 16); + } else { + newReg = strtoll(val.c_str(), &endPtr, 10); + } + if (!*endPtr) { + if (reg == 34) { + registers->pc = newReg; + } else { + registers->GPR.r[reg] = newReg; + } + } +} + + void PCSX::Widgets::Registers::draw(PCSX::GUI* gui, PCSX::psxRegisters* registers, PCSX::Memory* memory, const char* title) { ImGui::SetNextWindowPos(ImVec2(1040, 20), ImGuiCond_FirstUseEver); @@ -118,6 +135,18 @@ void PCSX::Widgets::Registers::draw(PCSX::GUI* gui, PCSX::psxRegisters* register gui->useMonoFont(); if (ImGui::BeginTabItem("GPR")) { unsigned counter = 0; + + static const uint8_t colorIndices[34] = {0, 1, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 1, + 1, 1, 1, 1, 1, 1, 1, 2, 2, 0, 0, 1, 1, 1, 1, 0, 0}; + + static const ImVec4 colors[3] = { + ImVec4(0.5f, 0.5f, 0.5f, 1.0f), + ImVec4(0.0f, 1.0f, 1.0f, 1.0f), + ImVec4(1.0f, 1.0f, 1.0f, 1.0f), + }; + + ImGui::PushItemWidth(100); + for (auto& reg : registers->GPR.r) { const char* name; if (counter >= 32) { @@ -135,13 +164,47 @@ void PCSX::Widgets::Registers::draw(PCSX::GUI* gui, PCSX::psxRegisters* register } else { name = PCSX::Disasm::s_disRNameGPR[counter]; } - ImGui::Text("%s: %08x", name, reg); - makeEditableRegister(name, reg); + + ImGui::TextColored(colors[colorIndices[counter]], "%s:", name); + ImGui::SameLine(); + + char label[8]; + std::snprintf(label, sizeof(label), "##%2d", counter); + std::string val = fmt::format("{0:08x}", reg); + if (ImGui::InputText(label, &val, ((counter == 0) ? ImGuiInputTextFlags_ReadOnly : 0) | ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_EnterReturnsTrue | ImGuiInputTextFlags_AutoSelectAll)) { + updateRegisterValue(registers, val, counter, 16); + } + + if (counter > 0) { + contextMenu(label, reg, 16); + ImGui::SameLine(); + ImGui::PushItemWidth(120); + + char label2[8]; + std::snprintf(label2, sizeof(label2), "##i%2d", counter); + std::string val2 = fmt::format("{0}", (int32_t)reg); + if (ImGui::InputText(label2, &val2, ImGuiInputTextFlags_CharsDecimal | ImGuiInputTextFlags_EnterReturnsTrue | + ImGuiInputTextFlags_AutoSelectAll)) { + updateRegisterValue(registers, val2, counter, 10); + } + std::snprintf(label2, sizeof(label2), "##ic%2d", counter); + contextMenu(label2, reg, 10); + ImGui::PopItemWidth(); + } + counter++; } + ImGui::Separator(); - ImGui::Text("pc: %08x", registers->pc); - makeEditableRegister("pc", registers->pc); + ImGui::Text("pc:"); + ImGui::SameLine(); + std::string valPC = fmt::format("{0:08x}", registers->pc); + if (ImGui::InputText("##pc", &valPC, ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_EnterReturnsTrue | ImGuiInputTextFlags_AutoSelectAll)) { + updateRegisterValue(registers, valPC, counter, 16); + } + contextMenu("##pc", registers->pc, 16); + ImGui::PopItemWidth(); + ImGui::EndTabItem(); } if (ImGui::BeginTabItem("CP0")) { @@ -342,8 +405,18 @@ void PCSX::Widgets::Registers::draw(PCSX::GUI* gui, PCSX::psxRegisters* register ImGui::EndTabItem(); } if (ImGui::BeginTabItem(_("Misc"))) { - ImGui::Text("pc : %08x", registers->pc); - makeEditableRegister("pc", registers->pc); + ImGui::Text("pc :"); + ImGui::SameLine(); + ImGui::PushItemWidth(100); + std::string val = fmt::format("{0:08x}", registers->pc); + if (ImGui::InputText("##pc", &val, ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_EnterReturnsTrue | + ImGuiInputTextFlags_AutoSelectAll)) { + updateRegisterValue(registers, val, 34, 16); + } + contextMenu("##pc", registers->pc, 16); + + ImGui::PopItemWidth(); + ImGui::Text("cycle: %08x", registers->cycle); ImGui::Text("int : %08x", registers->interrupt); ImGui::Separator(); @@ -426,49 +499,4 @@ void PCSX::Widgets::Registers::draw(PCSX::GUI* gui, PCSX::psxRegisters* register } ImGui::End(); - - if (!m_editorToOpen.empty()) { - ImGui::OpenPopup(m_editorToOpen.c_str()); - m_editorToOpen = ""; - } - for (unsigned counter = 0; counter < 35; counter++) { - const char* name; - if (counter >= 32) { - switch (counter) { - case 32: - name = "hi"; - break; - case 33: - name = "lo"; - break; - case 34: - name = "pc"; - break; - default: - name = "??"; - break; - } - } else { - name = PCSX::Disasm::s_disRNameGPR[counter]; - } - std::string editor = fmt::format(f_("Edit value of {}"), name); - if (ImGui::BeginPopupModal(editor.c_str(), nullptr, ImGuiWindowFlags_AlwaysAutoResize)) { - ImGui::Text(_("Change the value of register %s:"), name); - if (ImGui::InputText(_("Register"), m_registerEditor, 20, - ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_EnterReturnsTrue)) { - char* endPtr; - uint32_t newReg = strtoul(m_registerEditor, &endPtr, 16); - if (!*endPtr) { - if (counter == 34) { - registers->pc = newReg; - } else { - registers->GPR.r[counter] = newReg; - } - ImGui::CloseCurrentPopup(); - } - } - if (ImGui::Button(_("Cancel"))) ImGui::CloseCurrentPopup(); - ImGui::EndPopup(); - } - } } diff --git a/src/gui/widgets/registers.h b/src/gui/widgets/registers.h index 37efc4a23..6278de6f6 100644 --- a/src/gui/widgets/registers.h +++ b/src/gui/widgets/registers.h @@ -37,16 +37,14 @@ class Registers { bool& m_show; private: - void makeEditableRegister(const char* name, uint32_t reg); + void contextMenu(const char* name, uint32_t reg, uint32_t radix); + void updateRegisterValue(PCSX::psxRegisters* registers, const std::string& val, int reg, int radix); template static float fixedToFloat(int32_t value) { return static_cast(value) / static_cast(1 << Fract); } - unsigned m_selected = 0; bool m_showFixed = false; - char m_registerEditor[20]; - std::string m_editorToOpen; }; } // namespace Widgets