summaryrefslogblamecommitdiffstats
path: root/kde/patch/kirigami2/kirigami_iconview_crash.patch
blob: 79a35edd312f56962140318904803358a0864e19 (plain) (tree)














































































































































                                                                                                                                                                                       
diff --git a/src/columnview.cpp b/src/columnview.cpp
--- a/src/columnview.cpp
+++ b/src/columnview.cpp
@@ -37,23 +37,37 @@
 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 *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 *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 @@
 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 @@
 
 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::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
--- a/src/columnview_p.h
+++ b/src/columnview_p.h
@@ -32,11 +32,9 @@
     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;