#include "viewproperties.h"
#include "dolphinsettings.h"
#include "dolphin_generalsettings.h"
-#include "dolphincategorydrawer.h"
DolphinView::DolphinView(QWidget* parent,
const KUrl& url,
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();
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);
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
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)
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);
}
}
emit showHiddenFilesChanged();
}
- const bool categorized = props.categorizedSorting();
+ const bool categorized = props.categorizedSorting() && supportsCategorizedSorting();
if (categorized != categorizedSorting()) {
m_proxyModel->setCategorizedModel(categorized);
+ m_proxyModel->sort(m_proxyModel->sortColumn(), m_proxyModel->sortOrder());
emit categorizedSortingChanged();
}
// ... 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);