X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/c8072005fada01d772595ec64adca449134f421e..dbc8874c00c35aaefacdd03f8aef9e4ac4e2be01:/src/dolphinview.cpp diff --git a/src/dolphinview.cpp b/src/dolphinview.cpp index 31ee64fed..9379a49cb 100644 --- a/src/dolphinview.cpp +++ b/src/dolphinview.cpp @@ -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), @@ -93,8 +93,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 +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 @@ -376,22 +407,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) { - return m_fileItemDelegate->additionalInformation(); + KFileItemDelegate::InformationList list; + if (info != KFileItemDelegate::NoInformation) + list << info; + + setAdditionalInfo(list); +} + +KFileItemDelegate::InformationList DolphinView::additionalInfo() const +{ + return m_fileItemDelegate->showInformation(); } void DolphinView::reload() @@ -408,24 +448,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() { @@ -475,7 +533,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); @@ -505,41 +563,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 +637,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(); } @@ -607,10 +657,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); } @@ -655,12 +705,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 @@ -675,7 +726,7 @@ void DolphinView::dropUrls(const KUrl::List& urls, } const KUrl& destination = (directory.isNull()) ? - url() : directory.url(); + destPath : directory.url(); dropUrls(urls, destination); } @@ -776,11 +827,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); @@ -858,9 +909,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); @@ -871,13 +922,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); } }