From 0a14a30550cad5d5e798663ce1714ef2b7c24bf9 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Mikko=20Kein=C3=A4nen?= Date: Fri, 5 Nov 2010 23:53:30 +0200 Subject: [PATCH] Fixed setup dialog crashing when user created another instance of setup edit dialog. --- src/dialogs/dbobjectdialog.cpp | 17 +++++++++++++++-- src/dialogs/dbobjectdialog.h | 5 +++-- src/dialogs/setupeditdialog.cpp | 3 ++- src/dialogs/setupmaindialog.cpp | 2 +- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/dialogs/dbobjectdialog.cpp b/src/dialogs/dbobjectdialog.cpp index 50cd12d..612bac2 100644 --- a/src/dialogs/dbobjectdialog.cpp +++ b/src/dialogs/dbobjectdialog.cpp @@ -80,6 +80,7 @@ void DbObjectDialog::insertDb(const EmuFrontObject *ob) const void DbObjectDialog::addObject() { + setUIEnabled(false); if (!nameDialog) initEditDialog(); deleteCurrentObject(); dbObject = createObject(); @@ -130,6 +131,7 @@ bool DbObjectDialog::deleteItem() } updateList(); objectList->setFocus(); + setUIEnabled(true); } catch(EmuFrontException e) { @@ -207,9 +209,16 @@ void DbObjectDialog::setButtonsEnabled(bool enabled) deleteButton->setEnabled(enabled); } +void DbObjectDialog::setUIEnabled(bool enabled) +{ + buttonBox->setEnabled(enabled); + objectList->setEnabled(enabled); +} + void DbObjectDialog::disableSelection() { - setButtonsEnabled(false); + setUIEnabled(false); + //setButtonsEnabled(false); } void DbObjectDialog::activateNameDialog(bool updateData) @@ -231,6 +240,8 @@ void DbObjectDialog::initDataTable() void DbObjectDialog::updateReject() { + addButton->setEnabled(true); + setUIEnabled(true); // we don't want to keep this in memory deleteCurrentObject(); } @@ -250,12 +261,14 @@ void DbObjectDialog::updateData() deleteCurrentObject(); dbObject = 0; updateList(); + setUIEnabled(true); } +/* Implementation specific delete must be used! void DbObjectDialog::deleteCurrentObject() { delete dbObject; -} +}*/ bool DbObjectDialog::confirmDelete(QString name, int numRefs) { diff --git a/src/dialogs/dbobjectdialog.h b/src/dialogs/dbobjectdialog.h index 5196cbd..ad7bdf0 100644 --- a/src/dialogs/dbobjectdialog.h +++ b/src/dialogs/dbobjectdialog.h @@ -51,7 +51,7 @@ private slots: protected: // implementation specific, deletes current data object from memory - virtual void deleteCurrentObject(); + virtual void deleteCurrentObject() = 0; virtual void initEditDialog() = 0; virtual EmuFrontObject* createObject() = 0; void initDataTable(); @@ -72,7 +72,8 @@ private: void editObject(); void activateNameDialog(bool updateData = true); bool confirmDelete(QString name, int numRefs); - void setButtonsEnabled(bool); + void setButtonsEnabled(bool); + void setUIEnabled(bool); void layout(); void disableSelection(); QPushButton *editButton; diff --git a/src/dialogs/setupeditdialog.cpp b/src/dialogs/setupeditdialog.cpp index 36f28d8..c61cb41 100644 --- a/src/dialogs/setupeditdialog.cpp +++ b/src/dialogs/setupeditdialog.cpp @@ -108,7 +108,8 @@ void SetupEditDialog::setDataObject(EmuFrontObject *ob) if (!ob) return; qDebug() << "Updating Setup edit dialog data object to " << ob->getName() << "."; - if (efObject) delete efObject; + if (efObject) + delete dynamic_cast(efObject); // TODO: caused crash if another instance of setupeditdialog was created and new instance destroyed object being referenced in another existing dialog. efObject = ob; Setup *sup= dynamic_cast(ob); if (sup->getPlatform()) setSelectedPlatform(sup->getPlatform()); diff --git a/src/dialogs/setupmaindialog.cpp b/src/dialogs/setupmaindialog.cpp index 1c3f1d4..010f9e3 100644 --- a/src/dialogs/setupmaindialog.cpp +++ b/src/dialogs/setupmaindialog.cpp @@ -43,7 +43,7 @@ SetupMainDialog::~SetupMainDialog() void SetupMainDialog::initEditDialog() { - if (nameDialog) delete nameDialog; + if (nameDialog) delete dynamic_cast(nameDialog); nameDialog = new SetupEditDialog(this, dynamic_cast(dbObject)); } -- 1.7.9.5