┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/kitemviews
diff options
context:
space:
mode:
authorMéven Car <[email protected]>2020-10-31 12:40:57 +0100
committerNate Graham <[email protected]>2020-11-03 02:21:43 +0000
commitffe01ee8407559f46171bfea4aa6f21e37f945fb (patch)
tree42d74be99c12a007d8d95c12a55081671ee9777c /src/kitemviews
parent5e9a869a39d1d91aae85b6dbbd09d475f9612f43 (diff)
FolderPanel: prevents scanning directory tree recursively
KFileItemListView contents are periodically scanned by KFileItemModelRolesUpdater. It uses then KDirectoryContentsCounter to scan directories to determine their size possibly recursively. Introduce a scanDirectories setting to disable directory scanning by KFileItemModelRolesUpdater. BUG: 426617 FIXED-IN: 20.08.3
Diffstat (limited to 'src/kitemviews')
-rw-r--r--src/kitemviews/kfileitemlistview.cpp17
-rw-r--r--src/kitemviews/kfileitemlistview.h8
-rw-r--r--src/kitemviews/kfileitemmodelrolesupdater.cpp23
-rw-r--r--src/kitemviews/kfileitemmodelrolesupdater.h8
4 files changed, 51 insertions, 5 deletions
diff --git a/src/kitemviews/kfileitemlistview.cpp b/src/kitemviews/kfileitemlistview.cpp
index 6086eb8a2..9833b395f 100644
--- a/src/kitemviews/kfileitemlistview.cpp
+++ b/src/kitemviews/kfileitemlistview.cpp
@@ -39,7 +39,8 @@ KFileItemListView::KFileItemListView(QGraphicsWidget* parent) :
KStandardItemListView(parent),
m_modelRolesUpdater(nullptr),
m_updateVisibleIndexRangeTimer(nullptr),
- m_updateIconSizeTimer(nullptr)
+ m_updateIconSizeTimer(nullptr),
+ m_scanDirectories(true)
{
setAcceptDrops(true);
@@ -117,6 +118,19 @@ qlonglong KFileItemListView::localFileSizePreviewLimit() const
return m_modelRolesUpdater ? m_modelRolesUpdater->localFileSizePreviewLimit() : 0;
}
+void KFileItemListView::setScanDirectories(bool enabled)
+{
+ m_scanDirectories = enabled;
+ if (m_modelRolesUpdater) {
+ m_modelRolesUpdater->setScanDirectories(m_scanDirectories);
+ }
+}
+
+bool KFileItemListView::scanDirectories()
+{
+ return m_scanDirectories;
+}
+
QPixmap KFileItemListView::createDragPixmap(const KItemSet& indexes) const
{
if (!model()) {
@@ -247,6 +261,7 @@ void KFileItemListView::onModelChanged(KItemModelBase* current, KItemModelBase*
if (current) {
m_modelRolesUpdater = new KFileItemModelRolesUpdater(static_cast<KFileItemModel*>(current), this);
m_modelRolesUpdater->setIconSize(availableIconSize());
+ m_modelRolesUpdater->setScanDirectories(scanDirectories());
applyRolesToModel();
}
diff --git a/src/kitemviews/kfileitemlistview.h b/src/kitemviews/kfileitemlistview.h
index 43712541a..922653152 100644
--- a/src/kitemviews/kfileitemlistview.h
+++ b/src/kitemviews/kfileitemlistview.h
@@ -69,6 +69,13 @@ public:
void setLocalFileSizePreviewLimit(qlonglong size);
qlonglong localFileSizePreviewLimit() const;
+ /**
+ * If set to true, directories contents are scanned to determine their size
+ * Default true
+ */
+ void setScanDirectories(bool enabled);
+ bool scanDirectories();
+
QPixmap createDragPixmap(const KItemSet& indexes) const override;
protected:
@@ -118,6 +125,7 @@ private:
KFileItemModelRolesUpdater* m_modelRolesUpdater;
QTimer* m_updateVisibleIndexRangeTimer;
QTimer* m_updateIconSizeTimer;
+ bool m_scanDirectories;
friend class KFileItemListViewTest; // For unit testing
};
diff --git a/src/kitemviews/kfileitemmodelrolesupdater.cpp b/src/kitemviews/kfileitemmodelrolesupdater.cpp
index 05eabbe5e..25e1a3685 100644
--- a/src/kitemviews/kfileitemmodelrolesupdater.cpp
+++ b/src/kitemviews/kfileitemmodelrolesupdater.cpp
@@ -67,6 +67,7 @@ KFileItemModelRolesUpdater::KFileItemModelRolesUpdater(KFileItemModel* model, QO
m_resolvableRoles(),
m_enabledPlugins(),
m_localFileSizePreviewLimit(0),
+ m_scanDirectories(true),
m_pendingSortRoleItems(),
m_pendingIndexes(),
m_pendingPreviewItems(),
@@ -317,6 +318,16 @@ qlonglong KFileItemModelRolesUpdater::localFileSizePreviewLimit() const
return m_localFileSizePreviewLimit;
}
+void KFileItemModelRolesUpdater::setScanDirectories(bool enabled)
+{
+ m_scanDirectories = enabled;
+}
+
+bool KFileItemModelRolesUpdater::scanDirectories() const
+{
+ return m_scanDirectories;
+}
+
void KFileItemModelRolesUpdater::slotItemsInserted(const KItemRangeList& itemRanges)
{
QElapsedTimer timer;
@@ -1001,7 +1012,9 @@ void KFileItemModelRolesUpdater::applySortRole(int index)
data.insert("type", item.mimeComment());
} else if (m_model->sortRole() == "size" && item.isLocalFile() && item.isDir()) {
const QString path = item.localPath();
- m_directoryContentsCounter->scanDirectory(path);
+ if (m_scanDirectories) {
+ m_directoryContentsCounter->scanDirectory(path);
+ }
} else {
// Probably the sort role is a baloo role - just determine all roles.
data = rolesData(item);
@@ -1072,11 +1085,13 @@ QHash<QByteArray, QVariant> KFileItemModelRolesUpdater::rolesData(const KFileIte
const bool getIsExpandableRole = m_roles.contains("isExpandable");
if ((getSizeRole || getIsExpandableRole) && item.isDir()) {
- if (item.isLocalFile()) {
+ if (item.isLocalFile() && !item.isSlow()) {
// Tell m_directoryContentsCounter that we want to count the items
// inside the directory. The result will be received in slotDirectoryContentsCountReceived.
- const QString path = item.localPath();
- m_directoryContentsCounter->scanDirectory(path);
+ if (m_scanDirectories) {
+ const QString path = item.localPath();
+ m_directoryContentsCounter->scanDirectory(path);
+ }
} else if (getSizeRole) {
data.insert("size", -1); // -1 indicates an unknown number of items
}
diff --git a/src/kitemviews/kfileitemmodelrolesupdater.h b/src/kitemviews/kfileitemmodelrolesupdater.h
index b7c5beb34..09706a54a 100644
--- a/src/kitemviews/kfileitemmodelrolesupdater.h
+++ b/src/kitemviews/kfileitemmodelrolesupdater.h
@@ -152,6 +152,13 @@ public:
void setLocalFileSizePreviewLimit(qlonglong size);
qlonglong localFileSizePreviewLimit() const;
+ /**
+ * If set to true, directories contents are scanned to determine their size
+ * Default true
+ */
+ void setScanDirectories(bool enabled);
+ bool scanDirectories() const;
+
private slots:
void slotItemsInserted(const KItemRangeList& itemRanges);
void slotItemsRemoved(const KItemRangeList& itemRanges);
@@ -307,6 +314,7 @@ private:
QSet<QByteArray> m_resolvableRoles;
QStringList m_enabledPlugins;
qulonglong m_localFileSizePreviewLimit;
+ bool m_scanDirectories;
// Items for which the sort role still has to be determined.
QSet<KFileItem> m_pendingSortRoleItems;