X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/7b6ace6466cf349a4ce7a080d5e978aa0a7043e2..b1536a43422d80300afe48172444dced06e03a70:/src/dolphindetailsview.cpp diff --git a/src/dolphindetailsview.cpp b/src/dolphindetailsview.cpp index fbd7e41d5..f8e589859 100644 --- a/src/dolphindetailsview.cpp +++ b/src/dolphindetailsview.cpp @@ -27,7 +27,7 @@ #include "dolphinsortfilterproxymodel.h" #include "dolphinviewautoscroller.h" #include "draganddrophelper.h" -#include "selectionmanager.h" +#include "viewextensionsfactory.h" #include "viewproperties.h" #include "zoomlevelinfo.h" @@ -38,7 +38,6 @@ #include #include -#include #include #include #include @@ -46,7 +45,9 @@ #include #include -DolphinDetailsView::DolphinDetailsView(QWidget* parent, DolphinController* controller) : +DolphinDetailsView::DolphinDetailsView(QWidget* parent, + DolphinController* controller, + DolphinSortFilterProxyModel* proxyModel) : QTreeView(parent), m_autoResize(true), m_expandingTogglePressed(false), @@ -54,8 +55,7 @@ DolphinDetailsView::DolphinDetailsView(QWidget* parent, DolphinController* contr m_useDefaultIndexAt(true), m_ignoreScrollTo(false), m_controller(controller), - m_selectionManager(0), - m_autoScroller(0), + m_extensionsFactory(0), m_expandableFoldersAction(0), m_font(), m_decorationSize(), @@ -76,9 +76,9 @@ DolphinDetailsView::DolphinDetailsView(QWidget* parent, DolphinController* contr setRootIsDecorated(settings->expandableFolders()); setItemsExpandable(settings->expandableFolders()); setEditTriggers(QAbstractItemView::NoEditTriggers); + setModel(proxyModel); setMouseTracking(true); - m_autoScroller = new DolphinViewAutoScroller(this); const ViewProperties props(controller->url()); setSortIndicatorSection(props.sorting()); @@ -110,26 +110,18 @@ DolphinDetailsView::DolphinDetailsView(QWidget* parent, DolphinController* contr controller, SLOT(triggerItem(const QModelIndex&))); } - if (DolphinSettings::instance().generalSettings()->showSelectionToggle()) { - m_selectionManager = new SelectionManager(this); - connect(m_selectionManager, SIGNAL(selectionChanged()), - this, SLOT(requestActivation())); - connect(m_controller, SIGNAL(urlChanged(const KUrl&)), - m_selectionManager, SLOT(reset())); - } - connect(this, SIGNAL(entered(const QModelIndex&)), this, SLOT(slotEntered(const QModelIndex&))); connect(this, SIGNAL(viewportEntered()), controller, SLOT(emitViewportEntered())); + connect(controller, SIGNAL(nameFilterChanged(const QString&)), + this, SLOT(setNameFilter(const QString&))); connect(controller, SIGNAL(zoomLevelChanged(int)), this, SLOT(setZoomLevel(int))); connect(controller->dolphinView(), SIGNAL(additionalInfoChanged()), this, SLOT(updateColumnVisibility())); connect(controller, SIGNAL(activationChanged(bool)), this, SLOT(slotActivationChanged(bool))); - connect(controller, SIGNAL(scrollToCurrentItem()), - this, SLOT(scrollToCurrentItem())); if (settings->useSystemFont()) { m_font = KGlobalSettings::generalFont(); @@ -161,6 +153,9 @@ DolphinDetailsView::DolphinDetailsView(QWidget* parent, DolphinController* contr m_expandableFoldersAction->setCheckable(true); connect(m_expandableFoldersAction, SIGNAL(toggled(bool)), this, SLOT(setFoldersExpandable(bool))); + + m_extensionsFactory = new ViewExtensionsFactory(this, controller); + m_extensionsFactory->fileItemDelegate()->setMinimizedNameColumn(true); } DolphinDetailsView::~DolphinDetailsView() @@ -170,14 +165,8 @@ DolphinDetailsView::~DolphinDetailsView() bool DolphinDetailsView::event(QEvent* event) { if (event->type() == QEvent::Polish) { - QHeaderView* headerView = header(); - headerView->setResizeMode(QHeaderView::Interactive); - headerView->setMovable(false); - + header()->setResizeMode(QHeaderView::Interactive); updateColumnVisibility(); - - hideColumn(DolphinModel::Rating); - hideColumn(DolphinModel::Tags); } return QTreeView::event(event); @@ -209,20 +198,14 @@ void DolphinDetailsView::mousePressEvent(QMouseEvent* event) const QModelIndex current = currentIndex(); QTreeView::mousePressEvent(event); - m_expandingTogglePressed = false; + m_expandingTogglePressed = isAboveExpandingToggle(event->pos()); + const QModelIndex index = indexAt(event->pos()); const bool updateState = index.isValid() && (index.column() == DolphinModel::Name) && (event->button() == Qt::LeftButton); if (updateState) { - // TODO: See comment in DolphinIconsView::mousePressEvent(). Only update - // the state if no expanding/collapsing area has been hit: - const QRect rect = visualRect(index); - if (event->pos().x() >= rect.x() + indentation()) { - setState(QAbstractItemView::DraggingState); - } else { - m_expandingTogglePressed = true; - } + setState(QAbstractItemView::DraggingState); } if (!index.isValid() || (index.column() != DolphinModel::Name)) { @@ -231,8 +214,8 @@ void DolphinDetailsView::mousePressEvent(QMouseEvent* event) m_controller->replaceUrlByClipboard(); } - const Qt::KeyboardModifiers modifier = QApplication::keyboardModifiers(); - if (!(modifier & Qt::ShiftModifier) && !(modifier & Qt::ControlModifier)) { + const Qt::KeyboardModifiers mod = QApplication::keyboardModifiers(); + if (!m_expandingTogglePressed && !(mod & Qt::ShiftModifier) && !(mod & Qt::ControlModifier)) { clearSelection(); } @@ -258,6 +241,14 @@ void DolphinDetailsView::mousePressEvent(QMouseEvent* event) void DolphinDetailsView::mouseMoveEvent(QMouseEvent* event) { + if (m_expandingTogglePressed) { + // Per default QTreeView starts either a selection or a drag operation when dragging + // the expanding toggle button (Qt-issue - see TODO comment in DolphinIconsView::mousePressEvent()). + // Turn off this behavior in Dolphin to stay predictable: + setState(QAbstractItemView::NoState); + return; + } + if (m_band.show) { const QPoint mousePos = event->pos(); const QModelIndex index = indexAt(mousePos); @@ -279,31 +270,25 @@ void DolphinDetailsView::mouseMoveEvent(QMouseEvent* event) // QTreeView::mouseMoveEvent(event); QAbstractItemView::mouseMoveEvent(event); } - - if (m_expandingTogglePressed) { - // Per default QTreeView starts either a selection or a drag operation when dragging - // the expanding toggle button (Qt-issue - see TODO comment in DolphinIconsView::mousePressEvent()). - // Turn off this behavior in Dolphin to stay predictable: - clearSelection(); - setState(QAbstractItemView::NoState); - } } void DolphinDetailsView::mouseReleaseEvent(QMouseEvent* event) { - const QModelIndex index = indexAt(event->pos()); - if (index.isValid() && (index.column() == DolphinModel::Name)) { - QTreeView::mouseReleaseEvent(event); - } else { - // don't change the current index if the cursor is released - // above any other column than the name column, as the other - // columns act as viewport - const QModelIndex current = currentIndex(); - QTreeView::mouseReleaseEvent(event); - selectionModel()->setCurrentIndex(current, QItemSelectionModel::Current); + if (!m_expandingTogglePressed) { + const QModelIndex index = indexAt(event->pos()); + if (index.isValid() && (index.column() == DolphinModel::Name)) { + QTreeView::mouseReleaseEvent(event); + } else { + // don't change the current index if the cursor is released + // above any other column than the name column, as the other + // columns act as viewport + const QModelIndex current = currentIndex(); + QTreeView::mouseReleaseEvent(event); + selectionModel()->setCurrentIndex(current, QItemSelectionModel::Current); + } } - m_expandingTogglePressed = false; + if (m_band.show) { setState(NoState); updateElasticBand(); @@ -416,10 +401,6 @@ void DolphinDetailsView::resizeEvent(QResizeEvent* event) void DolphinDetailsView::wheelEvent(QWheelEvent* event) { - if (m_selectionManager != 0) { - m_selectionManager->reset(); - } - // let Ctrl+wheel events propagate to the DolphinView for icon zooming if (event->modifiers() & Qt::ControlModifier) { event->ignore(); @@ -435,9 +416,7 @@ void DolphinDetailsView::wheelEvent(QWheelEvent* event) void DolphinDetailsView::currentChanged(const QModelIndex& current, const QModelIndex& previous) { QTreeView::currentChanged(current, previous); - if (current.isValid() && !m_autoScroller->isActive()) { - scrollTo(current); - } + m_extensionsFactory->handleCurrentIndexChange(current, previous); // Stay consistent with QListView: When changing the current index by key presses, // also change the selection. @@ -545,6 +524,12 @@ QRect DolphinDetailsView::elasticBandRect() const return QRect(topLeft, bottomRight).normalized(); } +void DolphinDetailsView::setNameFilter(const QString& nameFilter) +{ + DolphinSortFilterProxyModel* proxyModel = static_cast(model()); + proxyModel->setFilterRegExp(nameFilter); +} + void DolphinDetailsView::setZoomLevel(int level) { const int size = ZoomLevelInfo::iconSizeForZoomLevel(level); @@ -560,7 +545,6 @@ void DolphinDetailsView::setZoomLevel(int level) updateDecorationSize(showPreview); } - void DolphinDetailsView::slotShowPreviewChanged() { const DolphinView* view = m_controller->dolphinView(); @@ -574,13 +558,15 @@ void DolphinDetailsView::configureSettings(const QPoint& pos) // add checkbox items for each column QHeaderView* headerView = header(); - for (int i = DolphinModel::Size; i <= DolphinModel::Type; ++i) { + const int columns = model()->columnCount(); + for (int i = 0; i < columns; ++i) { const int logicalIndex = headerView->logicalIndex(i); - const QString text = model()->headerData(i, Qt::Horizontal).toString(); + const QString text = model()->headerData(logicalIndex, Qt::Horizontal).toString(); QAction* action = popup.addAction(text); action->setCheckable(true); action->setChecked(!headerView->isSectionHidden(logicalIndex)); - action->setData(i); + action->setData(logicalIndex); + action->setEnabled(logicalIndex != DolphinModel::Name); } popup.addSeparator(); @@ -608,16 +594,41 @@ void DolphinDetailsView::configureSettings(const QPoint& pos) void DolphinDetailsView::updateColumnVisibility() { + QHeaderView* headerView = header(); + disconnect(headerView, SIGNAL(sectionMoved(int, int, int)), + this, SLOT(saveColumnPositions())); + + const DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings(); + const QList columnPositions = settings->columnPositions(); + const KFileItemDelegate::InformationList list = m_controller->dolphinView()->additionalInfo(); - for (int i = DolphinModel::Size; i <= DolphinModel::Type; ++i) { + for (int i = DolphinModel::Name; i <= DolphinModel::Version; ++i) { const KFileItemDelegate::Information info = infoForColumn(i); - const bool hide = !list.contains(info); + const bool hide = !list.contains(info) && (i != DolphinModel::Name); if (isColumnHidden(i) != hide) { setColumnHidden(i, hide); } + + const int from = headerView->visualIndex(i); + headerView->moveSection(from, columnPositions[i]); } - + resizeColumns(); + + connect(headerView, SIGNAL(sectionMoved(int, int, int)), + this, SLOT(saveColumnPositions())); + +} + +void DolphinDetailsView::saveColumnPositions() +{ + QList columnPositions; + for (int i = DolphinModel::Name; i <= DolphinModel::Version; ++i) { + columnPositions.append(header()->visualIndex(i)); + } + + DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings(); + settings->setColumnPositions(columnPositions); } void DolphinDetailsView::slotHeaderSectionResized(int logicalIndex, int oldSize, int newSize) @@ -868,11 +879,6 @@ void DolphinDetailsView::setFoldersExpandable(bool expandable) setItemsExpandable(expandable); } -void DolphinDetailsView::scrollToCurrentItem() -{ - scrollTo(currentIndex()); -} - void DolphinDetailsView::updateDecorationSize(bool showPreview) { DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings(); @@ -880,10 +886,6 @@ void DolphinDetailsView::updateDecorationSize(bool showPreview) setIconSize(QSize(iconSize, iconSize)); m_decorationSize = QSize(iconSize, iconSize); - if (m_selectionManager != 0) { - m_selectionManager->reset(); - } - doItemsLayout(); } @@ -915,13 +917,14 @@ void DolphinDetailsView::resizeColumns() QHeaderView* headerView = header(); QFontMetrics fontMetrics(viewport()->font()); - int columnWidth[KDirModel::ColumnCount]; - columnWidth[KDirModel::Size] = fontMetrics.width("00000 Items"); - columnWidth[KDirModel::ModifiedTime] = fontMetrics.width("0000-00-00 00:00"); - columnWidth[KDirModel::Permissions] = fontMetrics.width("xxxxxxxxxx"); - columnWidth[KDirModel::Owner] = fontMetrics.width("xxxxxxxxxx"); - columnWidth[KDirModel::Group] = fontMetrics.width("xxxxxxxxxx"); - columnWidth[KDirModel::Type] = fontMetrics.width("XXXX Xxxxxxx"); + int columnWidth[DolphinModel::Version + 1]; + columnWidth[DolphinModel::Size] = fontMetrics.width("00000 Items"); + columnWidth[DolphinModel::ModifiedTime] = fontMetrics.width("0000-00-00 00:00"); + columnWidth[DolphinModel::Permissions] = fontMetrics.width("xxxxxxxxxx"); + columnWidth[DolphinModel::Owner] = fontMetrics.width("xxxxxxxxxx"); + columnWidth[DolphinModel::Group] = fontMetrics.width("xxxxxxxxxx"); + columnWidth[DolphinModel::Type] = fontMetrics.width("XXXX Xxxxxxx"); + columnWidth[DolphinModel::Version] = fontMetrics.width("xxxxxxxx"); int requiredWidth = 0; for (int i = KDirModel::Size; i <= KDirModel::Type; ++i) { @@ -969,6 +972,34 @@ QRect DolphinDetailsView::nameColumnRect(const QModelIndex& index) const return rect; } +bool DolphinDetailsView::isAboveExpandingToggle(const QPoint& pos) const +{ + // QTreeView offers no public API to get the information whether an index has an + // expanding toggle and what boundaries the toggle has. The following approach + // also assumes a toggle for file items. + if (itemsExpandable()) { + const QModelIndex index = QTreeView::indexAt(pos); + if (index.isValid() && (index.column() == KDirModel::Name)) { + QRect rect = nameColumnRect(index); + const int toggleSize = rect.height(); + if (isRightToLeft()) { + rect.moveRight(rect.right()); + } else { + rect.moveLeft(rect.x() - toggleSize); + } + rect.setWidth(toggleSize); + + QStyleOption opt; + opt.initFrom(this); + opt.rect = rect; + rect = style()->subElementRect(QStyle::SE_TreeViewDisclosureItem, &opt, this); + + return rect.contains(pos); + } + } + return false; +} + DolphinDetailsView::ElasticBand::ElasticBand() : show(false), origin(),