X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/772a55aafc2e558302d042eb65026b9b50302ccc..dbc8874c00c35aaefacdd03f8aef9e4ac4e2be01:/src/dolphinview.cpp diff --git a/src/dolphinview.cpp b/src/dolphinview.cpp index ab413f765..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), @@ -71,8 +71,7 @@ DolphinView::DolphinView(QWidget* parent, m_fileItemDelegate(0), m_dolphinModel(dolphinModel), m_dirLister(dirLister), - m_proxyModel(proxyModel), - m_rootUrl(url) + m_proxyModel(proxyModel) { setFocusPolicy(Qt::StrongFocus); m_topLayout = new QVBoxLayout(this); @@ -122,11 +121,6 @@ const KUrl& DolphinView::url() const return m_controller->url(); } -void DolphinView::setRootUrl(const KUrl& url) -{ - m_rootUrl = url; -} - KUrl DolphinView::rootUrl() const { return isColumnViewActive() ? m_dirLister->url() : url(); @@ -175,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(); @@ -225,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()); @@ -243,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 @@ -258,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 @@ -382,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() @@ -414,22 +448,22 @@ 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 KUrl oldRootUrl = rootUrl(); + const bool restoreColumnView = !rootUrl.isEmpty() + && !rootUrl.equals(url, KUrl::CompareWithoutTrailingSlash) + && rootUrl.isParentOf(url); + m_controller->setUrl(url); // emits urlChanged, which we forward - const bool restoreColumnView = !isColumnViewActive() - && m_rootUrl.isParentOf(url) - && (m_rootUrl != url); if (restoreColumnView) { - applyViewProperties(m_rootUrl); - startDirLister(m_rootUrl); + applyViewProperties(rootUrl); Q_ASSERT(itemView() == m_columnView); + startDirLister(rootUrl); m_columnView->showColumn(url); } else { applyViewProperties(url); @@ -438,10 +472,12 @@ void DolphinView::setUrl(const KUrl& url) itemView()->setFocus(); - const KUrl newRootUrl = rootUrl(); - if (newRootUrl != oldRootUrl) { - emit rootUrlChanged(newRootUrl); - } + emit startedPathLoading(url); +} + +void DolphinView::setUrl(const KUrl& url) +{ + updateView(url, KUrl()); } void DolphinView::mouseReleaseEvent(QMouseEvent* event) @@ -497,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); @@ -601,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(); } @@ -619,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); } @@ -789,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); @@ -871,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); @@ -884,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); } }