Changeset View
Changeset View
Standalone View
Standalone View
src/widgets/kdirmodel.cpp
Show First 20 Lines • Show All 186 Lines • ▼ Show 20 Line(s) | 186 | { | |||
---|---|---|---|---|---|
187 | delete m_rootNode; | 187 | delete m_rootNode; | ||
188 | } | 188 | } | ||
189 | 189 | | |||
190 | void _k_slotNewItems(const QUrl &directoryUrl, const KFileItemList &); | 190 | void _k_slotNewItems(const QUrl &directoryUrl, const KFileItemList &); | ||
191 | void _k_slotDeleteItems(const KFileItemList &); | 191 | void _k_slotDeleteItems(const KFileItemList &); | ||
192 | void _k_slotRefreshItems(const QList<QPair<KFileItem, KFileItem> > &); | 192 | void _k_slotRefreshItems(const QList<QPair<KFileItem, KFileItem> > &); | ||
193 | void _k_slotClear(); | 193 | void _k_slotClear(); | ||
194 | void _k_slotRedirection(const QUrl &oldUrl, const QUrl &newUrl); | 194 | void _k_slotRedirection(const QUrl &oldUrl, const QUrl &newUrl); | ||
195 | void _k_slotJobUrlsChanged(const QStringList &urlList); | | |||
196 | 195 | | |||
197 | void clear() | 196 | void clear() | ||
198 | { | 197 | { | ||
199 | delete m_rootNode; | 198 | delete m_rootNode; | ||
200 | m_rootNode = new KDirModelDirNode(nullptr, KFileItem()); | 199 | m_rootNode = new KDirModelDirNode(nullptr, KFileItem()); | ||
201 | } | 200 | } | ||
202 | // Emit expand for each parent and then return the | 201 | // Emit expand for each parent and then return the | ||
203 | // last known parent if there is no node for this url | 202 | // last known parent if there is no node for this url | ||
Show All 29 Lines | 231 | #ifndef NDEBUG | |||
233 | void dump(); | 232 | void dump(); | ||
234 | #endif | 233 | #endif | ||
235 | 234 | | |||
236 | KDirModel * const q; | 235 | KDirModel * const q; | ||
237 | KDirLister *m_dirLister; | 236 | KDirLister *m_dirLister; | ||
238 | KDirModelDirNode *m_rootNode; | 237 | KDirModelDirNode *m_rootNode; | ||
239 | KDirModel::DropsAllowed m_dropsAllowed; | 238 | KDirModel::DropsAllowed m_dropsAllowed; | ||
240 | bool m_jobTransfersVisible; | 239 | bool m_jobTransfersVisible; | ||
240 | QMetaObject::Connection m_jobUrlsChangedConnection; | ||||
241 | // key = current known parent node (always a KDirModelDirNode but KDirModelNode is more convenient), | 241 | // key = current known parent node (always a KDirModelDirNode but KDirModelNode is more convenient), | ||
242 | // value = final url[s] being fetched | 242 | // value = final url[s] being fetched | ||
243 | QMap<KDirModelNode *, QList<QUrl> > m_urlsBeingFetched; | 243 | QMap<KDirModelNode *, QList<QUrl> > m_urlsBeingFetched; | ||
244 | QHash<QUrl, KDirModelNode *> m_nodeHash; // global node hash: url -> node | 244 | QHash<QUrl, KDirModelNode *> m_nodeHash; // global node hash: url -> node | ||
245 | QStringList m_allCurrentDestUrls; //list of all dest urls that have jobs on them (e.g. copy, download) | 245 | QStringList m_allCurrentDestUrls; //list of all dest urls that have jobs on them (e.g. copy, download) | ||
246 | }; | 246 | }; | ||
247 | 247 | | |||
248 | KDirModelNode *KDirModelPrivate::nodeForUrl(const QUrl &_url) const // O(1), well, O(length of url as a string) | 248 | KDirModelNode *KDirModelPrivate::nodeForUrl(const QUrl &_url) const // O(1), well, O(length of url as a string) | ||
▲ Show 20 Lines • Show All 435 Lines • ▼ Show 20 Line(s) | 679 | { | |||
684 | } | 684 | } | ||
685 | 685 | | |||
686 | m_nodeHash.clear(); | 686 | m_nodeHash.clear(); | ||
687 | //emit layoutAboutToBeChanged(); | 687 | //emit layoutAboutToBeChanged(); | ||
688 | clear(); | 688 | clear(); | ||
689 | //emit layoutChanged(); | 689 | //emit layoutChanged(); | ||
690 | } | 690 | } | ||
691 | 691 | | |||
692 | void KDirModelPrivate::_k_slotJobUrlsChanged(const QStringList &urlList) | | |||
693 | { | | |||
694 | QStringList dirtyUrls; | | |||
695 | | ||||
696 | std::set_symmetric_difference(urlList.begin(), urlList.end(), | | |||
697 | m_allCurrentDestUrls.constBegin(), m_allCurrentDestUrls.constEnd(), | | |||
698 | std::back_inserter(dirtyUrls)); | | |||
699 | | ||||
700 | m_allCurrentDestUrls = urlList; | | |||
701 | | ||||
702 | for (const QString &dirtyUrl : qAsConst(dirtyUrls)) { | | |||
703 | if (KDirModelNode *node = nodeForUrl(QUrl(dirtyUrl))) { | | |||
704 | const QModelIndex idx = indexForNode(node); | | |||
705 | emit q->dataChanged(idx, idx, {KDirModel::HasJobRole}); | | |||
706 | } | | |||
707 | } | | |||
708 | } | | |||
709 | | ||||
710 | void KDirModelPrivate::clearAllPreviews(KDirModelDirNode *dirNode) | 692 | void KDirModelPrivate::clearAllPreviews(KDirModelDirNode *dirNode) | ||
711 | { | 693 | { | ||
712 | const int numRows = dirNode->m_childNodes.count(); | 694 | const int numRows = dirNode->m_childNodes.count(); | ||
713 | if (numRows > 0) { | 695 | if (numRows > 0) { | ||
714 | KDirModelNode *lastNode = nullptr; | 696 | KDirModelNode *lastNode = nullptr; | ||
715 | for (KDirModelNode *node : qAsConst(dirNode->m_childNodes)) { | 697 | for (KDirModelNode *node : qAsConst(dirNode->m_childNodes)) { | ||
716 | node->setPreview(QIcon()); | 698 | node->setPreview(QIcon()); | ||
717 | //node->setPreview(QIcon::fromTheme(node->item().iconName())); | 699 | //node->setPreview(QIcon::fromTheme(node->item().iconName())); | ||
▲ Show 20 Lines • Show All 261 Lines • ▼ Show 20 Line(s) | |||||
979 | { | 961 | { | ||
980 | emit needSequenceIcon(index, sequenceIndex); | 962 | emit needSequenceIcon(index, sequenceIndex); | ||
981 | } | 963 | } | ||
982 | 964 | | |||
983 | void KDirModel::setJobTransfersVisible(bool value) | 965 | void KDirModel::setJobTransfersVisible(bool value) | ||
984 | { | 966 | { | ||
985 | if (value) { | 967 | if (value) { | ||
986 | d->m_jobTransfersVisible = true; | 968 | d->m_jobTransfersVisible = true; | ||
987 | connect(&JobUrlCache::instance(), SIGNAL(jobUrlsChanged(QStringList)), this, SLOT(_k_slotJobUrlsChanged(QStringList)), Qt::UniqueConnection); | 969 | | ||
970 | if (!d->m_jobUrlsChangedConnection) { | ||||
971 | d->m_jobUrlsChangedConnection = connect(&JobUrlCache::instance(), | ||||
972 | &JobUrlCache::jobUrlsChanged, | ||||
973 | this, [this](const QStringList &jobUrls) { | ||||
974 | QStringList dirtyUrls; | ||||
975 | | ||||
976 | std::set_symmetric_difference(jobUrls.begin(), jobUrls.end(), | ||||
977 | d->m_allCurrentDestUrls.constBegin(), d->m_allCurrentDestUrls.constEnd(), | ||||
978 | std::back_inserter(dirtyUrls)); | ||||
979 | | ||||
980 | d->m_allCurrentDestUrls = jobUrls; | ||||
981 | | ||||
982 | for (const QString &dirtyUrl : qAsConst(dirtyUrls)) { | ||||
983 | if (KDirModelNode *node = d->nodeForUrl(QUrl(dirtyUrl))) { | ||||
984 | const QModelIndex idx = d->indexForNode(node); | ||||
985 | emit dataChanged(idx, idx, {KDirModel::HasJobRole}); | ||||
986 | } | ||||
987 | } | ||||
988 | }); | ||||
989 | } | ||||
988 | 990 | | |||
989 | JobUrlCache::instance().requestJobUrlsChanged(); | 991 | JobUrlCache::instance().requestJobUrlsChanged(); | ||
990 | } else { | 992 | } else { | ||
991 | disconnect(this, SLOT(_k_slotJobUrlsChanged(QStringList))); | 993 | if (d->m_jobUrlsChangedConnection) { | ||
994 | disconnect(d->m_jobUrlsChangedConnection); | ||||
995 | d->m_jobUrlsChangedConnection = QMetaObject::Connection(); | ||||
996 | } | ||||
992 | } | 997 | } | ||
993 | | ||||
994 | } | 998 | } | ||
995 | 999 | | |||
996 | bool KDirModel::jobTransfersVisible() const | 1000 | bool KDirModel::jobTransfersVisible() const | ||
997 | { | 1001 | { | ||
998 | return d->m_jobTransfersVisible; | 1002 | return d->m_jobTransfersVisible; | ||
999 | } | 1003 | } | ||
1000 | 1004 | | |||
1001 | QList<QUrl> KDirModel::simplifiedUrlList(const QList<QUrl> &urls) | 1005 | QList<QUrl> KDirModel::simplifiedUrlList(const QList<QUrl> &urls) | ||
▲ Show 20 Lines • Show All 295 Lines • Show Last 20 Lines |