X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/ce3ec0d0e6d2e73bcc8d465442e83c54835d36d1..02e2ef207d60098708de5ef77847e4cd1ca08397:/src/dolphinview.cpp diff --git a/src/dolphinview.cpp b/src/dolphinview.cpp index 2dd8e289b..6a6c40c7b 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), @@ -84,8 +84,8 @@ DolphinView::DolphinView(QWidget* parent, connect(m_dirLister, SIGNAL(completed()), this, SLOT(updateCutItems())); - connect(m_dirLister, SIGNAL(newItems(const QList&)), - this, SLOT(generatePreviews(const QList&))); + 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 DolphinView::selectedItems() const +KFileItemList DolphinView::selectedItems() const { const QAbstractItemView* view = itemView(); @@ -282,7 +313,7 @@ QList DolphinView::selectedItems() const Q_ASSERT((view != 0) && (view->selectionModel() != 0)); const QItemSelection selection = m_proxyModel->mapSelectionToSource(view->selectionModel()->selection()); - QList itemList; + KFileItemList itemList; const QModelIndexList indexList = selection.indexes(); foreach (QModelIndex index, indexList) { @@ -298,10 +329,9 @@ QList DolphinView::selectedItems() const KUrl::List DolphinView::selectedUrls() const { KUrl::List urls; - const QList list = selectedItems(); - for ( QList::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,22 @@ 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->setAdditionalInfoCount(info.count()); + m_fileItemDelegate->setShowInformation(info); emit additionalInfoChanged(info); startDirLister(viewPropsUrl, true); } -KFileItemDelegate::AdditionalInformation DolphinView::additionalInfo() const +KFileItemDelegate::InformationList DolphinView::additionalInfo() const { - return m_fileItemDelegate->additionalInformation(); + return m_fileItemDelegate->showInformation(); } void DolphinView::reload() @@ -408,18 +438,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 +500,7 @@ void DolphinView::triggerItem(const QModelIndex& index) emit itemTriggered(item); // caught by DolphinViewContainer or DolphinPart } -void DolphinView::generatePreviews(const QList& items) +void DolphinView::generatePreviews(const KFileItemList& items) { if (m_controller->showPreview()) { KIO::PreviewJob* job = KIO::filePreview(items, 128); @@ -475,7 +523,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 +553,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 +627,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 +647,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->setAdditionalInfoCount(info.count()); + m_fileItemDelegate->setShowInformation(info); emit additionalInfoChanged(info); } @@ -621,7 +661,7 @@ void DolphinView::applyViewProperties(const KUrl& url) } } -void DolphinView::changeSelection(const QList& selection) +void DolphinView::changeSelection(const KFileItemList& selection) { clearSelection(); if (selection.isEmpty()) { @@ -758,6 +798,11 @@ void DolphinView::clearHoverInformation() void DolphinView::createView() { + KFileItemDelegate::InformationList infoList; + if (m_fileItemDelegate != 0) { + infoList = m_fileItemDelegate->showInformation(); + } + // delete current view QAbstractItemView* view = itemView(); if (view != 0) { @@ -777,11 +822,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); @@ -797,6 +842,7 @@ void DolphinView::createView() Q_ASSERT(view != 0); m_fileItemDelegate = new KFileItemDelegate(view); + m_fileItemDelegate->setShowInformation(infoList); view->setItemDelegate(m_fileItemDelegate); view->setModel(m_proxyModel); @@ -859,9 +905,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); @@ -872,13 +918,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); } }