+ // 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);
+}
+
+void DolphinDetailsView::slotEntered(const QModelIndex& index)
+{
+ if (index.column() == DolphinModel::Name) {
+ m_controller->emitItemEntered(index);
+ } else {
+ m_controller->emitViewportEntered();
+ }
+}
+
+void DolphinDetailsView::updateElasticBand()
+{
+ if (m_band.show) {
+ QRect dirtyRegion(elasticBandRect());
+ const QPoint scrollPos(horizontalScrollBar()->value(), verticalScrollBar()->value());
+ m_band.destination = viewport()->mapFromGlobal(QCursor::pos()) + scrollPos;
+ // Going above the (logical) top-left of the view causes complications during selection;
+ // we may as well prevent it.
+ if (m_band.destination.y() < 0)
+ m_band.destination.setY(0);
+ if (m_band.destination.x() < 0)
+ m_band.destination.setX(0);
+
+ dirtyRegion = dirtyRegion.united(elasticBandRect());
+ setDirtyRegion(dirtyRegion);
+ }
+}
+
+QRect DolphinDetailsView::elasticBandRect() const
+{
+ const QPoint pos(contentsPos());
+ const QPoint scrollPos(horizontalScrollBar()->value(), verticalScrollBar()->value());
+
+ const QPoint topLeft = m_band.origin - pos - scrollPos;
+ const QPoint bottomRight = m_band.destination - pos - scrollPos;
+ return QRect(topLeft, bottomRight).normalized();
+}
+
+void DolphinDetailsView::setZoomLevel(int level)
+{
+ const int size = ZoomLevelInfo::iconSizeForZoomLevel(level);
+ DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings();
+
+ const bool showPreview = m_controller->dolphinView()->showPreview();
+ if (showPreview) {
+ settings->setPreviewSize(size);
+ } else {
+ settings->setIconSize(size);
+ }
+
+ updateDecorationSize(showPreview);
+}
+
+
+void DolphinDetailsView::slotShowPreviewChanged()
+{
+ const DolphinView* view = m_controller->dolphinView();
+ updateDecorationSize(view->showPreview());
+}
+
+void DolphinDetailsView::configureColumns(const QPoint& pos)
+{
+ KMenu popup(this);
+ popup.addTitle(i18nc("@title:menu", "Columns"));
+
+ QHeaderView* headerView = header();
+ for (int i = DolphinModel::Size; i <= DolphinModel::Type; ++i) {
+ const int logicalIndex = headerView->logicalIndex(i);
+ const QString text = model()->headerData(i, Qt::Horizontal).toString();
+ QAction* action = popup.addAction(text);
+ action->setCheckable(true);
+ action->setChecked(!headerView->isSectionHidden(logicalIndex));
+ action->setData(i);
+ }
+
+ QAction* activatedAction = popup.exec(header()->mapToGlobal(pos));
+ if (activatedAction != 0) {
+ const bool show = activatedAction->isChecked();
+ const int columnIndex = activatedAction->data().toInt();
+
+ KFileItemDelegate::InformationList list = m_controller->dolphinView()->additionalInfo();
+ const KFileItemDelegate::Information info = infoForColumn(columnIndex);
+ if (show) {
+ Q_ASSERT(!list.contains(info));
+ list.append(info);
+ } else {
+ Q_ASSERT(list.contains(info));
+ const int index = list.indexOf(info);
+ list.removeAt(index);
+ }
+
+ m_controller->indicateAdditionalInfoChange(list);
+ setColumnHidden(columnIndex, !show);
+ resizeColumns();
+ }
+}
+
+void DolphinDetailsView::updateColumnVisibility()
+{
+ const KFileItemDelegate::InformationList list = m_controller->dolphinView()->additionalInfo();
+ for (int i = DolphinModel::Size; i <= DolphinModel::Type; ++i) {
+ const KFileItemDelegate::Information info = infoForColumn(i);
+ const bool hide = !list.contains(info);
+ if (isColumnHidden(i) != hide) {
+ setColumnHidden(i, hide);
+ }
+ }
+
+ resizeColumns();
+}
+
+void DolphinDetailsView::slotHeaderSectionResized(int logicalIndex, int oldSize, int newSize)
+{
+ Q_UNUSED(logicalIndex);
+ Q_UNUSED(oldSize);
+ Q_UNUSED(newSize);
+ // If the user changes the size of the headers, the autoresize feature should be
+ // turned off. As there is no dedicated interface to find out whether the header
+ // section has been resized by the user or by a resize event, the following approach is used:
+ if ((QApplication::mouseButtons() & Qt::LeftButton) && isVisible()) {
+ disableAutoResizing();
+ }
+}
+
+void DolphinDetailsView::slotActivationChanged(bool active)
+{
+ setAlternatingRowColors(active);
+}
+
+void DolphinDetailsView::disableAutoResizing()
+{
+ m_autoResize = false;
+}
+
+void DolphinDetailsView::requestActivation()
+{
+ m_controller->requestActivation();
+}
+
+void DolphinDetailsView::updateFont()
+{
+ const DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings();
+ Q_ASSERT(settings != 0);
+
+ if (settings->useSystemFont()) {
+ m_font = KGlobalSettings::generalFont();
+ }
+}
+
+void DolphinDetailsView::updateElasticBandSelection()
+{
+ if (!m_band.show) {
+ return;
+ }
+
+ // Ensure the elastic band itself is up-to-date, in
+ // case we are being called due to e.g. a drag event.
+ updateElasticBand();
+
+ // Clip horizontally to the name column, as some filenames will be
+ // longer than the column. We don't clip vertically as origin
+ // may be above or below the current viewport area.
+ const int nameColumnX = header()->sectionPosition(DolphinModel::Name);
+ const int nameColumnWidth = header()->sectionSize(DolphinModel::Name);
+ QRect selRect = elasticBandRect().normalized();
+ QRect nameColumnArea(nameColumnX, selRect.y(), nameColumnWidth, selRect.height());
+ selRect = nameColumnArea.intersect(selRect).normalized();
+ // Get the last elastic band rectangle, expressed in viewpoint coordinates.
+ const QPoint scrollPos(horizontalScrollBar()->value(), verticalScrollBar()->value());
+ QRect oldSelRect = QRect(m_band.lastSelectionOrigin - scrollPos, m_band.lastSelectionDestination - scrollPos).normalized();
+
+ if (selRect.isNull()) {
+ selectionModel()->select(m_band.originalSelection, QItemSelectionModel::ClearAndSelect);
+ m_band.ignoreOldInfo = true;
+ return;
+ }
+
+ if (!m_band.ignoreOldInfo) {
+ // Do some quick checks to see if we can rule out the need to
+ // update the selection.
+ Q_ASSERT(uniformRowHeights());
+ QModelIndex dummyIndex = model()->index(0, 0);
+ if (!dummyIndex.isValid()) {
+ // No items in the model presumably.
+ return;