]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/dolphinview.cpp
reactivate ScrollPerPixel again, as the Qt-patch for "divide by zero" has been applie...
[dolphin.git] / src / dolphinview.cpp
index 2dd8e289bb95ee49192a1f41333520697ce0b3c2..8b36e4ec3c45b6e6c472c96ed2471c2bfe50f6db 100644 (file)
@@ -51,7 +51,6 @@
 #include "viewproperties.h"
 #include "dolphinsettings.h"
 #include "dolphin_generalsettings.h"
-#include "dolphincategorydrawer.h"
 
 DolphinView::DolphinView(QWidget* parent,
                          const KUrl& url,
@@ -169,6 +168,17 @@ void DolphinView::setMode(Mode mode)
     props.setViewMode(m_mode);
 
     createView();
+
+    // Not all view modes support categorized sorting. Adjust the sorting model
+    // if changing the view mode results in a change of the categorized sorting
+    // capabilities.
+    const bool categorized = props.categorizedSorting() && supportsCategorizedSorting();
+    if (categorized != categorizedSorting()) {
+        m_proxyModel->setCategorizedModel(categorized);
+        m_proxyModel->sort(m_proxyModel->sortColumn(), m_proxyModel->sortOrder());
+        emit categorizedSortingChanged();
+    }
+
     startDirLister(viewPropsUrl);
 
     emit modeChanged();
@@ -219,11 +229,13 @@ bool DolphinView::showHiddenFiles() const
 
 void DolphinView::setCategorizedSorting(bool categorized)
 {
-    if (!supportsCategorizedSorting() || (categorized == categorizedSorting())) {
+    if (categorized == categorizedSorting()) {
         return;
     }
 
-    Q_ASSERT(m_iconsView != 0);
+    // setCategorizedSorting(true) may only get invoked
+    // if the view supports categorized sorting
+    Q_ASSERT(!categorized || supportsCategorizedSorting());
 
     ViewProperties props(viewPropertiesUrl());
     props.setCategorizedSorting(categorized);
@@ -252,15 +264,24 @@ void DolphinView::selectAll()
 
 void DolphinView::invertSelection()
 {
-    QItemSelectionModel* selectionModel = itemView()->selectionModel();
-    const QAbstractItemModel* itemModel = selectionModel->model();
+    if (isColumnViewActive()) {
+        // QAbstractItemView does not offer a virtual method invertSelection()
+        // as counterpart to QAbstractItemView::selectAll(). This makes it
+        // necessary to delegate the inverting of the selection to the
+        // column view, as only the selection of the active column should get
+        // inverted.
+        m_columnView->invertSelection();
+    } else {
+        QItemSelectionModel* selectionModel = itemView()->selectionModel();
+        const QAbstractItemModel* itemModel = selectionModel->model();
 
-    const QModelIndex topLeft = itemModel->index(0, 0);
-    const QModelIndex bottomRight = itemModel->index(itemModel->rowCount() - 1,
-                                                     itemModel->columnCount() - 1);
+        const QModelIndex topLeft = itemModel->index(0, 0);
+        const QModelIndex bottomRight = itemModel->index(itemModel->rowCount() - 1,
+                                                         itemModel->columnCount() - 1);
 
-    QItemSelection selection(topLeft, bottomRight);
-    selectionModel->select(selection, QItemSelectionModel::Toggle);
+        const QItemSelection selection(topLeft, bottomRight);
+        selectionModel->select(selection, QItemSelectionModel::Toggle);
+    }
 }
 
 bool DolphinView::hasSelection() const
@@ -408,18 +429,36 @@ void DolphinView::refresh()
     updateViewportColor();
 }
 
-void DolphinView::setUrl(const KUrl& url)
+void DolphinView::updateView(const KUrl& url, const KUrl& rootUrl)
 {
     if (m_controller->url() == url) {
         return;
     }
 
+    const bool restoreColumnView =  !rootUrl.isEmpty()
+                                    && !rootUrl.equals(url, KUrl::CompareWithoutTrailingSlash)
+                                    && rootUrl.isParentOf(url);
+
     m_controller->setUrl(url); // emits urlChanged, which we forward
 
-    applyViewProperties(url);
+    if (restoreColumnView) {
+        applyViewProperties(rootUrl);
+        Q_ASSERT(itemView() == m_columnView);
+        startDirLister(rootUrl);
+        m_columnView->showColumn(url);
+    } else {
+        applyViewProperties(url);
+        startDirLister(url);
+    }
 
-    startDirLister(url);
     itemView()->setFocus();
+
+    emit startedPathLoading(url);
+}
+
+void DolphinView::setUrl(const KUrl& url)
+{
+    updateView(url, KUrl());
 }
 
 void DolphinView::mouseReleaseEvent(QMouseEvent* event)
@@ -505,41 +544,31 @@ void DolphinView::startDirLister(const KUrl& url, bool reload)
 
     m_dirLister->stop();
 
-    bool openDir = true;
     bool keepOldDirs = isColumnViewActive() && !m_initializeColumnView;
     m_initializeColumnView = false;
 
     if (keepOldDirs) {
+        // keeping old directories is only necessary for hierarchical views
+        // like the column view
         if (reload) {
-            keepOldDirs = false;
-
-            const KUrl& dirListerUrl = m_dirLister->url();
-            if (dirListerUrl.isValid()) {
-                const KUrl::List dirs = m_dirLister->directories();
-                KUrl url;
-                foreach(url, dirs) {
-                    m_dirLister->updateDirectory(url);
-                }
-                openDir = false;
-            }
+            // for the column view it is not enough to reload the directory lister,
+            // so this task is delegated to the column view directly
+            m_columnView->reload();
         } else if (m_dirLister->directories().contains(url)) {
             // The dir lister contains the directory already, so
-            // KDirLister::openUrl() may not been invoked twice.
+            // KDirLister::openUrl() may not get invoked twice.
             m_dirLister->updateDirectory(url);
-            openDir = false;
         } else {
             const KUrl& dirListerUrl = m_dirLister->url();
             if ((dirListerUrl == url) || !m_dirLister->url().isParentOf(url)) {
                 // The current URL is not a child of the dir lister
                 // URL. This may happen when e. g. a place has been selected
                 // and hence the view must be reset.
-                keepOldDirs = false;
+                m_dirLister->openUrl(url, false, false);
             }
         }
-    }
-
-    if (openDir) {
-        m_dirLister->openUrl(url, keepOldDirs, reload);
+    } else {
+        m_dirLister->openUrl(url, false, reload);
     }
 }
 
@@ -589,9 +618,10 @@ void DolphinView::applyViewProperties(const KUrl& url)
         emit showHiddenFilesChanged();
     }
 
-    const bool categorized = props.categorizedSorting();
+    const bool categorized = props.categorizedSorting() && supportsCategorizedSorting();
     if (categorized != categorizedSorting()) {
         m_proxyModel->setCategorizedModel(categorized);
+        m_proxyModel->sort(m_proxyModel->sortColumn(), m_proxyModel->sortOrder());
         emit categorizedSortingChanged();
     }
 
@@ -777,11 +807,11 @@ void DolphinView::createView()
 
     // ... and recreate it representing the current mode
     switch (m_mode) {
-    case IconsView:
+    case IconsView: {
         m_iconsView = new DolphinIconsView(this, m_controller);
-        m_iconsView->setCategoryDrawer(new DolphinCategoryDrawer());
         view = m_iconsView;
         break;
+    }
 
     case DetailsView:
         m_detailsView = new DolphinDetailsView(this, m_controller);