X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/dcf397ae512850805dbe37fc03ece82be2660bd0..7a0cbf257323176be420ea5d29f0d466cd682193:/src/dolphindetailsview.cpp diff --git a/src/dolphindetailsview.cpp b/src/dolphindetailsview.cpp index 69fe5760f..8292db8aa 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,9 +55,9 @@ 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_expandedUrls(), m_font(), m_decorationSize(), m_band() @@ -76,9 +77,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,14 +111,6 @@ 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()), @@ -133,9 +126,10 @@ DolphinDetailsView::DolphinDetailsView(QWidget* parent, DolphinController* contr 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); @@ -145,7 +139,6 @@ DolphinDetailsView::DolphinDetailsView(QWidget* parent, DolphinController* contr connect(view, SIGNAL(showPreviewChanged()), this, SLOT(slotShowPreviewChanged())); - updateDecorationSize(view->showPreview()); setFocus(); viewport()->installEventFilter(this); @@ -159,17 +152,58 @@ DolphinDetailsView::DolphinDetailsView(QWidget* parent, DolphinController* contr m_expandableFoldersAction->setCheckable(true); connect(m_expandableFoldersAction, SIGNAL(toggled(bool)), this, SLOT(setFoldersExpandable(bool))); + + connect(this, SIGNAL(expanded(const QModelIndex&)), this, SLOT(slotExpanded(const QModelIndex&))); + connect(this, SIGNAL(collapsed(const QModelIndex&)), this, SLOT(slotCollapsed(const QModelIndex&))); + + updateDecorationSize(view->showPreview()); + + m_extensionsFactory = new ViewExtensionsFactory(this, controller); + m_extensionsFactory->fileItemDelegate()->setMinimizedNameColumn(true); + m_extensionsFactory->setAutoFolderExpandingEnabled(settings->expandableFolders()); } DolphinDetailsView::~DolphinDetailsView() { } +QSet DolphinDetailsView::expandedUrls() const +{ + return m_expandedUrls; +} + +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 + // that all visualRects have the same width, which is in general not the case here. + QRegion selectionRegion; + const QModelIndexList indexes = selection.indexes(); + + foreach(const QModelIndex& index, indexes) { + selectionRegion += visualRect(index); + } + + return selectionRegion; +} + 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); @@ -179,6 +213,7 @@ QStyleOptionViewItem DolphinDetailsView::viewOptions() const { QStyleOptionViewItem viewOptions = QTreeView::viewOptions(); viewOptions.font = m_font; + viewOptions.fontMetrics = QFontMetrics(m_font); viewOptions.showDecorationSelected = true; viewOptions.decorationSize = m_decorationSize; return viewOptions; @@ -404,18 +439,7 @@ 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(); - return; - } - - const int height = m_decorationSize.height(); - const int step = (height >= KIconLoader::SizeHuge) ? height / 10 : (KIconLoader::SizeHuge - height) / 2; + const int step = m_decorationSize.height(); verticalScrollBar()->setSingleStep(step); QTreeView::wheelEvent(event); } @@ -423,12 +447,12 @@ void DolphinDetailsView::wheelEvent(QWheelEvent* event) void DolphinDetailsView::currentChanged(const QModelIndex& current, const QModelIndex& previous) { QTreeView::currentChanged(current, previous); - m_autoScroller->handleCurrentIndexChange(current, previous); + m_extensionsFactory->handleCurrentIndexChange(current, previous); // Stay consistent with QListView: When changing the current index by key presses, // also change the selection. if (m_keyPressed) { - selectionModel()->select(current, QItemSelectionModel::ClearAndSelect); + setCurrentIndex(current); } } @@ -449,10 +473,22 @@ QModelIndex DolphinDetailsView::indexAt(const QPoint& point) const // the blank portion of the name column counts as empty space const QModelIndex index = QTreeView::indexAt(point); const bool isAboveEmptySpace = !m_useDefaultIndexAt && - (index.column() == KDirModel::Name) && !nameColumnRect(index).contains(point); + (index.column() == KDirModel::Name) && !visualRect(index).contains(point); return isAboveEmptySpace ? QModelIndex() : index; } +QRect DolphinDetailsView::visualRect(const QModelIndex& index) const +{ + QRect rect = QTreeView::visualRect(index); + const KFileItem item = m_controller->itemForIndex(index); + if (!item.isNull()) { + const int width = DolphinFileItemDelegate::nameColumnWidth(item.text(), viewOptions()); + rect.setWidth(width); + } + + return rect; +} + void DolphinDetailsView::setSelection(const QRect& rect, QItemSelectionModel::SelectionFlags command) { // We must override setSelection() as Qt calls it internally and when this happens @@ -546,7 +582,6 @@ void DolphinDetailsView::setZoomLevel(int level) updateDecorationSize(showPreview); } - void DolphinDetailsView::slotShowPreviewChanged() { const DolphinView* view = m_controller->dolphinView(); @@ -743,8 +778,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(); @@ -796,7 +830,7 @@ void DolphinDetailsView::updateElasticBandSelection() QModelIndex toggleIndexRangeBegin = QModelIndex(); do { - QRect currIndexRect = nameColumnRect(currIndex); + QRect currIndexRect = visualRect(currIndex); // Update some optimization info as we go. const int cr = currIndexRect.right(); @@ -858,6 +892,7 @@ void DolphinDetailsView::updateElasticBandSelection() currIndex = nextIndex; } while (!allItemsInBoundDone); + selectionModel()->select(itemsToToggle, QItemSelectionModel::Toggle); m_band.lastSelectionOrigin = m_band.origin; @@ -881,6 +916,43 @@ void DolphinDetailsView::setFoldersExpandable(bool expandable) setItemsExpandable(expandable); } +void DolphinDetailsView::slotExpanded(const QModelIndex& index) +{ + KFileItem item = m_controller->itemForIndex(index); + if (!item.isNull()) { + m_expandedUrls.insert(item.url()); + } +} + +void DolphinDetailsView::slotCollapsed(const QModelIndex& index) +{ + KFileItem item = m_controller->itemForIndex(index); + if (!item.isNull()) { + m_expandedUrls.remove(item.url()); + } +} + +void DolphinDetailsView::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end) +{ + removeExpandedIndexes(parent, start, end); + QTreeView::rowsAboutToBeRemoved(parent, start, end); +} + +void DolphinDetailsView::removeExpandedIndexes(const QModelIndex& parent, int start, int end) +{ + if (m_expandedUrls.isEmpty()) { + return; + } + + for (int row = start; row <= end; row++) { + const QModelIndex index = model()->index(row, 0, parent); + if (isExpanded(index)) { + slotCollapsed(index); + removeExpandedIndexes(index, 0, model()->rowCount(index) - 1); + } + } +} + void DolphinDetailsView::updateDecorationSize(bool showPreview) { DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings(); @@ -888,10 +960,6 @@ void DolphinDetailsView::updateDecorationSize(bool showPreview) setIconSize(QSize(iconSize, iconSize)); m_decorationSize = QSize(iconSize, iconSize); - if (m_selectionManager != 0) { - m_selectionManager->reset(); - } - doItemsLayout(); } @@ -966,18 +1034,6 @@ void DolphinDetailsView::resizeColumns() headerView->resizeSection(KDirModel::Name, columnWidth[KDirModel::Name]); } -QRect DolphinDetailsView::nameColumnRect(const QModelIndex& index) const -{ - QRect rect = visualRect(index); - const KFileItem item = m_controller->itemForIndex(index); - if (!item.isNull()) { - const int width = DolphinFileItemDelegate::nameColumnWidth(item.text(), viewOptions()); - rect.setWidth(width); - } - - return rect; -} - bool DolphinDetailsView::isAboveExpandingToggle(const QPoint& pos) const { // QTreeView offers no public API to get the information whether an index has an @@ -986,7 +1042,7 @@ bool DolphinDetailsView::isAboveExpandingToggle(const QPoint& pos) const if (itemsExpandable()) { const QModelIndex index = QTreeView::indexAt(pos); if (index.isValid() && (index.column() == KDirModel::Name)) { - QRect rect = nameColumnRect(index); + QRect rect = visualRect(index); const int toggleSize = rect.height(); if (isRightToLeft()) { rect.moveRight(rect.right());