Fixed setup dialog crashing when user created another instance of setup
authorMikko Keinänen <mikko.keinanen@gmail.com>
Fri, 5 Nov 2010 21:53:30 +0000 (23:53 +0200)
committerMikko Keinänen <mikko.keinanen@gmail.com>
Fri, 5 Nov 2010 21:53:30 +0000 (23:53 +0200)
edit dialog.

src/dialogs/dbobjectdialog.cpp
src/dialogs/dbobjectdialog.h
src/dialogs/setupeditdialog.cpp
src/dialogs/setupmaindialog.cpp

index 50cd12d..612bac2 100644 (file)
@@ -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)
 {
index 5196cbd..ad7bdf0 100644 (file)
@@ -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;
index 36f28d8..c61cb41 100644 (file)
@@ -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<Setup*>(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<Setup*>(ob);
     if (sup->getPlatform()) setSelectedPlatform(sup->getPlatform());
index 1c3f1d4..010f9e3 100644 (file)
@@ -43,7 +43,7 @@ SetupMainDialog::~SetupMainDialog()
 
 void SetupMainDialog::initEditDialog()
 {
-    if (nameDialog) delete nameDialog;
+    if (nameDialog) delete dynamic_cast<SetupEditDialog*>(nameDialog);
     nameDialog = new SetupEditDialog(this, dynamic_cast<Setup*>(dbObject));
 }