X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/8118d8e24317b697f78bf32b41fda4200bc56ff9..093efca22dfd247f06e2a669ad968300e71ef08d:/src/dolphinview.cpp diff --git a/src/dolphinview.cpp b/src/dolphinview.cpp index 3a8d6a8ea..8b36e4ec3 100644 --- a/src/dolphinview.cpp +++ b/src/dolphinview.cpp @@ -29,7 +29,6 @@ #include #include -#include #include #include #include @@ -42,12 +41,12 @@ #include #include +#include "dolphinmodel.h" #include "dolphincolumnview.h" #include "dolphincontroller.h" #include "dolphinsortfilterproxymodel.h" #include "dolphindetailsview.h" #include "dolphiniconsview.h" -#include "dolphinitemcategorizer.h" #include "renamedialog.h" #include "viewproperties.h" #include "dolphinsettings.h" @@ -56,7 +55,7 @@ DolphinView::DolphinView(QWidget* parent, const KUrl& url, KDirLister* dirLister, - KDirModel* dirModel, + DolphinModel* dolphinModel, DolphinSortFilterProxyModel* proxyModel) : QWidget(parent), m_active(true), @@ -69,7 +68,7 @@ DolphinView::DolphinView(QWidget* parent, m_detailsView(0), m_columnView(0), m_fileItemDelegate(0), - m_dirModel(dirModel), + m_dolphinModel(dolphinModel), m_dirLister(dirLister), m_proxyModel(proxyModel) { @@ -93,8 +92,8 @@ DolphinView::DolphinView(QWidget* parent, this, SIGNAL(urlChanged(const KUrl&))); connect(m_controller, SIGNAL(requestContextMenu(const QPoint&)), this, SLOT(openContextMenu(const QPoint&))); - connect(m_controller, SIGNAL(urlsDropped(const KUrl::List&, const QModelIndex&, QWidget*)), - this, SLOT(dropUrls(const KUrl::List&, const QModelIndex&, QWidget*))); + connect(m_controller, SIGNAL(urlsDropped(const KUrl::List&, const KUrl&, const QModelIndex&, QWidget*)), + this, SLOT(dropUrls(const KUrl::List&, const KUrl&, const QModelIndex&, QWidget*))); connect(m_controller, SIGNAL(sortingChanged(DolphinView::Sorting)), this, SLOT(updateSorting(DolphinView::Sorting))); connect(m_controller, SIGNAL(sortOrderChanged(Qt::SortOrder)), @@ -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,35 +229,27 @@ bool DolphinView::showHiddenFiles() const void DolphinView::setCategorizedSorting(bool categorized) { - if (!supportsCategorizedSorting() || (categorized == categorizedSorting())) { + if (categorized == categorizedSorting()) { return; } - Q_ASSERT(m_iconsView != 0); - if (categorized) { - Q_ASSERT(m_iconsView->itemCategorizer() == 0); - m_iconsView->setItemCategorizer(new DolphinItemCategorizer()); - } else { - KItemCategorizer* categorizer = m_iconsView->itemCategorizer(); - m_iconsView->setItemCategorizer(0); - delete categorizer; - } + // 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_proxyModel->setCategorizedModel(categorized); + m_proxyModel->sort(m_proxyModel->sortColumn(), m_proxyModel->sortOrder()); + emit categorizedSortingChanged(); } bool DolphinView::categorizedSorting() const { - if (!supportsCategorizedSorting()) { - return false; - } - - Q_ASSERT(m_iconsView != 0); - return m_iconsView->itemCategorizer() != 0; + return m_proxyModel->isCategorizedModel(); } bool DolphinView::supportsCategorizedSorting() const @@ -263,9 +265,11 @@ void DolphinView::selectAll() void DolphinView::invertSelection() { if (isColumnViewActive()) { - // In opposite to QAbstractItemView::selectAll() there is no virtual method - // for adjusting the invertion of a selection. As the generic approach by using - // the selection model does not work for the column view, we delegate this task: + // 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(); @@ -275,7 +279,7 @@ void DolphinView::invertSelection() const QModelIndex bottomRight = itemModel->index(itemModel->rowCount() - 1, itemModel->columnCount() - 1); - QItemSelection selection(topLeft, bottomRight); + const QItemSelection selection(topLeft, bottomRight); selectionModel->select(selection, QItemSelectionModel::Toggle); } } @@ -294,7 +298,7 @@ QList DolphinView::selectedItems() const { const QAbstractItemView* view = itemView(); - // Our view has a selection, we will map them back to the DirModel + // Our view has a selection, we will map them back to the DolphinModel // and then fill the KFileItemList. Q_ASSERT((view != 0) && (view->selectionModel() != 0)); @@ -302,11 +306,8 @@ QList DolphinView::selectedItems() const QList itemList; const QModelIndexList indexList = selection.indexes(); - QModelIndexList::const_iterator end = indexList.end(); - for (QModelIndexList::const_iterator it = indexList.begin(); it != end; ++it) { - Q_ASSERT((*it).isValid()); - - KFileItem item = m_dirModel->itemForIndex(*it); + foreach (QModelIndex index, indexList) { + KFileItem item = m_dolphinModel->itemForIndex(index); if (!item.isNull()) { itemList.append(item); } @@ -328,14 +329,18 @@ KUrl::List DolphinView::selectedUrls() const KFileItem DolphinView::fileItem(const QModelIndex& index) const { - const QModelIndex dirModelIndex = m_proxyModel->mapToSource(index); - return m_dirModel->itemForIndex(dirModelIndex); + const QModelIndex dolphinModelIndex = m_proxyModel->mapToSource(index); + return m_dolphinModel->itemForIndex(dolphinModelIndex); } void DolphinView::setContentsPosition(int x, int y) { QAbstractItemView* view = itemView(); - view->horizontalScrollBar()->setValue(x); + + // the ColumnView takes care itself for the horizontal scrolling + if (!isColumnViewActive()) { + view->horizontalScrollBar()->setValue(x); + } view->verticalScrollBar()->setValue(y); m_loadingDirectory = false; @@ -424,23 +429,42 @@ 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) { QWidget::mouseReleaseEvent(event); - setActive(true);; + setActive(true); } void DolphinView::activate() { @@ -458,7 +482,8 @@ void DolphinView::triggerItem(const QModelIndex& index) return; } - const KFileItem item = m_dirModel->itemForIndex(m_proxyModel->mapToSource(index)); + const KFileItem item = m_dolphinModel->itemForIndex(m_proxyModel->mapToSource(index)); + if (item.isNull()) { return; } @@ -484,15 +509,15 @@ void DolphinView::showPreview(const KFileItem& item, const QPixmap& pixmap) return; } - const QModelIndex idx = m_dirModel->indexForItem(item); + const QModelIndex idx = m_dolphinModel->indexForItem(item); if (idx.isValid() && (idx.column() == 0)) { const QMimeData* mimeData = QApplication::clipboard()->mimeData(); if (KonqMimeData::decodeIsCutSelection(mimeData) && isCutItem(item)) { KIconEffect iconEffect; const QPixmap cutPixmap = iconEffect.apply(pixmap, K3Icon::Desktop, K3Icon::DisabledState); - m_dirModel->setData(idx, QIcon(cutPixmap), Qt::DecorationRole); + m_dolphinModel->setData(idx, QIcon(cutPixmap), Qt::DecorationRole); } else { - m_dirModel->setData(idx, QIcon(pixmap), Qt::DecorationRole); + m_dolphinModel->setData(idx, QIcon(pixmap), Qt::DecorationRole); } } } @@ -519,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); } } @@ -603,19 +618,10 @@ void DolphinView::applyViewProperties(const KUrl& url) emit showHiddenFilesChanged(); } - const bool categorized = props.categorizedSorting(); + const bool categorized = props.categorizedSorting() && supportsCategorizedSorting(); if (categorized != categorizedSorting()) { - if (supportsCategorizedSorting()) { - Q_ASSERT(m_iconsView != 0); - if (categorized) { - Q_ASSERT(m_iconsView->itemCategorizer() == 0); - m_iconsView->setItemCategorizer(new DolphinItemCategorizer()); - } else { - KItemCategorizer* categorizer = m_iconsView->itemCategorizer(); - m_iconsView->setItemCategorizer(0); - delete categorizer; - } - } + m_proxyModel->setCategorizedModel(categorized); + m_proxyModel->sort(m_proxyModel->sortColumn(), m_proxyModel->sortOrder()); emit categorizedSortingChanged(); } @@ -657,7 +663,7 @@ void DolphinView::changeSelection(const QList& selection) foreach(const KFileItem& item, selection) { url = item.url().upUrl(); if (baseUrl.equals(url, KUrl::CompareWithoutTrailingSlash)) { - QModelIndex index = m_proxyModel->mapFromSource(m_dirModel->indexForItem(item)); + QModelIndex index = m_proxyModel->mapFromSource(m_dolphinModel->indexForItem(item)); new_selection.select(index, index); } } @@ -679,12 +685,13 @@ void DolphinView::openContextMenu(const QPoint& pos) } void DolphinView::dropUrls(const KUrl::List& urls, - const QModelIndex& index, + const KUrl& destPath, + const QModelIndex& destIndex, QWidget* source) { KFileItem directory; - if (isValidNameIndex(index)) { - KFileItem item = fileItem(index); + if (isValidNameIndex(destIndex)) { + KFileItem item = fileItem(destIndex); Q_ASSERT(!item.isNull()); if (item.isDir()) { // the URLs are dropped above a directory @@ -699,7 +706,7 @@ void DolphinView::dropUrls(const KUrl::List& urls, } const KUrl& destination = (directory.isNull()) ? - url() : directory.url(); + destPath : directory.url(); dropUrls(urls, destination); } @@ -749,9 +756,9 @@ void DolphinView::updateCutItems() QList::const_iterator it = m_cutItemsCache.begin(); QList::const_iterator end = m_cutItemsCache.end(); while (it != end) { - const QModelIndex index = m_dirModel->indexForUrl((*it).url); + const QModelIndex index = m_dolphinModel->indexForUrl((*it).url); if (index.isValid()) { - m_dirModel->setData(index, QIcon((*it).pixmap), Qt::DecorationRole); + m_dolphinModel->setData(index, QIcon((*it).pixmap), Qt::DecorationRole); } ++it; } @@ -786,11 +793,6 @@ void DolphinView::createView() if (view != 0) { m_topLayout->removeWidget(view); view->close(); - if (view == m_iconsView) { - KItemCategorizer* categorizer = m_iconsView->itemCategorizer(); - m_iconsView->setItemCategorizer(0); - delete categorizer; - } view->deleteLater(); view = 0; m_iconsView = 0; @@ -805,10 +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); view = m_iconsView; break; + } case DetailsView: m_detailsView = new DolphinDetailsView(this, m_controller); @@ -829,7 +832,7 @@ void DolphinView::createView() view->setModel(m_proxyModel); view->setSelectionMode(QAbstractItemView::ExtendedSelection); - new KMimeTypeResolver(view, m_dirModel); + new KMimeTypeResolver(view, m_dolphinModel); m_topLayout->insertWidget(1, view); connect(view->selectionModel(), SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), @@ -838,6 +841,7 @@ void DolphinView::createView() this, SLOT(emitContentsMoved())); connect(view->horizontalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(emitContentsMoved())); + view->setFocus(); } QAbstractItemView* DolphinView::itemView() const @@ -853,7 +857,7 @@ QAbstractItemView* DolphinView::itemView() const bool DolphinView::isValidNameIndex(const QModelIndex& index) const { - return index.isValid() && (index.column() == KDirModel::Name); + return index.isValid() && (index.column() == DolphinModel::Name); } bool DolphinView::isCutItem(const KFileItem& item) const @@ -887,10 +891,10 @@ void DolphinView::applyCutItemEffect() while (it != end) { KFileItem* item = *it; if (isCutItem(*item)) { - const QModelIndex index = m_dirModel->indexForItem(*item); + const QModelIndex index = m_dolphinModel->indexForItem(*item); // Huh? the item is already known - //const KFileItem item = m_dirModel->itemForIndex(index); - const QVariant value = m_dirModel->data(index, Qt::DecorationRole); + //const KFileItem item = m_dolphinModel->itemForIndex(index); + const QVariant value = m_dolphinModel->data(index, Qt::DecorationRole); if (value.type() == QVariant::Icon) { const QIcon icon(qvariant_cast(value)); QPixmap pixmap = icon.pixmap(128, 128); @@ -905,7 +909,7 @@ void DolphinView::applyCutItemEffect() // apply icon effect to the cut item KIconEffect iconEffect; pixmap = iconEffect.apply(pixmap, K3Icon::Desktop, K3Icon::DisabledState); - m_dirModel->setData(index, QIcon(pixmap), Qt::DecorationRole); + m_dolphinModel->setData(index, QIcon(pixmap), Qt::DecorationRole); } } ++it; @@ -914,7 +918,7 @@ void DolphinView::applyCutItemEffect() void DolphinView::updateViewportColor() { - QColor color = KColorScheme(KColorScheme::View).background(); + QColor color = KColorScheme(QPalette::Active, KColorScheme::View).background().color(); if (m_active) { emit urlChanged(url()); // Hmm, this is a hack; the url hasn't really changed. emit selectionChanged(selectedItems());