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 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(privateQmlComponentsPoolSelf->self.m_separatorComponent->beginCreate(QQmlEngine::contextForObject(item))); + separatorItem = qobject_cast(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(privateQmlComponentsPoolSelf->self.m_rightSeparatorComponent->beginCreate(QQmlEngine::contextForObject(item))); + separatorItem = qobject_cast(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;