diff --git a/src/widgets/kdirmodel.cpp b/src/widgets/kdirmodel.cpp --- a/src/widgets/kdirmodel.cpp +++ b/src/widgets/kdirmodel.cpp @@ -192,7 +192,6 @@ void _k_slotRefreshItems(const QList > &); void _k_slotClear(); void _k_slotRedirection(const QUrl &oldUrl, const QUrl &newUrl); - void _k_slotJobUrlsChanged(const QStringList &urlList); void clear() { @@ -238,6 +237,7 @@ KDirModelDirNode *m_rootNode; KDirModel::DropsAllowed m_dropsAllowed; bool m_jobTransfersVisible; + QMetaObject::Connection m_jobUrlsChangedConnection; // key = current known parent node (always a KDirModelDirNode but KDirModelNode is more convenient), // value = final url[s] being fetched QMap > m_urlsBeingFetched; @@ -689,24 +689,6 @@ //emit layoutChanged(); } -void KDirModelPrivate::_k_slotJobUrlsChanged(const QStringList &urlList) -{ - QStringList dirtyUrls; - - std::set_symmetric_difference(urlList.begin(), urlList.end(), - m_allCurrentDestUrls.constBegin(), m_allCurrentDestUrls.constEnd(), - std::back_inserter(dirtyUrls)); - - m_allCurrentDestUrls = urlList; - - for (const QString &dirtyUrl : qAsConst(dirtyUrls)) { - if (KDirModelNode *node = nodeForUrl(QUrl(dirtyUrl))) { - const QModelIndex idx = indexForNode(node); - emit q->dataChanged(idx, idx, {KDirModel::HasJobRole}); - } - } -} - void KDirModelPrivate::clearAllPreviews(KDirModelDirNode *dirNode) { const int numRows = dirNode->m_childNodes.count(); @@ -984,13 +966,35 @@ { if (value) { d->m_jobTransfersVisible = true; - connect(&JobUrlCache::instance(), SIGNAL(jobUrlsChanged(QStringList)), this, SLOT(_k_slotJobUrlsChanged(QStringList)), Qt::UniqueConnection); + + if (!d->m_jobUrlsChangedConnection) { + d->m_jobUrlsChangedConnection = connect(&JobUrlCache::instance(), + &JobUrlCache::jobUrlsChanged, + this, [this](const QStringList &jobUrls) { + QStringList dirtyUrls; + + std::set_symmetric_difference(jobUrls.begin(), jobUrls.end(), + d->m_allCurrentDestUrls.constBegin(), d->m_allCurrentDestUrls.constEnd(), + std::back_inserter(dirtyUrls)); + + d->m_allCurrentDestUrls = jobUrls; + + for (const QString &dirtyUrl : qAsConst(dirtyUrls)) { + if (KDirModelNode *node = d->nodeForUrl(QUrl(dirtyUrl))) { + const QModelIndex idx = d->indexForNode(node); + emit dataChanged(idx, idx, {KDirModel::HasJobRole}); + } + } + }); + } JobUrlCache::instance().requestJobUrlsChanged(); } else { - disconnect(this, SLOT(_k_slotJobUrlsChanged(QStringList))); + if (d->m_jobUrlsChangedConnection) { + disconnect(d->m_jobUrlsChangedConnection); + d->m_jobUrlsChangedConnection = QMetaObject::Connection(); + } } - } bool KDirModel::jobTransfersVisible() const