X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/95f0ba76ae26e45a6ff9f1ec51db7d270ca278c0..fda626e07459cbd6901cbeb51da1058d0d4b3f8c:/src/dolphinview.cpp diff --git a/src/dolphinview.cpp b/src/dolphinview.cpp index 2af260f24..476f6591d 100644 --- a/src/dolphinview.cpp +++ b/src/dolphinview.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2006 by Peter Penz * + * Copyright (C) 2006-2009 by Peter Penz * * Copyright (C) 2006 by Gregor Kališnik * * * * This program is free software; you can redistribute it and/or modify * @@ -20,6 +20,7 @@ #include "dolphinview.h" +#include #include #include #include @@ -59,10 +60,8 @@ #include "dolphiniconsview.h" #include "dolphin_generalsettings.h" #include "draganddrophelper.h" -#include "folderexpander.h" #include "renamedialog.h" #include "settings/dolphinsettings.h" -#include "versioncontrolobserver.h" #include "viewproperties.h" #include "zoomlevelinfo.h" @@ -90,16 +89,14 @@ DolphinView::DolphinView(QWidget* parent, m_mode(DolphinView::IconsView), m_topLayout(0), m_controller(0), - m_fileItemDelegate(0), m_viewAccessor(proxyModel), + m_selectionModel(0), m_selectionChangedTimer(0), - m_versionControlObserver(0), m_rootUrl(), m_activeItemUrl(), m_createdItemUrl(), m_selectedItems(), - m_newFileNames(), - m_expandedDragSource(0) + m_newFileNames() { m_topLayout = new QVBoxLayout(this); m_topLayout->setSpacing(0); @@ -150,14 +147,18 @@ DolphinView::DolphinView(QWidget* parent, connect(&DolphinNewMenuObserver::instance(), SIGNAL(itemCreated(const KUrl&)), this, SLOT(observeCreatedItem(const KUrl&))); + m_selectionChangedTimer = new QTimer(this); + m_selectionChangedTimer->setSingleShot(true); + m_selectionChangedTimer->setInterval(300); + connect(m_selectionChangedTimer, SIGNAL(timeout()), + this, SLOT(emitSelectionChangedSignal())); + applyViewProperties(); m_topLayout->addWidget(m_viewAccessor.itemView()); } DolphinView::~DolphinView() { - delete m_expandedDragSource; - m_expandedDragSource = 0; } const KUrl& DolphinView::url() const @@ -229,7 +230,7 @@ void DolphinView::setMode(Mode mode) // the file item delegate has been recreated, apply the current // additional information manually const KFileItemDelegate::InformationList infoList = props.additionalInfo(); - m_fileItemDelegate->setShowInformation(infoList); + m_viewAccessor.itemDelegate()->setShowInformation(infoList); emit additionalInfoChanged(); // Not all view modes support categorized sorting. Adjust the sorting model @@ -245,7 +246,7 @@ void DolphinView::setMode(Mode mode) emit modeChanged(); updateZoomLevel(oldZoomLevel); - if (m_showPreview) { + if (m_showPreview) { loadDirectory(viewPropsUrl); } } @@ -433,7 +434,7 @@ void DolphinView::setAdditionalInfo(KFileItemDelegate::InformationList info) const KUrl viewPropsUrl = rootUrl(); ViewProperties props(viewPropsUrl); props.setAdditionalInfo(info); - m_fileItemDelegate->setShowInformation(info); + m_viewAccessor.itemDelegate()->setShowInformation(info); emit additionalInfoChanged(); @@ -444,7 +445,7 @@ void DolphinView::setAdditionalInfo(KFileItemDelegate::InformationList info) KFileItemDelegate::InformationList DolphinView::additionalInfo() const { - return m_fileItemDelegate->showInformation(); + return m_viewAccessor.itemDelegate()->showInformation(); } void DolphinView::reload() @@ -478,9 +479,7 @@ void DolphinView::updateView(const KUrl& url, const KUrl& rootUrl) } m_controller->setUrl(url); // emits urlChanged, which we forward - if (m_viewAccessor.prepareUrlChange(url)) { - initializeView(); - } + m_viewAccessor.prepareUrlChange(url); applyViewProperties(); loadDirectory(url); @@ -571,9 +570,7 @@ QString DolphinView::statusBarText() const QList DolphinView::versionControlActions(const KFileItemList& items) const { - return items.isEmpty() - ? m_versionControlObserver->contextMenuActions(url().path(KUrl::AddTrailingSlash)) - : m_versionControlObserver->contextMenuActions(items); + return m_controller->versionControlActions(items); } void DolphinView::setUrl(const KUrl& url) @@ -754,8 +751,6 @@ void DolphinView::setShowPreview(bool show) // As the view does not emit a signal when the icon size has been changed, // the used zoom level of the controller must be adjusted manually: updateZoomLevel(oldZoomLevel); - - loadDirectory(viewPropsUrl); } void DolphinView::setShowHiddenFiles(bool show) @@ -770,8 +765,6 @@ void DolphinView::setShowHiddenFiles(bool show) m_viewAccessor.dirLister()->setShowingDotFiles(show); emit showHiddenFilesChanged(); - - loadDirectory(viewPropsUrl); } void DolphinView::setCategorizedSorting(bool categorized) @@ -857,18 +850,6 @@ bool DolphinView::eventFilter(QObject* watched, QEvent* event) } break; - case QEvent::MouseButtonPress: - if ((watched == m_viewAccessor.itemView()->viewport()) && (m_expandedDragSource != 0)) { - // Listening to a mousebutton press event to delete expanded views is a - // workaround, as it seems impossible for the FolderExpander to know when - // a dragging outside a view has been finished. However it works quite well: - // A mousebutton press event indicates that a drag operation must be - // finished already. - m_expandedDragSource->deleteLater(); - m_expandedDragSource = 0; - } - break; - case QEvent::DragEnter: if (watched == m_viewAccessor.itemView()->viewport()) { setActive(true); @@ -986,7 +967,7 @@ void DolphinView::updateAdditionalInfo(const KFileItemDelegate::InformationList& props.setAdditionalInfo(info); props.save(); - m_fileItemDelegate->setShowInformation(info); + m_viewAccessor.itemDelegate()->setShowInformation(info); emit additionalInfoChanged(); } @@ -1017,7 +998,7 @@ void DolphinView::updateAdditionalInfoActions(KActionCollection* collection) showGroupInfo->setEnabled(enable); showMimeInfo->setEnabled(enable); - foreach (KFileItemDelegate::Information info, m_fileItemDelegate->showInformation()) { + foreach (KFileItemDelegate::Information info, m_viewAccessor.itemDelegate()->showInformation()) { switch (info) { case KFileItemDelegate::Size: showSizeInfo->setChecked(true); @@ -1068,26 +1049,6 @@ bool DolphinView::itemsExpandable() const return m_viewAccessor.itemsExpandable(); } -void DolphinView::deleteWhenNotDragSource(QAbstractItemView *view) -{ - if (view == 0) - return; - - if (DragAndDropHelper::instance().isDragSource(view)) { - // We must store for later deletion. - if (m_expandedDragSource != 0) { - // The old stored view is obviously not the drag source anymore. - m_expandedDragSource->deleteLater(); - m_expandedDragSource = 0; - } - view->hide(); - m_expandedDragSource = view; - } - else { - view->deleteLater(); - } -} - void DolphinView::observeCreatedItem(const KUrl& url) { m_createdItemUrl = url; @@ -1212,7 +1173,6 @@ void DolphinView::loadDirectory(const KUrl& url, bool reload) connect(m_viewAccessor.dirLister(), SIGNAL(completed()), this, SLOT(restoreSelection())); } - m_viewAccessor.dirLister()->stop(); m_viewAccessor.dirLister()->openUrl(url, reload ? KDirLister::Reload : KDirLister::NoFlags); } @@ -1238,7 +1198,7 @@ void DolphinView::applyViewProperties() createView(); } Q_ASSERT(m_viewAccessor.itemView() != 0); - Q_ASSERT(m_fileItemDelegate != 0); + Q_ASSERT(m_viewAccessor.itemDelegate() != 0); const bool showHiddenFiles = props.showHiddenFiles(); if (showHiddenFiles != m_viewAccessor.dirLister()->showingDotFiles()) { @@ -1272,8 +1232,8 @@ void DolphinView::applyViewProperties() } KFileItemDelegate::InformationList info = props.additionalInfo(); - if (info != m_fileItemDelegate->showInformation()) { - m_fileItemDelegate->setShowInformation(info); + if (info != m_viewAccessor.itemDelegate()->showInformation()) { + m_viewAccessor.itemDelegate()->setShowInformation(info); emit additionalInfoChanged(); } @@ -1302,7 +1262,32 @@ void DolphinView::createView() deleteView(); Q_ASSERT(m_viewAccessor.itemView() == 0); m_viewAccessor.createView(this, m_controller, m_mode); - initializeView(); + + QAbstractItemView* view = m_viewAccessor.itemView(); + Q_ASSERT(view != 0); + view->installEventFilter(this); + view->viewport()->installEventFilter(this); + + m_controller->setItemView(view); + connect(m_controller, SIGNAL(selectionChanged()), + this, SLOT(emitDelayedSelectionChangedSignal())); + + // When changing the view mode, the selection is lost due to reinstantiating + // a new item view with a custom selection model. Pass the ownership of the + // selection model to DolphinView, so that it can be shared by all item views. + if (m_selectionModel != 0) { + view->setSelectionModel(m_selectionModel); + } else { + m_selectionModel = view->selectionModel(); + } + m_selectionModel->setParent(this); + + connect(view->verticalScrollBar(), SIGNAL(valueChanged(int)), + this, SLOT(emitContentsMoved())); + connect(view->horizontalScrollBar(), SIGNAL(valueChanged(int)), + this, SLOT(emitContentsMoved())); + + setFocusProxy(m_viewAccessor.layoutTarget()); m_topLayout->insertWidget(1, m_viewAccessor.layoutTarget()); } @@ -1324,83 +1309,10 @@ void DolphinView::deleteView() m_controller->disconnect(view); view->disconnect(); - // TODO: move this code into ViewAccessor::deleteView() - deleteWhenNotDragSource(view); - view = 0; - m_viewAccessor.deleteView(); - m_fileItemDelegate = 0; } } -void DolphinView::initializeView() -{ - QAbstractItemView* view = m_viewAccessor.itemView(); - Q_ASSERT(view != 0); - view->installEventFilter(this); - view->viewport()->installEventFilter(this); - setFocusProxy(view); - - //if (m_mode != ColumnView) { - // Give the view the ability to auto-expand its directories on hovering - // (the column view takes care about this itself). If the details view - // uses expandable folders, the auto-expanding should be used always. - FolderExpander* folderExpander = new FolderExpander(view, m_viewAccessor.proxyModel()); - folderExpander->setEnabled(m_viewAccessor.hasExpandableFolders()); - connect(folderExpander, SIGNAL(enterDir(const QModelIndex&)), - m_controller, SLOT(triggerItem(const QModelIndex&))); - - // TODO: enable again later - /*} - else { - // Listen out for requests to delete the current column. - connect(m_viewAccessor.columnsContainer(), SIGNAL(requestColumnDeletion(QAbstractItemView*)), - this, SLOT(deleteWhenNotDragSource(QAbstractItemView*))); - }*/ - - m_controller->setItemView(view); - - m_fileItemDelegate = new DolphinFileItemDelegate(view); - m_fileItemDelegate->setShowToolTipWhenElided(false); - m_fileItemDelegate->setMinimizedNameColumn(m_mode == DetailsView); - view->setItemDelegate(m_fileItemDelegate); - - // TODO: reactivate selection model - /*view->setModel(m_viewAccessor.proxyModel()); - if (m_selectionModel != 0) { - view->setSelectionModel(m_selectionModel); - } else { - m_selectionModel = view->selectionModel(); - }*/ - - m_selectionChangedTimer = new QTimer(this); - m_selectionChangedTimer->setSingleShot(true); - m_selectionChangedTimer->setInterval(300); - connect(m_selectionChangedTimer, SIGNAL(timeout()), - this, SLOT(emitSelectionChangedSignal())); - - // reparent the selection model, as it should not be deleted - // when deleting the model - //m_selectionModel->setParent(this); - - view->setSelectionMode(QAbstractItemView::ExtendedSelection); - - m_versionControlObserver = new VersionControlObserver(view); - connect(m_versionControlObserver, SIGNAL(infoMessage(const QString&)), - this, SIGNAL(infoMessage(const QString&))); - connect(m_versionControlObserver, SIGNAL(errorMessage(const QString&)), - this, SIGNAL(errorMessage(const QString&))); - connect(m_versionControlObserver, SIGNAL(operationCompletedMessage(const QString&)), - this, SIGNAL(operationCompletedMessage(const QString&))); - - connect(view->selectionModel(), SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), - this, SLOT(emitDelayedSelectionChangedSignal())); - connect(view->verticalScrollBar(), SIGNAL(valueChanged(int)), - this, SLOT(emitContentsMoved())); - connect(view->horizontalScrollBar(), SIGNAL(valueChanged(int)), - this, SLOT(emitContentsMoved())); -} - void DolphinView::pasteToUrl(const KUrl& url) { addNewFileNames(QApplication::clipboard()->mimeData()); @@ -1445,10 +1357,17 @@ DolphinView::ViewAccessor::ViewAccessor(DolphinSortFilterProxyModel* proxyModel) m_iconsView(0), m_detailsView(0), m_columnsContainer(0), - m_proxyModel(proxyModel) + m_proxyModel(proxyModel), + m_dragSource(0) { } +DolphinView::ViewAccessor::~ViewAccessor() +{ + delete m_dragSource; + m_dragSource = 0; +} + void DolphinView::ViewAccessor::createView(QWidget* parent, DolphinController* controller, Mode mode) @@ -1475,9 +1394,25 @@ void DolphinView::ViewAccessor::createView(QWidget* parent, void DolphinView::ViewAccessor::deleteView() { - // TODO: Move the deleteWhenNotDragSource() code into the view - // accessor, so that creating and deleting is fully done by - // the view accessor. + QAbstractItemView* view = itemView(); + if (view != 0) { + if (DragAndDropHelper::instance().isDragSource(view)) { + // The view is a drag source (the feature "Open folders + // during drag operations" is used). Deleting the view + // during an ongoing drag operation is not allowed, so + // this will postponed. + if (m_dragSource != 0) { + // the old stored view is obviously not the drag source anymore + m_dragSource->deleteLater(); + m_dragSource = 0; + } + view->hide(); + m_dragSource = view; + } else { + view->deleteLater(); + } + } + m_iconsView = 0; m_detailsView = 0; @@ -1486,12 +1421,11 @@ void DolphinView::ViewAccessor::deleteView() } -bool DolphinView::ViewAccessor::prepareUrlChange(const KUrl& url) +void DolphinView::ViewAccessor::prepareUrlChange(const KUrl& url) { if (m_columnsContainer != 0) { - return m_columnsContainer->showColumn(url); + m_columnsContainer->showColumn(url); } - return false; } QAbstractItemView* DolphinView::ViewAccessor::itemView() const @@ -1511,6 +1445,11 @@ QAbstractItemView* DolphinView::ViewAccessor::itemView() const return 0; } +KFileItemDelegate* DolphinView::ViewAccessor::itemDelegate() const +{ + return static_cast(itemView()->itemDelegate()); +} + QWidget* DolphinView::ViewAccessor::layoutTarget() const { if (m_columnsContainer != 0) { @@ -1529,13 +1468,6 @@ bool DolphinView::ViewAccessor::supportsCategorizedSorting() const return m_iconsView != 0; } -bool DolphinView::ViewAccessor::hasExpandableFolders() const -{ - const DolphinSettings& settings = DolphinSettings::instance(); - return settings.generalSettings()->autoExpandFolders() || - ((m_detailsView != 0) && settings.detailsModeSettings()->expandableFolders()); -} - bool DolphinView::ViewAccessor::itemsExpandable() const { return (m_detailsView != 0) && m_detailsView->itemsExpandable(); @@ -1548,7 +1480,6 @@ bool DolphinView::ViewAccessor::reloadOnAdditionalInfoChange() const return m_detailsView != 0; } - DolphinModel* DolphinView::ViewAccessor::dirModel() const { return static_cast(proxyModel()->sourceModel());