X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/f0e54ea52b3934bbb64b4d43a8c7dcdfd6b50de7..bd7b4faa4aa54e8bbfeee345449cd9d29c8c16c3:/src/dolphindetailsview.cpp diff --git a/src/dolphindetailsview.cpp b/src/dolphindetailsview.cpp index 5df105340..8ea5e93e6 100644 --- a/src/dolphindetailsview.cpp +++ b/src/dolphindetailsview.cpp @@ -21,13 +21,14 @@ #include "dolphindetailsview.h" #include "dolphinmodel.h" -#include "dolphincontroller.h" +#include "dolphinviewcontroller.h" #include "dolphinfileitemdelegate.h" #include "settings/dolphinsettings.h" #include "dolphinsortfilterproxymodel.h" #include "dolphinviewautoscroller.h" #include "draganddrophelper.h" #include "viewextensionsfactory.h" +#include "viewmodecontroller.h" #include "viewproperties.h" #include "zoomlevelinfo.h" @@ -46,7 +47,8 @@ #include DolphinDetailsView::DolphinDetailsView(QWidget* parent, - DolphinController* controller, + DolphinViewController* dolphinViewController, + const ViewModeController* viewModeController, DolphinSortFilterProxyModel* proxyModel) : QTreeView(parent), m_autoResize(true), @@ -54,7 +56,8 @@ DolphinDetailsView::DolphinDetailsView(QWidget* parent, m_keyPressed(false), m_useDefaultIndexAt(true), m_ignoreScrollTo(false), - m_controller(controller), + m_dolphinViewController(dolphinViewController), + m_viewModeController(viewModeController), m_extensionsFactory(0), m_expandableFoldersAction(0), m_expandedUrls(), @@ -64,7 +67,8 @@ DolphinDetailsView::DolphinDetailsView(QWidget* parent, { const DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings(); Q_ASSERT(settings != 0); - Q_ASSERT(controller != 0); + Q_ASSERT(dolphinViewController != 0); + Q_ASSERT(viewModeController != 0); setLayoutDirection(Qt::LeftToRight); setAcceptDrops(true); @@ -81,7 +85,7 @@ DolphinDetailsView::DolphinDetailsView(QWidget* parent, setMouseTracking(true); - const ViewProperties props(controller->url()); + const ViewProperties props(viewModeController->url()); setSortIndicatorSection(props.sorting()); setSortIndicatorOrder(props.sortOrder()); @@ -102,39 +106,40 @@ DolphinDetailsView::DolphinDetailsView(QWidget* parent, this, SLOT(setSortIndicatorOrder(Qt::SortOrder))); connect(this, SIGNAL(clicked(const QModelIndex&)), - controller, SLOT(requestTab(const QModelIndex&))); + dolphinViewController, SLOT(requestTab(const QModelIndex&))); if (KGlobalSettings::singleClick()) { connect(this, SIGNAL(clicked(const QModelIndex&)), - controller, SLOT(triggerItem(const QModelIndex&))); + dolphinViewController, SLOT(triggerItem(const QModelIndex&))); } else { connect(this, SIGNAL(doubleClicked(const QModelIndex&)), - controller, SLOT(triggerItem(const QModelIndex&))); + dolphinViewController, SLOT(triggerItem(const QModelIndex&))); } connect(this, SIGNAL(entered(const QModelIndex&)), this, SLOT(slotEntered(const QModelIndex&))); connect(this, SIGNAL(viewportEntered()), - controller, SLOT(emitViewportEntered())); - connect(controller, SIGNAL(zoomLevelChanged(int)), + dolphinViewController, SLOT(emitViewportEntered())); + connect(viewModeController, SIGNAL(zoomLevelChanged(int)), this, SLOT(setZoomLevel(int))); - connect(controller->dolphinView(), SIGNAL(additionalInfoChanged()), + connect(dolphinViewController->view(), SIGNAL(additionalInfoChanged()), this, SLOT(updateColumnVisibility())); - connect(controller, SIGNAL(activationChanged(bool)), + connect(viewModeController, SIGNAL(activationChanged(bool)), this, SLOT(slotActivationChanged(bool))); if (settings->useSystemFont()) { m_font = KGlobalSettings::generalFont(); } else { m_font = QFont(settings->fontFamily(), - settings->fontSize(), + qRound(settings->fontSize()), settings->fontWeight(), settings->italicFont()); + m_font.setPointSizeF(settings->fontSize()); } setVerticalScrollMode(QTreeView::ScrollPerPixel); setHorizontalScrollMode(QTreeView::ScrollPerPixel); - const DolphinView* view = controller->dolphinView(); + const DolphinView* view = dolphinViewController->view(); connect(view, SIGNAL(showPreviewChanged()), this, SLOT(slotShowPreviewChanged())); @@ -157,7 +162,7 @@ DolphinDetailsView::DolphinDetailsView(QWidget* parent, updateDecorationSize(view->showPreview()); - m_extensionsFactory = new ViewExtensionsFactory(this, controller); + m_extensionsFactory = new ViewExtensionsFactory(this, dolphinViewController, viewModeController); m_extensionsFactory->fileItemDelegate()->setMinimizedNameColumn(true); m_extensionsFactory->setAutoFolderExpandingEnabled(settings->expandableFolders()); } @@ -171,7 +176,7 @@ QSet DolphinDetailsView::expandedUrls() const return m_expandedUrls; } -QRegion DolphinDetailsView::visualRegionForSelection(const QItemSelection &selection) const +QRegion DolphinDetailsView::visualRegionForSelection(const QItemSelection& selection) const { // We have to make sure that the visualRect of each model index is inside the region. // QTreeView::visualRegionForSelection does not do it right because it assumes implicitly @@ -188,9 +193,21 @@ QRegion DolphinDetailsView::visualRegionForSelection(const QItemSelection &selec bool DolphinDetailsView::event(QEvent* event) { - if (event->type() == QEvent::Polish) { + switch (event->type()) { + case QEvent::Polish: header()->setResizeMode(QHeaderView::Interactive); updateColumnVisibility(); + break; + + case QEvent::FocusOut: + // If a key-press triggers an action that e. g. opens a dialog, the + // widget gets no key-release event. Assure that the pressed state + // is reset to prevent accidently setting the current index during a selection. + m_keyPressed = false; + break; + + default: + break; } return QTreeView::event(event); @@ -212,13 +229,13 @@ void DolphinDetailsView::contextMenuEvent(QContextMenuEvent* event) DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings(); m_expandableFoldersAction->setChecked(settings->expandableFolders()); - m_controller->triggerContextMenuRequest(event->pos(), + m_dolphinViewController->triggerContextMenuRequest(event->pos(), QList() << m_expandableFoldersAction); } void DolphinDetailsView::mousePressEvent(QMouseEvent* event) { - m_controller->requestActivation(); + m_dolphinViewController->requestActivation(); const QModelIndex current = currentIndex(); QTreeView::mousePressEvent(event); @@ -236,7 +253,7 @@ void DolphinDetailsView::mousePressEvent(QMouseEvent* event) if (!index.isValid() || (index.column() != DolphinModel::Name)) { // the mouse press is done somewhere outside the filename column if (QApplication::mouseButtons() & Qt::MidButton) { - m_controller->replaceUrlByClipboard(); + m_dolphinViewController->replaceUrlByClipboard(); } const Qt::KeyboardModifiers mod = QApplication::keyboardModifiers(); @@ -323,7 +340,7 @@ void DolphinDetailsView::mouseReleaseEvent(QMouseEvent* event) void DolphinDetailsView::startDrag(Qt::DropActions supportedActions) { - DragAndDropHelper::instance().startDrag(this, supportedActions, m_controller); + DragAndDropHelper::instance().startDrag(this, supportedActions, m_dolphinViewController); m_band.show = false; } @@ -353,7 +370,7 @@ void DolphinDetailsView::dragMoveEvent(QDragMoveEvent* event) setDirtyRegion(m_dropRect); const QModelIndex index = indexAt(event->pos()); if (index.isValid() && (index.column() == DolphinModel::Name)) { - const KFileItem item = m_controller->itemForIndex(index); + const KFileItem item = m_dolphinViewController->itemForIndex(index); if (!item.isNull() && item.isDir()) { m_dropRect = visualRect(index); } else { @@ -373,9 +390,9 @@ void DolphinDetailsView::dropEvent(QDropEvent* event) const QModelIndex index = indexAt(event->pos()); KFileItem item; if (index.isValid() && (index.column() == DolphinModel::Name)) { - item = m_controller->itemForIndex(index); + item = m_dolphinViewController->itemForIndex(index); } - m_controller->indicateDroppedUrls(item, m_controller->url(), event); + m_dolphinViewController->indicateDroppedUrls(item, m_viewModeController->url(), event); QTreeView::dropEvent(event); } @@ -407,7 +424,7 @@ void DolphinDetailsView::keyPressEvent(QKeyEvent* event) m_keyPressed = !(event->modifiers() & Qt::ControlModifier); QTreeView::keyPressEvent(event); - m_controller->handleKeyPressEvent(event); + m_dolphinViewController->handleKeyPressEvent(event); } void DolphinDetailsView::keyReleaseEvent(QKeyEvent* event) @@ -441,6 +458,10 @@ void DolphinDetailsView::currentChanged(const QModelIndex& current, const QModel if (m_keyPressed) { setCurrentIndex(current); } + + // If folders are expanded, the width which is available for editing may have changed + // because it depends on the level of the current item in the folder hierarchy. + adjustMaximumSizeForEditing(current); } bool DolphinDetailsView::eventFilter(QObject* watched, QEvent* event) @@ -449,7 +470,7 @@ bool DolphinDetailsView::eventFilter(QObject* watched, QEvent* event) // if the mouse is above an item and moved very fast outside the widget, // no viewportEntered() signal might be emitted although the mouse has been moved // above the viewport - m_controller->emitViewportEntered(); + m_dolphinViewController->emitViewportEntered(); } return QTreeView::eventFilter(watched, event); @@ -467,7 +488,7 @@ QModelIndex DolphinDetailsView::indexAt(const QPoint& point) const QRect DolphinDetailsView::visualRect(const QModelIndex& index) const { QRect rect = QTreeView::visualRect(index); - const KFileItem item = m_controller->itemForIndex(index); + const KFileItem item = m_dolphinViewController->itemForIndex(index); if (!item.isNull()) { const int width = DolphinFileItemDelegate::nameColumnWidth(item.text(), viewOptions()); rect.setWidth(width); @@ -513,16 +534,16 @@ void DolphinDetailsView::synchronizeSortingState(int column) // invoked, but Dolphin is not informed about this. DolphinView::Sorting sorting = DolphinSortFilterProxyModel::sortingForColumn(column); const Qt::SortOrder sortOrder = header()->sortIndicatorOrder(); - m_controller->indicateSortingChange(sorting); - m_controller->indicateSortOrderChange(sortOrder); + m_dolphinViewController->indicateSortingChange(sorting); + m_dolphinViewController->indicateSortOrderChange(sortOrder); } void DolphinDetailsView::slotEntered(const QModelIndex& index) { if (index.column() == DolphinModel::Name) { - m_controller->emitItemEntered(index); + m_dolphinViewController->emitItemEntered(index); } else { - m_controller->emitViewportEntered(); + m_dolphinViewController->emitViewportEntered(); } } @@ -559,7 +580,7 @@ void DolphinDetailsView::setZoomLevel(int level) const int size = ZoomLevelInfo::iconSizeForZoomLevel(level); DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings(); - const bool showPreview = m_controller->dolphinView()->showPreview(); + const bool showPreview = m_dolphinViewController->view()->showPreview(); if (showPreview) { settings->setPreviewSize(size); } else { @@ -571,7 +592,7 @@ void DolphinDetailsView::setZoomLevel(int level) void DolphinDetailsView::slotShowPreviewChanged() { - const DolphinView* view = m_controller->dolphinView(); + const DolphinView* view = m_dolphinViewController->view(); updateDecorationSize(view->showPreview()); } @@ -599,7 +620,7 @@ void DolphinDetailsView::configureSettings(const QPoint& pos) const bool show = activatedAction->isChecked(); const int columnIndex = activatedAction->data().toInt(); - KFileItemDelegate::InformationList list = m_controller->dolphinView()->additionalInfo(); + KFileItemDelegate::InformationList list = m_dolphinViewController->view()->additionalInfo(); const KFileItemDelegate::Information info = infoForColumn(columnIndex); if (show) { Q_ASSERT(!list.contains(info)); @@ -610,7 +631,7 @@ void DolphinDetailsView::configureSettings(const QPoint& pos) list.removeAt(index); } - m_controller->indicateAdditionalInfoChange(list); + m_dolphinViewController->indicateAdditionalInfoChange(list); setColumnHidden(columnIndex, !show); resizeColumns(); } @@ -625,7 +646,7 @@ void DolphinDetailsView::updateColumnVisibility() const DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings(); const QList columnPositions = settings->columnPositions(); - const KFileItemDelegate::InformationList list = m_controller->dolphinView()->additionalInfo(); + const KFileItemDelegate::InformationList list = m_dolphinViewController->view()->additionalInfo(); for (int i = DolphinModel::Name; i <= DolphinModel::Version; ++i) { const KFileItemDelegate::Information info = infoForColumn(i); const bool hide = !list.contains(info) && (i != DolphinModel::Name); @@ -668,6 +689,8 @@ void DolphinDetailsView::slotHeaderSectionResized(int logicalIndex, int oldSize, if ((QApplication::mouseButtons() & Qt::LeftButton) && header()->underMouse()) { disableAutoResizing(); } + + adjustMaximumSizeForEditing(currentIndex()); } void DolphinDetailsView::slotActivationChanged(bool active) @@ -682,7 +705,7 @@ void DolphinDetailsView::disableAutoResizing() void DolphinDetailsView::requestActivation() { - m_controller->requestActivation(); + m_dolphinViewController->requestActivation(); } void DolphinDetailsView::slotGlobalSettingsChanged(int category) @@ -695,12 +718,12 @@ void DolphinDetailsView::slotGlobalSettingsChanged(int category) m_font = KGlobalSettings::generalFont(); } //Disconnect then reconnect, since the settings have been changed, the connection requirements may have also. - disconnect(this, SIGNAL(clicked(QModelIndex)), m_controller, SLOT(triggerItem(QModelIndex))); - disconnect(this, SIGNAL(doubleClicked(QModelIndex)), m_controller, SLOT(triggerItem(QModelIndex))); + disconnect(this, SIGNAL(clicked(QModelIndex)), m_dolphinViewController, SLOT(triggerItem(QModelIndex))); + disconnect(this, SIGNAL(doubleClicked(QModelIndex)), m_dolphinViewController, SLOT(triggerItem(QModelIndex))); if (KGlobalSettings::singleClick()) { - connect(this, SIGNAL(clicked(QModelIndex)), m_controller, SLOT(triggerItem(QModelIndex))); + connect(this, SIGNAL(clicked(QModelIndex)), m_dolphinViewController, SLOT(triggerItem(QModelIndex))); } else { - connect(this, SIGNAL(doubleClicked(QModelIndex)), m_controller, SLOT(triggerItem(QModelIndex))); + connect(this, SIGNAL(doubleClicked(QModelIndex)), m_dolphinViewController, SLOT(triggerItem(QModelIndex))); } } @@ -765,8 +788,7 @@ void DolphinDetailsView::updateElasticBandSelection() return; } } - } - else { + } else { // This is the only piece of optimization data that needs to be explicitly // discarded. m_band.lastSelectionOrigin = QPoint(); @@ -880,6 +902,7 @@ void DolphinDetailsView::updateElasticBandSelection() currIndex = nextIndex; } while (!allItemsInBoundDone); + selectionModel()->select(itemsToToggle, QItemSelectionModel::Toggle); m_band.lastSelectionOrigin = m_band.origin; @@ -901,11 +924,15 @@ void DolphinDetailsView::setFoldersExpandable(bool expandable) settings->setExpandableFolders(expandable); setRootIsDecorated(expandable); setItemsExpandable(expandable); + + // The width of the space which is available for editing has changed + // because of the (dis)appearance of the expanding toggles + adjustMaximumSizeForEditing(currentIndex()); } void DolphinDetailsView::slotExpanded(const QModelIndex& index) { - KFileItem item = m_controller->itemForIndex(index); + KFileItem item = m_dolphinViewController->itemForIndex(index); if (!item.isNull()) { m_expandedUrls.insert(item.url()); } @@ -913,7 +940,7 @@ void DolphinDetailsView::slotExpanded(const QModelIndex& index) void DolphinDetailsView::slotCollapsed(const QModelIndex& index) { - KFileItem item = m_controller->itemForIndex(index); + KFileItem item = m_dolphinViewController->itemForIndex(index); if (!item.isNull()) { m_expandedUrls.remove(item.url()); } @@ -1049,6 +1076,12 @@ bool DolphinDetailsView::isAboveExpandingToggle(const QPoint& pos) const return false; } +void DolphinDetailsView::adjustMaximumSizeForEditing(const QModelIndex& index) +{ + // Make sure that the full width of the "Name" column is available for "Rename Inline" + m_extensionsFactory->fileItemDelegate()->setMaximumSize(QTreeView::visualRect(index).size()); +} + DolphinDetailsView::ElasticBand::ElasticBand() : show(false), origin(),