X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/ecce6e87f8540aa690a2098d89e22b4ab85e325f..51cbeaf512da9ebaefb0bfcaa21cca0f47d1b79d:/src/dolphindetailsview.cpp diff --git a/src/dolphindetailsview.cpp b/src/dolphindetailsview.cpp index d90527767..75481fb36 100644 --- a/src/dolphindetailsview.cpp +++ b/src/dolphindetailsview.cpp @@ -25,9 +25,11 @@ #include "dolphinsettings.h" #include "dolphinsortfilterproxymodel.h" #include "draganddrophelper.h" +#include "selectionmanager.h" #include "viewproperties.h" #include "dolphin_detailsmodesettings.h" +#include "dolphin_generalsettings.h" #include #include @@ -43,26 +45,28 @@ DolphinDetailsView::DolphinDetailsView(QWidget* parent, DolphinController* controller) : QTreeView(parent), + m_autoResize(true), m_controller(controller), m_font(), m_decorationSize(), - m_clearAdditionalInfo(false), m_dragging(false), m_showElasticBand(false), m_elasticBandOrigin(), m_elasticBandDestination() { + const DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings(); + Q_ASSERT(settings != 0); Q_ASSERT(controller != 0); setAcceptDrops(true); - setRootIsDecorated(false); setSortingEnabled(true); setUniformRowHeights(true); setSelectionBehavior(SelectItems); setDragDropMode(QAbstractItemView::DragDrop); setDropIndicatorShown(false); setAlternatingRowColors(true); - setItemsExpandable(false); + setRootIsDecorated(settings->expandableFolders()); + setItemsExpandable(settings->expandableFolders()); setMouseTracking(true); viewport()->setAttribute(Qt::WA_Hover); @@ -77,6 +81,10 @@ DolphinDetailsView::DolphinDetailsView(QWidget* parent, DolphinController* contr headerView->setContextMenuPolicy(Qt::CustomContextMenu); connect(headerView, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(configureColumns(const QPoint&))); + connect(headerView, SIGNAL(sectionResized(int, int, int)), + this, SLOT(slotHeaderSectionResized(int, int, int))); + connect(headerView, SIGNAL(sectionHandleDoubleClicked(int)), + this, SLOT(disableAutoResizing())); connect(parent, SIGNAL(sortingChanged(DolphinView::Sorting)), this, SLOT(setSortIndicatorSection(DolphinView::Sorting))); @@ -90,6 +98,13 @@ DolphinDetailsView::DolphinDetailsView(QWidget* parent, DolphinController* contr if (KGlobalSettings::singleClick()) { connect(this, SIGNAL(clicked(const QModelIndex&)), this, SLOT(triggerItem(const QModelIndex&))); + if (DolphinSettings::instance().generalSettings()->showSelectionToggle()) { + SelectionManager* selManager = new SelectionManager(this); + connect(selManager, SIGNAL(selectionChanged()), + this, SLOT(requestActivation())); + connect(m_controller, SIGNAL(urlChanged(const KUrl&)), + selManager, SLOT(reset())); + } } else { connect(this, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(triggerItem(const QModelIndex&))); @@ -102,14 +117,17 @@ DolphinDetailsView::DolphinDetailsView(QWidget* parent, DolphinController* contr this, SLOT(zoomIn())); connect(controller, SIGNAL(zoomOut()), this, SLOT(zoomOut())); - connect(controller->dolphinView(), SIGNAL(additionalInfoChanged(const KFileItemDelegate::InformationList&)), + connect(controller->dolphinView(), SIGNAL(additionalInfoChanged()), this, SLOT(updateColumnVisibility())); - // apply the details mode settings to the widget - const DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings(); - Q_ASSERT(settings != 0); - - m_font = QFont(settings->fontFamily(), settings->fontSize()); + if (settings->useSystemFont()) { + m_font = KGlobalSettings::generalFont(); + } else { + m_font = QFont(settings->fontFamily(), + settings->fontSize(), + settings->fontWeight(), + settings->italicFont()); + } // TODO: Remove this check when 4.3.2 is released and KDE requires it... this // check avoids a division by zero happening on versions before 4.3.1. @@ -123,6 +141,9 @@ DolphinDetailsView::DolphinDetailsView(QWidget* parent, DolphinController* contr updateDecorationSize(); setFocus(); + + connect(KGlobalSettings::self(), SIGNAL(kdisplayFontChanged()), + this, SLOT(updateFont())); } DolphinDetailsView::~DolphinDetailsView() @@ -207,17 +228,39 @@ void DolphinDetailsView::mouseMoveEvent(QMouseEvent* event) // case QTreeView does no selection at all, which is not the wanted behavior // in Dolphin -> select all items within the elastic band rectangle clearSelection(); - if (mousePos.x() < header()->sectionSize(DolphinModel::Name)) { - setSelection(QRect(m_elasticBandOrigin, m_elasticBandDestination), - QItemSelectionModel::Select); - } + + const int nameColumnWidth = header()->sectionSize(DolphinModel::Name); + QRect selRect = QRect(m_elasticBandOrigin, m_elasticBandDestination).normalized(); + const QRect nameColumnsRect(0, 0, nameColumnWidth, viewport()->height()); + selRect = nameColumnsRect.intersected(selRect); + + setSelection(selRect, QItemSelectionModel::Select); } - QTreeView::mouseMoveEvent(event); + // TODO: see comment at end of method + // QTreeView::mouseMoveEvent(event); + QAbstractItemView::mouseMoveEvent(event); updateElasticBand(); } else { - QTreeView::mouseMoveEvent(event); + // TODO: see comment at end of method + //QTreeView::mouseMoveEvent(event); + QAbstractItemView::mouseMoveEvent(event); } + + // The original implementation of QTreeView::mouseMoveEvent() looks like this (Qt4.4): + // + // void QTreeView::mouseMoveEvent(QMouseEvent *event) + // { + // Q_D(QTreeView); + // if (d->itemDecorationAt(event->pos()) == -1) // ### what about expanding/collapsing state ? + // QAbstractItemView::mouseMoveEvent(event); + // } + // + // This prevents that the signal 'entered()' is emitted when the mouse is above a decoration, + // although the hovered item has changed. The SelectionManager is connected to 'entered()' + // and assumes that the old item is selected. This is currently bypassed by skipping + // the base implementation and invoking QAbstractItemView::mouseMoveEvent() directly. + // Submitted a bug report to Trolltech, bug ID is still pending. } void DolphinDetailsView::mouseReleaseEvent(QMouseEvent* event) @@ -275,6 +318,11 @@ void DolphinDetailsView::dragMoveEvent(QDragMoveEvent* event) } setDirtyRegion(m_dropRect); } + + if (event->mimeData()->hasUrls()) { + // accept url drops, independently from the destination item + event->acceptProposedAction(); + } } void DolphinDetailsView::dropEvent(QDropEvent* event) @@ -317,7 +365,7 @@ void DolphinDetailsView::paintEvent(QPaintEvent* event) // TODO: remove this code when the issue #160611 is solved in Qt 4.4 if (m_dragging) { const QBrush& brush = viewOptions().palette.brush(QPalette::Normal, QPalette::Highlight); - DragAndDropHelper::drawHoverIndication(viewport(), m_dropRect, brush); + DragAndDropHelper::drawHoverIndication(this, m_dropRect, brush); } } @@ -337,30 +385,20 @@ void DolphinDetailsView::keyPressEvent(QKeyEvent* event) void DolphinDetailsView::resizeEvent(QResizeEvent* event) { - QTreeView::resizeEvent(event); - - // TODO: There seems to be no easy way to find out whether the resize event - // has been triggered because of resizing the window or by adjusting the column-width - // by a left mouse-click (the columns should only be resized automatically when the window - // size is adjusted). The following workaround works well, but it should be - // considered solving this in a more transparent way. - if (!(QApplication::mouseButtons() & Qt::LeftButton)) { + if (m_autoResize) { resizeColumns(); } + QTreeView::resizeEvent(event); } -void DolphinDetailsView::closeEvent(QCloseEvent* event) +void DolphinDetailsView::wheelEvent(QWheelEvent* event) { - if (m_clearAdditionalInfo) { - disconnect(m_controller->dolphinView(), SIGNAL(additionalInfoChanged(const KFileItemDelegate::InformationList&)), - this, SLOT(updateColumnVisibility())); - - KFileItemDelegate::InformationList info; - info.append(KFileItemDelegate::NoInformation); - m_controller->indicateAdditionalInfoChange(info); - m_clearAdditionalInfo = false; + // let Ctrl+wheel events propagate to the DolphinView for icon zooming + if ((event->modifiers() & Qt::ControlModifier) == Qt::ControlModifier) { + event->ignore(); + return; } - QTreeView::closeEvent(event); + QTreeView::wheelEvent(event); } void DolphinDetailsView::setSortIndicatorSection(DolphinView::Sorting sorting) @@ -399,11 +437,12 @@ void DolphinDetailsView::slotEntered(const QModelIndex& index) void DolphinDetailsView::updateElasticBand() { - Q_ASSERT(m_showElasticBand); - QRect dirtyRegion(elasticBandRect()); - m_elasticBandDestination = viewport()->mapFromGlobal(QCursor::pos()); - dirtyRegion = dirtyRegion.united(elasticBandRect()); - setDirtyRegion(dirtyRegion); + if (m_showElasticBand) { + QRect dirtyRegion(elasticBandRect()); + m_elasticBandDestination = viewport()->mapFromGlobal(QCursor::pos()); + dirtyRegion = dirtyRegion.united(elasticBandRect()); + setDirtyRegion(dirtyRegion); + } } QRect DolphinDetailsView::elasticBandRect() const @@ -488,33 +527,48 @@ void DolphinDetailsView::configureColumns(const QPoint& pos) void DolphinDetailsView::updateColumnVisibility() { - KFileItemDelegate::InformationList list = m_controller->dolphinView()->additionalInfo(); - const bool useDefaultColumns = !isVisible() && - (list.isEmpty() || - list.contains(KFileItemDelegate::NoInformation)); - if (useDefaultColumns) { - // Using the details view without any additional information (-> additional column) - // makes no sense and leads to a usability problem as no viewport area is available - // anymore. Hence as fallback provide at least a size and date column. - list.clear(); - list.append(KFileItemDelegate::Size); - list.append(KFileItemDelegate::ModificationTime); - m_controller->indicateAdditionalInfoChange(list); - m_clearAdditionalInfo = true; - } - + 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); - m_clearAdditionalInfo = false; } } resizeColumns(); } +void DolphinDetailsView::slotHeaderSectionResized(int logicalIndex, int oldSize, int newSize) +{ + Q_UNUSED(logicalIndex); + Q_UNUSED(oldSize); + Q_UNUSED(newSize); + if (QApplication::mouseButtons() & Qt::LeftButton) { + disableAutoResizing(); + } +} + +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(); + } +} + bool DolphinDetailsView::isZoomInPossible() const { DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings(); @@ -531,6 +585,7 @@ void DolphinDetailsView::updateDecorationSize() { DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings(); const int iconSize = settings->iconSize(); + setIconSize(QSize(iconSize, iconSize)); m_decorationSize = QSize(iconSize, iconSize); m_controller->setZoomInPossible(isZoomInPossible());