]> cloud.milkyroute.net Git - dolphin.git/commitdiff
FolderPanel: prevents scanning directory tree recursively
authorMéven Car <meven29@gmail.com>
Sat, 31 Oct 2020 11:40:57 +0000 (12:40 +0100)
committerNate Graham <nate@kde.org>
Tue, 3 Nov 2020 02:21:43 +0000 (02:21 +0000)
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

src/kitemviews/kfileitemlistview.cpp
src/kitemviews/kfileitemlistview.h
src/kitemviews/kfileitemmodelrolesupdater.cpp
src/kitemviews/kfileitemmodelrolesupdater.h
src/panels/folders/folderspanel.cpp

index 6086eb8a270e283682166e2594870faabf08db8f..9833b395f2d05f2f6a64bc7e750e3fb299836fb3 100644 (file)
@@ -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();
     }
index 43712541a9e1e63eda89bb70ad4097986417d4c2..9226531521da42dca8a0434c7ebee1d391185908 100644 (file)
@@ -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
 };
index 05eabbe5e2c8da1a711de22b3058300e55d91d70..25e1a368531cd128f4c0094d18f51d69d06051da 100644 (file)
@@ -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
         }
index b7c5beb344f8855058569dc45e5b82e25fc9bb61..09706a54a41da41b321587fc22ef1a3f2b83d93b 100644 (file)
@@ -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;
index 88083e7a2563d5d3289c983c91638532139e35cb..82b2e1b126da03cec2f9491491feef6a67ddf7f4 100644 (file)
@@ -131,6 +131,7 @@ void FoldersPanel::showEvent(QShowEvent* event)
         // This assures that no performance and memory overhead is given when the folders panel is not
         // used at all and stays invisible.
         KFileItemListView* view  = new KFileItemListView();
+        view->setScanDirectories(false);
         view->setWidgetCreator(new KItemListWidgetCreator<FoldersItemListWidget>());
         view->setSupportsItemExpanding(true);
         // Set the opacity to 0 initially. The opacity will be increased after the loading of the initial tree