summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--installerbuilder/libinstaller/component.cpp4
-rw-r--r--installerbuilder/libinstaller/component_p.cpp16
-rw-r--r--installerbuilder/libinstaller/component_p.h4
-rw-r--r--installerbuilder/libinstaller/packagemanagergui.cpp19
4 files changed, 30 insertions, 13 deletions
diff --git a/installerbuilder/libinstaller/component.cpp b/installerbuilder/libinstaller/component.cpp
index 70c9f0989..113e16623 100644
--- a/installerbuilder/libinstaller/component.cpp
+++ b/installerbuilder/libinstaller/component.cpp
@@ -512,11 +512,11 @@ QHash<QString, QPair<QString, QString> > Component::licenses() const
}
/*!
- Returns the QWidget created for class \a name.
+ Returns the QWidget created for \a name or 0 if the widget already has been deleted or cannot be found.
*/
QWidget *Component::userInterface(const QString &name) const
{
- return d->m_userInterfaces.value(name);
+ return d->m_userInterfaces.value(name).data();
}
/*!
diff --git a/installerbuilder/libinstaller/component_p.cpp b/installerbuilder/libinstaller/component_p.cpp
index fb63f6d6f..a6e34aa02 100644
--- a/installerbuilder/libinstaller/component_p.cpp
+++ b/installerbuilder/libinstaller/component_p.cpp
@@ -59,6 +59,22 @@ ComponentPrivate::ComponentPrivate(PackageManagerCore *core, Component *qq)
{
}
+ComponentPrivate::~ComponentPrivate()
+{
+ // Before we can delete the added widgets, they need to be removed from the wizard first.
+ QMap<QString, QPointer<QWidget> >::const_iterator it;
+ foreach (const QString &widgetName, m_userInterfaces.keys()) {
+ m_core->removeWizardPage(q, widgetName);
+ m_core->removeWizardPageItem(q, widgetName);
+ }
+
+ // Use QPointer here instead of raw pointers. This is a requirement that needs to be met cause possible
+ // Ui elements get added during component script run and might be destroyed by the package manager gui
+ // before the actual component gets destroyed. Avoids a possible delete call on a dangling pointer.
+ foreach (const QPointer<QWidget> widget, m_userInterfaces)
+ delete widget.data();
+}
+
void ComponentPrivate::init()
{
// register translation stuff
diff --git a/installerbuilder/libinstaller/component_p.h b/installerbuilder/libinstaller/component_p.h
index 119d9a5b0..c4c7cd76c 100644
--- a/installerbuilder/libinstaller/component_p.h
+++ b/installerbuilder/libinstaller/component_p.h
@@ -35,6 +35,7 @@
#include "qinstallerglobal.h"
+#include <QtCore/QPointer>
#include <QtCore/QStringList>
#include <QtCore/QUrl>
@@ -51,6 +52,7 @@ class ComponentPrivate
public:
explicit ComponentPrivate(PackageManagerCore *core, Component *qq);
+ ~ComponentPrivate();
void init();
void setProperty(QScriptValue &scriptValue, const QString &propertyName, int value);
@@ -78,9 +80,9 @@ public:
QList<Component*> m_allChildComponents;
QList<Component*> m_virtualChildComponents;
QStringList m_downloadableArchives;
- QMap<QString, QWidget*> m_userInterfaces;
QStringList m_stopProcessForUpdateRequests;
QHash<QString, bool> m_unexistingScriptMethods;
+ QMap<QString, QPointer<QWidget> > m_userInterfaces;
// < display name, < file name, file content > >
QHash<QString, QPair<QString, QString> > m_licenses;
diff --git a/installerbuilder/libinstaller/packagemanagergui.cpp b/installerbuilder/libinstaller/packagemanagergui.cpp
index 0c079e709..f89ce9fa2 100644
--- a/installerbuilder/libinstaller/packagemanagergui.cpp
+++ b/installerbuilder/libinstaller/packagemanagergui.cpp
@@ -435,25 +435,24 @@ void PackageManagerGui::wizardPageInsertionRequested(QWidget *widget,
// just in case it was already in there...
wizardPageRemovalRequested(widget);
- // now find a suitable ID lower than page
- int p = static_cast<int>(page) - 1;
- while (QWizard::page(p) != 0)
- --p;
+ int pageId = static_cast<int>(page) - 1;
+ while (QWizard::page(pageId) != 0)
+ --pageId;
+
// add it
- setPage(p, new DynamicInstallerPage(widget, m_core));
+ setPage(pageId, new DynamicInstallerPage(widget, m_core));
}
void PackageManagerGui::wizardPageRemovalRequested(QWidget *widget)
{
- const QList<int> pages = pageIds();
- for (QList<int>::const_iterator it = pages.begin(); it != pages.end(); ++it) {
- QWizardPage *const p = page(*it);
- DynamicInstallerPage *const dynamicPage = dynamic_cast<DynamicInstallerPage*>(p);
+ foreach (int pageId, pageIds()) {
+ DynamicInstallerPage *const dynamicPage = dynamic_cast<DynamicInstallerPage*>(page(pageId));
if (dynamicPage == 0)
continue;
if (dynamicPage->widget() != widget)
continue;
- removePage(*it);
+ removePage(pageId);
+ d->m_defaultPages.remove(pageId);
}
}