Merge pull request #8028 from spycrab/issue_11690

Qt/NewPatchDialog: Fix crashes on entry removal
This commit is contained in:
spycrab 2019-04-24 02:49:09 +02:00 committed by GitHub
commit 8feacce783
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 40 additions and 26 deletions

View File

@ -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;
} }

View File

@ -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;
}; };