]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/dolphinview.cpp
replace QList<KFileItem> by KFileItemList, as KFileItemList is not QList<KFileItem...
[dolphin.git] / src / dolphinview.cpp
index 0b6c32811dec3117bf48a21f312961850b6a8987..30e3e7fe773b91376a6d9208c5fb9b9679947fe5 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,
@@ -62,6 +61,7 @@ DolphinView::DolphinView(QWidget* parent,
     m_active(true),
     m_loadingDirectory(false),
     m_initializeColumnView(false),
+    m_storedCategorizedSorting(false),
     m_mode(DolphinView::IconsView),
     m_topLayout(0),
     m_controller(0),
@@ -84,8 +84,8 @@ DolphinView::DolphinView(QWidget* parent,
 
     connect(m_dirLister, SIGNAL(completed()),
             this, SLOT(updateCutItems()));
-    connect(m_dirLister, SIGNAL(newItems(const QList<KFileItem>&)),
-            this, SLOT(generatePreviews(const QList<KFileItem>&)));
+    connect(m_dirLister, SIGNAL(newItems(const KFileItemList&)),
+            this, SLOT(generatePreviews(const KFileItemList&)));
 
     m_controller = new DolphinController(this);
     m_controller->setUrl(url);
@@ -169,6 +169,18 @@ 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.
+    m_storedCategorizedSorting = props.categorizedSorting();
+    const bool categorized = m_storedCategorizedSorting && supportsCategorizedSorting();
+    if (categorized != m_proxyModel->isCategorizedModel()) {
+        m_proxyModel->setCategorizedModel(categorized);
+        m_proxyModel->sort(m_proxyModel->sortColumn(), m_proxyModel->sortOrder());
+        emit categorizedSortingChanged();
+    }
+
     startDirLister(viewPropsUrl);
 
     emit modeChanged();
@@ -219,16 +231,19 @@ 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);
     props.save();
 
+    m_storedCategorizedSorting = categorized;
     m_proxyModel->setCategorizedModel(categorized);
     m_proxyModel->sort(m_proxyModel->sortColumn(), m_proxyModel->sortOrder());
 
@@ -237,7 +252,14 @@ void DolphinView::setCategorizedSorting(bool categorized)
 
 bool DolphinView::categorizedSorting() const
 {
-    return m_proxyModel->isCategorizedModel();
+    // If all view modes would support categorized sorting, returning
+    // m_proxyModel->isCategorizedModel() would be the way to go. As
+    // currently only the icons view supports caterized sorting, we remember
+    // the stored view properties state in m_storedCategorizedSorting and
+    // return this state. The application takes care to disable the corresponding
+    // checkbox by checking DolphinView::supportsCategorizedSorting() to indicate
+    // that this setting is not applied to the current view mode.
+    return m_storedCategorizedSorting;
 }
 
 bool DolphinView::supportsCategorizedSorting() const
@@ -252,15 +274,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
@@ -273,7 +304,7 @@ void DolphinView::clearSelection()
     itemView()->selectionModel()->clear();
 }
 
-QList<KFileItem> DolphinView::selectedItems() const
+KFileItemList DolphinView::selectedItems() const
 {
     const QAbstractItemView* view = itemView();
 
@@ -282,7 +313,7 @@ QList<KFileItem> DolphinView::selectedItems() const
     Q_ASSERT((view != 0) && (view->selectionModel() != 0));
 
     const QItemSelection selection = m_proxyModel->mapSelectionToSource(view->selectionModel()->selection());
-    QList<KFileItem> itemList;
+    KFileItemList itemList;
 
     const QModelIndexList indexList = selection.indexes();
     foreach (QModelIndex index, indexList) {
@@ -298,10 +329,9 @@ QList<KFileItem> DolphinView::selectedItems() const
 KUrl::List DolphinView::selectedUrls() const
 {
     KUrl::List urls;
-    const QList<KFileItem> list = selectedItems();
-    for ( QList<KFileItem>::const_iterator it = list.begin(), end = list.end();
-          it != end; ++it ) {
-        urls.append((*it).url());
+    const KFileItemList list = selectedItems();
+    foreach (KFileItem item, list) {
+        urls.append(item.url());
     }
     return urls;
 }
@@ -376,22 +406,31 @@ Qt::SortOrder DolphinView::sortOrder() const
     return m_proxyModel->sortOrder();
 }
 
-void DolphinView::setAdditionalInfo(KFileItemDelegate::AdditionalInformation info)
+void DolphinView::setAdditionalInfo(KFileItemDelegate::InformationList info)
 {
     const KUrl viewPropsUrl = viewPropertiesUrl();
     ViewProperties props(viewPropsUrl);
     props.setAdditionalInfo(info);
 
-    m_controller->setShowAdditionalInfo(info != KFileItemDelegate::NoInformation);
-    m_fileItemDelegate->setAdditionalInformation(info);
+    m_controller->setShowAdditionalInfo(!info.isEmpty());
+    m_fileItemDelegate->setShowInformation(info);
 
     emit additionalInfoChanged(info);
     startDirLister(viewPropsUrl, true);
 }
 
-KFileItemDelegate::AdditionalInformation DolphinView::additionalInfo() const
+void DolphinView::setAdditionalInfo(KFileItemDelegate::Information info)
+{
+    KFileItemDelegate::InformationList list;
+    if (info != KFileItemDelegate::NoInformation)
+        list << info;
+
+    setAdditionalInfo(list);
+}
+
+KFileItemDelegate::InformationList DolphinView::additionalInfo() const
 {
-    return m_fileItemDelegate->additionalInformation();
+    return m_fileItemDelegate->showInformation();
 }
 
 void DolphinView::reload()
@@ -408,18 +447,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)
@@ -452,7 +509,7 @@ void DolphinView::triggerItem(const QModelIndex& index)
     emit itemTriggered(item); // caught by DolphinViewContainer or DolphinPart
 }
 
-void DolphinView::generatePreviews(const QList<KFileItem>& items)
+void DolphinView::generatePreviews(const KFileItemList& items)
 {
     if (m_controller->showPreview()) {
         KIO::PreviewJob* job = KIO::filePreview(items, 128);
@@ -475,7 +532,7 @@ void DolphinView::showPreview(const KFileItem& item, const QPixmap& pixmap)
         const QMimeData* mimeData = QApplication::clipboard()->mimeData();
         if (KonqMimeData::decodeIsCutSelection(mimeData) && isCutItem(item)) {
             KIconEffect iconEffect;
-            const QPixmap cutPixmap = iconEffect.apply(pixmap, K3Icon::Desktop, K3Icon::DisabledState);
+            const QPixmap cutPixmap = iconEffect.apply(pixmap, KIconLoader::Desktop, KIconLoader::DisabledState);
             m_dolphinModel->setData(idx, QIcon(cutPixmap), Qt::DecorationRole);
         } else {
             m_dolphinModel->setData(idx, QIcon(pixmap), Qt::DecorationRole);
@@ -579,9 +636,11 @@ void DolphinView::applyViewProperties(const KUrl& url)
         emit showHiddenFilesChanged();
     }
 
-    const bool categorized = props.categorizedSorting();
-    if (categorized != categorizedSorting()) {
+    m_storedCategorizedSorting = props.categorizedSorting();
+    const bool categorized = m_storedCategorizedSorting && supportsCategorizedSorting();
+    if (categorized != m_proxyModel->isCategorizedModel()) {
         m_proxyModel->setCategorizedModel(categorized);
+        m_proxyModel->sort(m_proxyModel->sortColumn(), m_proxyModel->sortOrder());
         emit categorizedSortingChanged();
     }
 
@@ -597,10 +656,10 @@ void DolphinView::applyViewProperties(const KUrl& url)
         emit sortOrderChanged(sortOrder);
     }
 
-    KFileItemDelegate::AdditionalInformation info = props.additionalInfo();
-    if (info != m_fileItemDelegate->additionalInformation()) {
-        m_controller->setShowAdditionalInfo(info != KFileItemDelegate::NoInformation);
-        m_fileItemDelegate->setAdditionalInformation(info);
+    KFileItemDelegate::InformationList info = props.additionalInfo();
+    if (info != m_fileItemDelegate->showInformation()) {
+        m_controller->setShowAdditionalInfo(!info.isEmpty());
+        m_fileItemDelegate->setShowInformation(info);
         emit additionalInfoChanged(info);
     }
 
@@ -611,7 +670,7 @@ void DolphinView::applyViewProperties(const KUrl& url)
     }
 }
 
-void DolphinView::changeSelection(const QList<KFileItem>& selection)
+void DolphinView::changeSelection(const KFileItemList& selection)
 {
     clearSelection();
     if (selection.isEmpty()) {
@@ -767,11 +826,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);
@@ -849,9 +908,9 @@ void DolphinView::applyCutItemEffect()
     KFileItemList::const_iterator it = items.begin();
     const KFileItemList::const_iterator end = items.end();
     while (it != end) {
-        KFileItem* item = *it;
-        if (isCutItem(*item)) {
-            const QModelIndex index = m_dolphinModel->indexForItem(*item);
+        const KFileItem item = *it;
+        if (isCutItem(item)) {
+            const QModelIndex index = m_dolphinModel->indexForItem(item);
             // Huh? the item is already known
             //const KFileItem item = m_dolphinModel->itemForIndex(index);
             const QVariant value = m_dolphinModel->data(index, Qt::DecorationRole);
@@ -862,13 +921,13 @@ void DolphinView::applyCutItemEffect()
                 // remember current pixmap for the item to be able
                 // to restore it when other items get cut
                 CutItem cutItem;
-                cutItem.url = item->url();
+                cutItem.url = item.url();
                 cutItem.pixmap = pixmap;
                 m_cutItemsCache.append(cutItem);
 
                 // apply icon effect to the cut item
                 KIconEffect iconEffect;
-                pixmap = iconEffect.apply(pixmap, K3Icon::Desktop, K3Icon::DisabledState);
+                pixmap = iconEffect.apply(pixmap, KIconLoader::Desktop, KIconLoader::DisabledState);
                 m_dolphinModel->setData(index, QIcon(pixmap), Qt::DecorationRole);
             }
         }