+++ /dev/null
-From 4a9820a6df15a55a7d36d343ce70a25ba7d56b79 Mon Sep 17 00:00:00 2001
-From: David Edmundson <kde@davidedmundson.co.uk>
-Date: Wed, 13 Nov 2019 14:23:19 +0000
-Subject: Make QmlComponentsPool one instance per engine
-
-Summary:
-If we create 2 engines in an application the singleton is initialised to
-the first engine. If that first engine disappears the internal m_unit is
-dangling.
-
-A good example of this is systemsettings in the icon view if we enter
-two modules one after another. It's currently only kept alive because
-the sidebar created the first reference.
-
-BUG: 414003
-
-Test Plan:
-System settings in icon view
-opened global theme
-went back
-open fonts theme
-didn't crash
-
-Subscribers: plasma-devel
-
-Tags: #kirigami
-
-Differential Revision: https://phabricator.kde.org/D25284
----
- src/columnview.cpp | 54 +++++++++++++++++++++++++++++++++---------------------
- src/columnview_p.h | 4 +---
- 2 files changed, 34 insertions(+), 24 deletions(-)
-
-diff --git a/src/columnview.cpp b/src/columnview.cpp
-index cab89f8..35d591e 100644
---- a/src/columnview.cpp
-+++ b/src/columnview.cpp
-@@ -37,23 +37,37 @@ class QmlComponentsPoolSingleton
- public:
- QmlComponentsPoolSingleton()
- {}
--
-- QmlComponentsPool self;
-+ static QmlComponentsPool *instance(QQmlEngine *engine);
-+private:
-+ QHash<QQmlEngine*, QmlComponentsPool*> m_instances;
- };
-
- Q_GLOBAL_STATIC(QmlComponentsPoolSingleton, privateQmlComponentsPoolSelf)
-
-
--QmlComponentsPool::QmlComponentsPool(QObject *parent)
-- : QObject(parent)
--{}
--
--void QmlComponentsPool::initialize(QQmlEngine *engine)
-+QmlComponentsPool *QmlComponentsPoolSingleton::instance(QQmlEngine *engine)
- {
-- if (!engine || m_instance) {
-- return;
-+ Q_ASSERT(engine);
-+ auto componentPool = privateQmlComponentsPoolSelf->m_instances.value(engine);
-+
-+ if (componentPool) {
-+ return componentPool;
- }
-
-+ componentPool = new QmlComponentsPool(engine);
-+
-+ QObject::connect(componentPool, &QObject::destroyed, [engine]() {
-+ if (privateQmlComponentsPoolSelf) {
-+ privateQmlComponentsPoolSelf->m_instances.remove(engine);
-+ }
-+ });
-+ privateQmlComponentsPoolSelf->m_instances[engine] = componentPool;
-+ return componentPool;
-+}
-+
-+QmlComponentsPool::QmlComponentsPool(QQmlEngine *engine)
-+ : QObject(engine)
-+{
- QQmlComponent *component = new QQmlComponent(engine, this);
-
- component->setData(QByteArrayLiteral("import QtQuick 2.7\n"
-@@ -572,12 +586,12 @@ QQuickItem *ContentItem::ensureSeparator(QQuickItem *item)
- QQuickItem *separatorItem = m_separators.value(item);
-
- if (!separatorItem) {
-- separatorItem = qobject_cast<QQuickItem *>(privateQmlComponentsPoolSelf->self.m_separatorComponent->beginCreate(QQmlEngine::contextForObject(item)));
-+ separatorItem = qobject_cast<QQuickItem *>(privateQmlComponentsPoolSelf->instance(qmlEngine(item))->m_separatorComponent->beginCreate(QQmlEngine::contextForObject(item)));
- if (separatorItem) {
- separatorItem->setParentItem(item);
- separatorItem->setZ(9999);
- separatorItem->setProperty("column", QVariant::fromValue(item));
-- privateQmlComponentsPoolSelf->self.m_separatorComponent->completeCreate();
-+ QmlComponentsPoolSingleton::instance(qmlEngine(item))->m_separatorComponent->completeCreate();
- m_separators[item] = separatorItem;
- }
- }
-@@ -590,12 +604,12 @@ QQuickItem *ContentItem::ensureRightSeparator(QQuickItem *item)
- QQuickItem *separatorItem = m_rightSeparators.value(item);
-
- if (!separatorItem) {
-- separatorItem = qobject_cast<QQuickItem *>(privateQmlComponentsPoolSelf->self.m_rightSeparatorComponent->beginCreate(QQmlEngine::contextForObject(item)));
-+ separatorItem = qobject_cast<QQuickItem *>(QmlComponentsPoolSingleton::instance(qmlEngine(item))->m_rightSeparatorComponent->beginCreate(QQmlEngine::contextForObject(item)));
- if (separatorItem) {
- separatorItem->setParentItem(item);
- separatorItem->setZ(9999);
- separatorItem->setProperty("column", QVariant::fromValue(item));
-- privateQmlComponentsPoolSelf->self.m_rightSeparatorComponent->completeCreate();
-+ QmlComponentsPoolSingleton::instance(qmlEngine(item))->m_rightSeparatorComponent->completeCreate();
- m_rightSeparators[item] = separatorItem;
- }
- }
-@@ -759,7 +773,7 @@ qreal ColumnView::columnWidth() const
- void ColumnView::setColumnWidth(qreal width)
- {
- // Always forget the internal binding when the user sets anything, even the same value
-- disconnect(&privateQmlComponentsPoolSelf->self, &QmlComponentsPool::gridUnitChanged, this, nullptr);
-+ disconnect(QmlComponentsPoolSingleton::instance(qmlEngine(this)), &QmlComponentsPool::gridUnitChanged, this, nullptr);
-
- if (m_contentItem->m_columnWidth == width) {
- return;
-@@ -902,7 +916,7 @@ int ColumnView::scrollDuration() const
-
- void ColumnView::setScrollDuration(int duration)
- {
-- disconnect(&privateQmlComponentsPoolSelf->self, &QmlComponentsPool::longDurationChanged, this, nullptr);
-+ disconnect(QmlComponentsPoolSingleton::instance(qmlEngine(this)), &QmlComponentsPool::longDurationChanged, this, nullptr);
-
- if (m_contentItem->m_slideAnim->duration() == duration) {
- return;
-@@ -1392,22 +1406,20 @@ void ColumnView::mouseUngrabEvent()
-
- void ColumnView::classBegin()
- {
-- privateQmlComponentsPoolSelf->self.initialize(qmlEngine(this));
--
- auto syncColumnWidth = [this]() {
-- m_contentItem->m_columnWidth = privateQmlComponentsPoolSelf->self.m_units->property("gridUnit").toInt() * 20;
-+ m_contentItem->m_columnWidth = privateQmlComponentsPoolSelf->instance(qmlEngine(this))->m_units->property("gridUnit").toInt() * 20;
- emit columnWidthChanged();
- };
-
-- connect(&privateQmlComponentsPoolSelf->self, &QmlComponentsPool::gridUnitChanged, this, syncColumnWidth);
-+ connect(QmlComponentsPoolSingleton::instance(qmlEngine(this)), &QmlComponentsPool::gridUnitChanged, this, syncColumnWidth);
- syncColumnWidth();
-
- auto syncDuration = [this]() {
-- m_contentItem->m_slideAnim->setDuration(privateQmlComponentsPoolSelf->self.m_units->property("longDuration").toInt());
-+ m_contentItem->m_slideAnim->setDuration(QmlComponentsPoolSingleton::instance(qmlEngine(this))->m_units->property("longDuration").toInt());
- emit scrollDurationChanged();
- };
-
-- connect(&privateQmlComponentsPoolSelf->self, &QmlComponentsPool::longDurationChanged, this, syncDuration);
-+ connect(QmlComponentsPoolSingleton::instance(qmlEngine(this)), &QmlComponentsPool::longDurationChanged, this, syncDuration);
- syncDuration();
-
- QQuickItem::classBegin();
-diff --git a/src/columnview_p.h b/src/columnview_p.h
-index ebf5543..886b96b 100644
---- a/src/columnview_p.h
-+++ b/src/columnview_p.h
-@@ -32,11 +32,9 @@ class QmlComponentsPool: public QObject
- Q_OBJECT
-
- public:
-- QmlComponentsPool(QObject *parent = nullptr);
-+ QmlComponentsPool(QQmlEngine *engine);
- ~QmlComponentsPool();
-
-- void initialize(QQmlEngine *engine);
--
- QQmlComponent *m_separatorComponent = nullptr;
- QQmlComponent *m_rightSeparatorComponent = nullptr;
- QObject *m_units = nullptr;
---
-cgit v1.1