]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Fix "show hidden files" issues
authorPeter Penz <peter.penz19@gmail.com>
Thu, 8 Dec 2011 10:05:27 +0000 (11:05 +0100)
committerPeter Penz <peter.penz19@gmail.com>
Thu, 8 Dec 2011 10:13:28 +0000 (11:13 +0100)
Use KFileItemModel instead of KDirLister for toggling the whether
hidden files should be shown. This assures that the signal
KFileItemModel::loadingCompleted() will be emitted.

In the longterm Dolphin should only use the KFileItemModel, so that
the KDirLister instance is used only internally as implementation
detail in KFileItemModel. Although there are only a few cases left
where KDirLister is used instead of KFileItemModel this cleanup
will be postponed to after the 4.8 release...

BUG: 287314
BUG: 288213
FIXED-IN: 4.8.0

src/kitemviews/kfileitemmodel.cpp
src/kitemviews/kfileitemmodel.h
src/panels/folders/folderspanel.cpp
src/views/dolphinview.cpp

index c0adce98604d8f8288c5c1e08056d946cc5087e3..8eb47f5ec7cafcc5124b18cdd80ce49a5d227de4 100644 (file)
@@ -165,6 +165,24 @@ bool KFileItemModel::sortFoldersFirst() const
     return m_sortFoldersFirst;
 }
 
+void KFileItemModel::setShowHiddenFiles(bool show)
+{
+    KDirLister* dirLister = m_dirLister.data();
+    if (dirLister) {
+        dirLister->setShowingDotFiles(show);
+        dirLister->emitChanges();
+        if (show) {
+            slotCompleted();
+        }
+    }
+}
+
+bool KFileItemModel::showHiddenFiles() const
+{
+    const KDirLister* dirLister = m_dirLister.data();
+    return dirLister ? dirLister->showingDotFiles() : false;
+}
+
 QMimeData* KFileItemModel::createMimeData(const QSet<int>& indexes) const
 {
     QMimeData* data = new QMimeData();
index 5d0aa4203f4914242fac0620c9e73a67f82abea5..36ed37ba67a3df0c0eb4b6f2f1b91d7916f95b14 100644 (file)
@@ -41,6 +41,15 @@ class QTimer;
  *
  * Also the recursive expansion of sub-directories is supported by
  * KFileItemModel::setExpanded().
+ *
+ * TODO: In the longterm instead of passing a KDirLister just an URL should
+ * be passed and a KDirLister used internally. This solves the following issues:
+ * - The user of the API does not need to decide whether he listens to KDirLister
+ *   or KFileItemModel.
+ * - It resolves minor conceptual differences between KDirLister and KFileItemModel.
+ *   E.g. there is no way for KFileItemModel to check whether a completed() signal
+ *   will be emitted after newItems() will be send by KDirLister or not (in the case
+ *   of setShowingDotFiles() no completed() signal will get emitted).
  */
 class LIBDOLPHINPRIVATE_EXPORT KFileItemModel : public KItemModelBase
 {
@@ -60,6 +69,9 @@ public:
     void setSortFoldersFirst(bool foldersFirst);
     bool sortFoldersFirst() const;
 
+    void setShowHiddenFiles(bool show);
+    bool showHiddenFiles() const;
+
     /** @reimp */
     virtual QMimeData* createMimeData(const QSet<int>& indexes) const;
 
@@ -138,6 +150,13 @@ public:
     QString nameFilter() const;
 
 signals:
+    /**
+     * Is emitted after the loading of a directory has been completed or new
+     * items have been inserted to an already loaded directory. Usually
+     * one or more itemsInserted() signals are emitted before loadingCompleted()
+     * (the only exception is loading an empty directory, where only a
+     * loadingCompleted() signal gets emitted).
+     */
     void loadingCompleted();
 
 protected:
index 598d3054a3c97baec4be061fa815e959476fde60..275cd7772f981eed7269aabe0bb394ad2b6ecd13 100644 (file)
@@ -76,8 +76,7 @@ void FoldersPanel::setHiddenFilesShown(bool show)
     if (m_dirLister) {
         KFileItemModel* model = fileItemModel();
         const QSet<KUrl> expandedUrls = model->expandedUrls();
-        m_dirLister->setShowingDotFiles(show);
-        m_dirLister->openUrl(m_dirLister->url(), KDirLister::Reload);
+        model->setShowHiddenFiles(show);
         model->setExpanded(expandedUrls);
     }
 }
@@ -146,7 +145,6 @@ void FoldersPanel::showEvent(QShowEvent* event)
         m_dirLister->setMainWindow(window());
         m_dirLister->setDelayedMimeTypes(true);
         m_dirLister->setAutoErrorHandlingEnabled(false, this);
-        m_dirLister->setShowingDotFiles(FoldersPanelSettings::hiddenFilesShown());
 
         KFileItemListView* view  = new KFileItemListView();
         view->setWidgetCreator(new KItemListWidgetCreator<KFileItemListWidget>());
@@ -165,6 +163,7 @@ void FoldersPanel::showEvent(QShowEvent* event)
         view->setOpacity(0);
 
         KFileItemModel* model = new KFileItemModel(m_dirLister, this);
+        model->setShowHiddenFiles(FoldersPanelSettings::hiddenFilesShown());
         // Use a QueuedConnection to give the view the possibility to react first on the
         // finished loading.
         connect(model, SIGNAL(loadingCompleted()), this, SLOT(slotLoadingCompleted()), Qt::QueuedConnection);
index 8730746534d5e5ad157110b99078222c1a18d105..fdca4cf8660bff29688e5e2c2417a80e4a2d87b9 100644 (file)
@@ -262,8 +262,7 @@ void DolphinView::setHiddenFilesShown(bool show)
     ViewProperties props(url());
     props.setHiddenFilesShown(show);
 
-    m_dirLister->setShowingDotFiles(show);
-    m_dirLister->emitChanges();
+    fileItemModel()->setShowHiddenFiles(show);
     emit hiddenFilesShownChanged(show);
 }
 
@@ -1170,9 +1169,8 @@ void DolphinView::applyViewProperties()
     }
 
     const bool hiddenFilesShown = props.hiddenFilesShown();
-    if (hiddenFilesShown != m_dirLister->showingDotFiles()) {
-        m_dirLister->setShowingDotFiles(hiddenFilesShown);
-        m_dirLister->emitChanges();
+    if (hiddenFilesShown != model->showHiddenFiles()) {
+        model->setShowHiddenFiles(hiddenFilesShown);
         emit hiddenFilesShownChanged(hiddenFilesShown);
     }