Merge pull request #8028 from spycrab/issue_11690
Qt/NewPatchDialog: Fix crashes on entry removal
This commit is contained in:
commit
8feacce783
|
@ -28,7 +28,7 @@ NewPatchDialog::NewPatchDialog(QWidget* parent, PatchEngine::Patch& patch)
|
||||||
|
|
||||||
for (size_t i = 0; i < m_patch.entries.size(); i++)
|
for (size_t i = 0; i < m_patch.entries.size(); i++)
|
||||||
{
|
{
|
||||||
m_entry_layout->addWidget(CreateEntry(static_cast<int>(i)));
|
m_entry_layout->addWidget(CreateEntry(m_patch.entries[i]));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_patch.entries.empty())
|
if (m_patch.entries.empty())
|
||||||
|
@ -81,10 +81,24 @@ void NewPatchDialog::AddEntry()
|
||||||
{
|
{
|
||||||
m_patch.entries.emplace_back();
|
m_patch.entries.emplace_back();
|
||||||
|
|
||||||
m_entry_layout->addWidget(CreateEntry(static_cast<int>(m_patch.entries.size() - 1)));
|
m_entry_layout->addWidget(CreateEntry(m_patch.entries[m_patch.entries.size() - 1]));
|
||||||
}
|
}
|
||||||
|
|
||||||
QGroupBox* NewPatchDialog::CreateEntry(int index)
|
static bool PatchEq(const PatchEngine::PatchEntry& a, const PatchEngine::PatchEntry& b)
|
||||||
|
{
|
||||||
|
if (a.address != b.address)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (a.type != b.type)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (a.value != b.value)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
QGroupBox* NewPatchDialog::CreateEntry(PatchEngine::PatchEntry& entry)
|
||||||
{
|
{
|
||||||
QGroupBox* box = new QGroupBox();
|
QGroupBox* box = new QGroupBox();
|
||||||
|
|
||||||
|
@ -117,9 +131,9 @@ QGroupBox* NewPatchDialog::CreateEntry(int index)
|
||||||
box->setLayout(layout);
|
box->setLayout(layout);
|
||||||
|
|
||||||
connect(offset, static_cast<void (QLineEdit::*)(const QString&)>(&QLineEdit::textEdited),
|
connect(offset, static_cast<void (QLineEdit::*)(const QString&)>(&QLineEdit::textEdited),
|
||||||
[this, index, offset](const QString& text) {
|
[&entry, offset](const QString& text) {
|
||||||
bool okay = true;
|
bool okay = true;
|
||||||
m_patch.entries[index].address = text.toUInt(&okay, 16);
|
entry.address = text.toUInt(&okay, 16);
|
||||||
|
|
||||||
QFont font;
|
QFont font;
|
||||||
QPalette palette;
|
QPalette palette;
|
||||||
|
@ -134,9 +148,9 @@ QGroupBox* NewPatchDialog::CreateEntry(int index)
|
||||||
});
|
});
|
||||||
|
|
||||||
connect(value, static_cast<void (QLineEdit::*)(const QString&)>(&QLineEdit::textEdited),
|
connect(value, static_cast<void (QLineEdit::*)(const QString&)>(&QLineEdit::textEdited),
|
||||||
[this, index, value](const QString& text) {
|
[&entry, value](const QString& text) {
|
||||||
bool okay;
|
bool okay;
|
||||||
m_patch.entries[index].value = text.toUInt(&okay, 16);
|
entry.value = text.toUInt(&okay, 16);
|
||||||
|
|
||||||
QFont font;
|
QFont font;
|
||||||
QPalette palette;
|
QPalette palette;
|
||||||
|
@ -150,39 +164,39 @@ QGroupBox* NewPatchDialog::CreateEntry(int index)
|
||||||
value->setPalette(palette);
|
value->setPalette(palette);
|
||||||
});
|
});
|
||||||
|
|
||||||
connect(remove, &QPushButton::pressed, [this, box, index] {
|
connect(remove, &QPushButton::pressed, [this, box, entry] {
|
||||||
if (m_patch.entries.size() > 1)
|
if (m_patch.entries.size() > 1)
|
||||||
{
|
{
|
||||||
|
box->setVisible(false);
|
||||||
m_entry_layout->removeWidget(box);
|
m_entry_layout->removeWidget(box);
|
||||||
m_patch.entries.erase(m_patch.entries.begin() + index);
|
box->deleteLater();
|
||||||
m_id--;
|
m_patch.entries.erase(
|
||||||
|
std::find_if(m_patch.entries.begin(), m_patch.entries.end(),
|
||||||
|
[entry](const PatchEngine::PatchEntry& e) { return PatchEq(e, entry); }));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
connect(byte, &QRadioButton::toggled, [this, index](bool checked) {
|
connect(byte, &QRadioButton::toggled, [&entry](bool checked) {
|
||||||
if (checked)
|
if (checked)
|
||||||
m_patch.entries[index].type = PatchEngine::PatchType::Patch8Bit;
|
entry.type = PatchEngine::PatchType::Patch8Bit;
|
||||||
});
|
});
|
||||||
|
|
||||||
connect(word, &QRadioButton::toggled, [this, index](bool checked) {
|
connect(word, &QRadioButton::toggled, [&entry](bool checked) {
|
||||||
if (checked)
|
if (checked)
|
||||||
m_patch.entries[index].type = PatchEngine::PatchType::Patch16Bit;
|
entry.type = PatchEngine::PatchType::Patch16Bit;
|
||||||
});
|
});
|
||||||
|
|
||||||
connect(dword, &QRadioButton::toggled, [this, index](bool checked) {
|
connect(dword, &QRadioButton::toggled, [&entry](bool checked) {
|
||||||
if (checked)
|
if (checked)
|
||||||
m_patch.entries[index].type = PatchEngine::PatchType::Patch32Bit;
|
entry.type = PatchEngine::PatchType::Patch32Bit;
|
||||||
});
|
});
|
||||||
|
|
||||||
auto entry_type = m_patch.entries[index].type;
|
byte->setChecked(entry.type == PatchEngine::PatchType::Patch8Bit);
|
||||||
|
word->setChecked(entry.type == PatchEngine::PatchType::Patch16Bit);
|
||||||
|
dword->setChecked(entry.type == PatchEngine::PatchType::Patch32Bit);
|
||||||
|
|
||||||
byte->setChecked(entry_type == PatchEngine::PatchType::Patch8Bit);
|
offset->setText(QStringLiteral("%1").arg(entry.address, 8, 16, QLatin1Char('0')));
|
||||||
word->setChecked(entry_type == PatchEngine::PatchType::Patch16Bit);
|
value->setText(QStringLiteral("%1").arg(entry.value, 8, 16, QLatin1Char('0')));
|
||||||
dword->setChecked(entry_type == PatchEngine::PatchType::Patch32Bit);
|
|
||||||
|
|
||||||
offset->setText(
|
|
||||||
QStringLiteral("%1").arg(m_patch.entries[index].address, 8, 16, QLatin1Char('0')));
|
|
||||||
value->setText(QStringLiteral("%1").arg(m_patch.entries[index].value, 8, 16, QLatin1Char('0')));
|
|
||||||
|
|
||||||
return box;
|
return box;
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
namespace PatchEngine
|
namespace PatchEngine
|
||||||
{
|
{
|
||||||
struct Patch;
|
struct Patch;
|
||||||
|
struct PatchEntry;
|
||||||
}
|
}
|
||||||
|
|
||||||
class QDialogButtonBox;
|
class QDialogButtonBox;
|
||||||
|
@ -32,7 +33,7 @@ private:
|
||||||
|
|
||||||
void accept() override;
|
void accept() override;
|
||||||
|
|
||||||
QGroupBox* CreateEntry(int index);
|
QGroupBox* CreateEntry(PatchEngine::PatchEntry& entry);
|
||||||
|
|
||||||
QLineEdit* m_name_edit;
|
QLineEdit* m_name_edit;
|
||||||
QWidget* m_entry_widget;
|
QWidget* m_entry_widget;
|
||||||
|
@ -43,5 +44,4 @@ private:
|
||||||
std::vector<QLineEdit*> m_edits;
|
std::vector<QLineEdit*> m_edits;
|
||||||
|
|
||||||
PatchEngine::Patch& m_patch;
|
PatchEngine::Patch& m_patch;
|
||||||
int m_id = 0;
|
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue