Skip to content

Commit

Permalink
Merge pull request #8030 from spycrab/qt_patch_preview
Browse files Browse the repository at this point in the history
Qt/Debugger: Implement patch instruction preview
  • Loading branch information
spycrab committed Apr 27, 2019
2 parents 347f22e + f6e73a0 commit 906ccdb
Show file tree
Hide file tree
Showing 5 changed files with 110 additions and 8 deletions.
1 change: 1 addition & 0 deletions Source/Core/DolphinQt/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ add_executable(dolphin-emu
Debugger/MemoryViewWidget.cpp
Debugger/MemoryWidget.cpp
Debugger/NewBreakpointDialog.cpp
Debugger/PatchInstructionDialog.cpp
Debugger/RegisterColumn.cpp
Debugger/RegisterWidget.cpp
Debugger/WatchWidget.cpp
Expand Down
12 changes: 4 additions & 8 deletions Source/Core/DolphinQt/Debugger/CodeViewWidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#include "Core/PowerPC/PPCAnalyst.h"
#include "Core/PowerPC/PPCSymbolDB.h"
#include "Core/PowerPC/PowerPC.h"
#include "DolphinQt/Debugger/PatchInstructionDialog.h"
#include "DolphinQt/Resources.h"
#include "DolphinQt/Settings.h"

Expand Down Expand Up @@ -463,17 +464,12 @@ void CodeViewWidget::OnReplaceInstruction()
if (!read_result.valid)
return;

bool good;
QString name = QInputDialog::getText(
this, tr("Change instruction"), tr("New instruction:"), QLineEdit::Normal,
QStringLiteral("%1").arg(read_result.hex, 8, 16, QLatin1Char('0')), &good);

u32 code = name.toUInt(&good, 16);
PatchInstructionDialog dialog(this, addr, PowerPC::debug_interface.ReadInstruction(addr));

if (good)
if (dialog.exec() == QDialog::Accepted)
{
PowerPC::debug_interface.UnsetPatch(addr);
PowerPC::debug_interface.SetPatch(addr, code);
PowerPC::debug_interface.SetPatch(addr, dialog.GetCode());
Update();
}
}
Expand Down
67 changes: 67 additions & 0 deletions Source/Core/DolphinQt/Debugger/PatchInstructionDialog.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
// Copyright 2019 Dolphin Emulator Project
// Licensed under GPLv2+
// Refer to the license.txt file included.

#include "DolphinQt/Debugger/PatchInstructionDialog.h"

#include <QDialogButtonBox>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QVBoxLayout>

#include "Common/GekkoDisassembler.h"

PatchInstructionDialog::PatchInstructionDialog(QWidget* parent, u32 address, u32 value)
: QDialog(parent), m_address(address)
{
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
setWindowModality(Qt::WindowModal);
setWindowTitle(tr("Instruction"));

CreateWidgets();
ConnectWidgets();

m_input_edit->setText(QStringLiteral("%1").arg(value, 8, 16, QLatin1Char('0')));
}

void PatchInstructionDialog::CreateWidgets()
{
auto* layout = new QVBoxLayout;

m_input_edit = new QLineEdit;
m_preview_label = new QLabel;
m_button_box = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);

layout->addWidget(new QLabel(tr("New instruction:")));
layout->addWidget(m_input_edit);
layout->addWidget(m_preview_label);
layout->addWidget(m_button_box);

setLayout(layout);
}

void PatchInstructionDialog::ConnectWidgets()
{
connect(m_button_box, &QDialogButtonBox::accepted, this, &QDialog::accept);
connect(m_button_box, &QDialogButtonBox::rejected, this, &QDialog::reject);

connect(m_input_edit, &QLineEdit::textChanged, this, &PatchInstructionDialog::OnEditChanged);
}

void PatchInstructionDialog::OnEditChanged()
{
bool good;
m_code = m_input_edit->text().toUInt(&good, 16);

m_button_box->button(QDialogButtonBox::Ok)->setEnabled(good);

m_preview_label->setText(
tr("Instruction: %1")
.arg(QString::fromStdString(Common::GekkoDisassembler::Disassemble(m_code, m_address))));
}

u32 PatchInstructionDialog::GetCode() const
{
return m_code;
}
35 changes: 35 additions & 0 deletions Source/Core/DolphinQt/Debugger/PatchInstructionDialog.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// Copyright 2019 Dolphin Emulator Project
// Licensed under GPLv2+
// Refer to the license.txt file included.

#pragma once

#include <QDialog>

#include "Common/CommonTypes.h"

class QDialogButtonBox;
class QLabel;
class QLineEdit;

class PatchInstructionDialog : public QDialog
{
Q_OBJECT
public:
explicit PatchInstructionDialog(QWidget* parent, u32 address, u32 value);

u32 GetCode() const;

private:
void CreateWidgets();
void ConnectWidgets();

void OnEditChanged();

u32 m_code;
u32 m_address;

QLineEdit* m_input_edit;
QLabel* m_preview_label;
QDialogButtonBox* m_button_box;
};
3 changes: 3 additions & 0 deletions Source/Core/DolphinQt/DolphinQt.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,7 @@
<QtMoc Include="Debugger\MemoryWidget.h" />
<QtMoc Include="Debugger\MemoryViewWidget.h" />
<QtMoc Include="Debugger\NewBreakpointDialog.h" />
<QtMoc Include="Debugger\PatchInstructionDialog.h" />
<QtMoc Include="Debugger\RegisterWidget.h" />
<QtMoc Include="Debugger\WatchWidget.h" />
<QtMoc Include="GCMemcardManager.h" />
Expand Down Expand Up @@ -255,6 +256,7 @@
<ClCompile Include="$(QtMocOutPrefix)NewPatchDialog.cpp" />
<ClCompile Include="$(QtMocOutPrefix)PadMappingDialog.cpp" />
<ClCompile Include="$(QtMocOutPrefix)PatchesWidget.cpp" />
<ClCompile Include="$(QtMocOutPrefix)PatchInstructionDialog.cpp" />
<ClCompile Include="$(QtMocOutPrefix)PathPane.cpp" />
<ClCompile Include="$(QtMocOutPrefix)PostProcessingConfigWindow.cpp" />
<ClCompile Include="$(QtMocOutPrefix)PropertiesDialog.cpp" />
Expand Down Expand Up @@ -351,6 +353,7 @@
<ClCompile Include="TAS\IRWidget.cpp" />
<ClCompile Include="Debugger\BreakpointWidget.cpp" />
<ClCompile Include="Debugger\NewBreakpointDialog.cpp" />
<ClCompile Include="Debugger\PatchInstructionDialog.cpp" />
<ClCompile Include="Debugger\RegisterColumn.cpp" />
<ClCompile Include="Debugger\RegisterWidget.cpp" />
<ClCompile Include="Debugger\WatchWidget.cpp" />
Expand Down

0 comments on commit 906ccdb

Please sign in to comment.