X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/e1c74b05fdae664aa9211cba3afb7993b51ec23b..136e2ae3d75677ec008e7b5973b8e73bc38e9530:/src/dolphinview.cpp diff --git a/src/dolphinview.cpp b/src/dolphinview.cpp index 2e41b4aa4..6db79452c 100644 --- a/src/dolphinview.cpp +++ b/src/dolphinview.cpp @@ -20,6 +20,7 @@ #include "dolphinview.h" +#include #include #include #include @@ -31,7 +32,6 @@ #include #include #include -#include #include #include #include @@ -62,7 +62,6 @@ #include "draganddrophelper.h" #include "folderexpander.h" #include "renamedialog.h" -#include "tooltips/tooltipmanager.h" #include "settings/dolphinsettings.h" #include "versioncontrolobserver.h" #include "viewproperties.h" @@ -92,12 +91,9 @@ 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_previewGenerator(0), - m_toolTipManager(0), m_versionControlObserver(0), m_rootUrl(), m_activeItemUrl(), @@ -234,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 @@ -388,7 +384,6 @@ void DolphinView::setZoomLevel(int level) if (level != zoomLevel()) { m_controller->setZoomLevel(level); - m_previewGenerator->updateIcons(); emit zoomLevelChanged(level); } } @@ -439,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(); @@ -450,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() @@ -483,11 +478,8 @@ void DolphinView::updateView(const KUrl& url, const KUrl& rootUrl) return; } - m_previewGenerator->cancelPreviews(); m_controller->setUrl(url); // emits urlChanged, which we forward - if (m_viewAccessor.prepareUrlChange(url)) { - initializeView(); - } + m_viewAccessor.prepareUrlChange(url); applyViewProperties(); loadDirectory(url); @@ -754,8 +746,6 @@ void DolphinView::setShowPreview(bool show) props.setShowPreview(show); m_showPreview = show; - m_previewGenerator->setPreviewShown(show); - const int oldZoomLevel = m_controller->zoomLevel(); emit showPreviewChanged(); @@ -763,8 +753,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) @@ -779,8 +767,6 @@ void DolphinView::setShowHiddenFiles(bool show) m_viewAccessor.dirLister()->setShowingDotFiles(show); emit showHiddenFilesChanged(); - - loadDirectory(viewPropsUrl); } void DolphinView::setCategorizedSorting(bool categorized) @@ -886,10 +872,6 @@ bool DolphinView::eventFilter(QObject* watched, QEvent* event) case QEvent::KeyPress: if (watched == m_viewAccessor.itemView()) { - if (m_toolTipManager != 0) { - m_toolTipManager->hideTip(); - } - // clear the selection when Escape has been pressed QKeyEvent* keyEvent = static_cast(event); if (keyEvent->key() == Qt::Key_Escape) { @@ -924,9 +906,6 @@ void DolphinView::triggerItem(const KFileItem& item) return; } - if (m_toolTipManager != 0) { - m_toolTipManager->hideTip(); - } emit itemTriggered(item); // caught by DolphinViewContainer or DolphinPart } @@ -953,10 +932,6 @@ void DolphinView::openContextMenu(const QPoint& pos, item = m_viewAccessor.dirModel()->itemForIndex(dolphinModelIndex); } - if (m_toolTipManager != 0) { - m_toolTipManager->hideTip(); - } - m_isContextMenuOpen = true; // TODO: workaround for Qt-issue 207192 emit requestContextMenu(item, url(), customActions); m_isContextMenuOpen = false; @@ -1006,7 +981,7 @@ void DolphinView::updateAdditionalInfo(const KFileItemDelegate::InformationList& props.setAdditionalInfo(info); props.save(); - m_fileItemDelegate->setShowInformation(info); + m_viewAccessor.itemDelegate()->setShowInformation(info); emit additionalInfoChanged(); } @@ -1037,7 +1012,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); @@ -1258,7 +1233,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()) { @@ -1292,16 +1267,14 @@ 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(); } const bool showPreview = props.showPreview(); if (showPreview != m_showPreview) { m_showPreview = showPreview; - m_previewGenerator->setPreviewShown(showPreview); - const int oldZoomLevel = m_controller->zoomLevel(); emit showPreviewChanged(); @@ -1324,52 +1297,16 @@ void DolphinView::createView() deleteView(); Q_ASSERT(m_viewAccessor.itemView() == 0); m_viewAccessor.createView(this, m_controller, m_mode); - initializeView(); - m_topLayout->insertWidget(1, m_viewAccessor.layoutTarget()); -} -void DolphinView::deleteView() -{ - QAbstractItemView* view = m_viewAccessor.itemView(); - if (view != 0) { - // It's important to set the keyboard focus to the parent - // before deleting the view: Otherwise when having a split - // view the other view will get the focus and will request - // an activation (see DolphinView::eventFilter()). - setFocusProxy(0); - setFocus(); - - m_topLayout->removeWidget(view); - view->close(); - - // m_previewGenerator's parent is not always destroyed, and we - // don't want two active at once - manually delete. - delete m_previewGenerator; - m_previewGenerator = 0; - - disconnect(view); - m_controller->disconnect(view); - view->disconnect(); - - // TODO: move this code into ViewAccessor::deleteView() - deleteWhenNotDragSource(view); - view = 0; - - m_viewAccessor.deleteView(); - m_fileItemDelegate = 0; - m_toolTipManager = 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) { + + /* TODO: enable folder expanding again later + + 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. @@ -1378,8 +1315,7 @@ void DolphinView::initializeView() 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*)), @@ -1388,33 +1324,24 @@ void DolphinView::initializeView() m_controller->setItemView(view); - m_fileItemDelegate = new DolphinFileItemDelegate(view); - m_fileItemDelegate->setShowToolTipWhenElided(false); - m_fileItemDelegate->setMinimizedNameColumn(m_mode == DetailsView); - view->setItemDelegate(m_fileItemDelegate); - - 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 + // 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); view->setSelectionMode(QAbstractItemView::ExtendedSelection); - m_previewGenerator = new KFilePreviewGenerator(view); - m_previewGenerator->setPreviewShown(m_showPreview); - m_versionControlObserver = new VersionControlObserver(view); connect(m_versionControlObserver, SIGNAL(infoMessage(const QString&)), this, SIGNAL(infoMessage(const QString&))); @@ -1423,18 +1350,41 @@ void DolphinView::initializeView() connect(m_versionControlObserver, SIGNAL(operationCompletedMessage(const QString&)), this, SIGNAL(operationCompletedMessage(const QString&))); - if (DolphinSettings::instance().generalSettings()->showToolTips()) { - m_toolTipManager = new ToolTipManager(view, m_viewAccessor.proxyModel()); - connect(m_controller, SIGNAL(hideToolTip()), - m_toolTipManager, SLOT(hideTip())); - } - 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())); + + setFocusProxy(m_viewAccessor.layoutTarget()); + m_topLayout->insertWidget(1, m_viewAccessor.layoutTarget()); +} + +void DolphinView::deleteView() +{ + QAbstractItemView* view = m_viewAccessor.itemView(); + if (view != 0) { + // It's important to set the keyboard focus to the parent + // before deleting the view: Otherwise when having a split + // view the other view will get the focus and will request + // an activation (see DolphinView::eventFilter()). + setFocusProxy(0); + setFocus(); + + m_topLayout->removeWidget(view); + view->close(); + + disconnect(view); + m_controller->disconnect(view); + view->disconnect(); + + // TODO: move this code into ViewAccessor::deleteView() + deleteWhenNotDragSource(view); + view = 0; + + m_viewAccessor.deleteView(); + } } void DolphinView::pasteToUrl(const KUrl& url) @@ -1493,11 +1443,11 @@ void DolphinView::ViewAccessor::createView(QWidget* parent, switch (mode) { case IconsView: - m_iconsView = new DolphinIconsView(parent, controller); + m_iconsView = new DolphinIconsView(parent, controller, m_proxyModel); break; case DetailsView: - m_detailsView = new DolphinDetailsView(parent, controller); + m_detailsView = new DolphinDetailsView(parent, controller, m_proxyModel); break; case ColumnView: @@ -1522,12 +1472,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 @@ -1547,6 +1496,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) {