X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/652d08c9242ed51d86dba3b2afda9d3b2e9a9cd7..ca5d3fde114dfdb280e46995e8a425d3ec558596:/src/views/selectionmanager.cpp diff --git a/src/views/selectionmanager.cpp b/src/views/selectionmanager.cpp index 0d3efae09..7a9e81412 100644 --- a/src/views/selectionmanager.cpp +++ b/src/views/selectionmanager.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2008 by Peter Penz * + * Copyright (C) 2008 by Peter Penz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * @@ -20,9 +20,12 @@ #include "selectionmanager.h" #include "dolphinmodel.h" +#include "dolphin_generalsettings.h" #include "selectiontoggle.h" -#include -#include +#include "settings/dolphinsettings.h" +#include +#include +#include #include #include @@ -38,37 +41,93 @@ SelectionManager::SelectionManager(QAbstractItemView* parent) : QObject(parent), m_view(parent), m_toggle(0), - m_connected(false) + m_connected(false), + m_appliedPointingHandCursor(false) { connect(parent, SIGNAL(entered(const QModelIndex&)), this, SLOT(slotEntered(const QModelIndex&))); connect(parent, SIGNAL(viewportEntered()), this, SLOT(slotViewportEntered())); - m_toggle = new SelectionToggle(m_view->viewport()); - m_toggle->setCheckable(true); - m_toggle->hide(); - connect(m_toggle, SIGNAL(clicked(bool)), - this, SLOT(setItemSelected(bool))); + + const GeneralSettings* settings = DolphinSettings::instance().generalSettings(); + if (settings->showSelectionToggle()) { + m_toggle = new SelectionToggle(m_view->viewport()); + m_toggle->setCheckable(true); + m_toggle->hide(); + connect(m_toggle, SIGNAL(clicked(bool)), + this, SLOT(setItemSelected(bool))); + m_toggle->installEventFilter(this); + } + + m_view->viewport()->installEventFilter(this); } SelectionManager::~SelectionManager() { } +bool SelectionManager::eventFilter(QObject* watched, QEvent* event) +{ + if (watched == m_view->viewport()) { + switch (event->type()) { + case QEvent::Leave: + if (m_toggle) { + m_toggle->hide(); + } + restoreCursor(); + break; + + case QEvent::MouseButtonPress: { + // Set the toggle invisible, if a mouse button has been pressed + // outside the toggle boundaries. This e.g. assures, that the toggle + // gets invisible during dragging items. + if (m_toggle) { + const QRect toggleBounds(m_toggle->mapToGlobal(QPoint(0, 0)), m_toggle->size()); + m_toggle->setVisible(toggleBounds.contains(QCursor::pos())); + } + break; + } + + default: + break; + } + } else if (watched == m_toggle) { + switch (event->type()) { + case QEvent::Enter: + QApplication::changeOverrideCursor(Qt::ArrowCursor); + break; + + case QEvent::Leave: + QApplication::changeOverrideCursor(Qt::PointingHandCursor); + break; + + default: + break; + } + } + + return QObject::eventFilter(watched, event); +} + void SelectionManager::reset() { - m_toggle->reset(); + if (m_toggle) { + m_toggle->reset(); + } } void SelectionManager::slotEntered(const QModelIndex& index) { - m_toggle->hide(); - const bool showToggle = index.isValid() && - (index.column() == DolphinModel::Name) && - (QApplication::mouseButtons() == Qt::NoButton); - if (showToggle) { - m_toggle->setUrl(urlForIndex(index)); + const bool isSelectionCandidate = index.isValid() && + (index.column() == DolphinModel::Name) && + (QApplication::mouseButtons() == Qt::NoButton); + + restoreCursor(); + if (isSelectionCandidate && KGlobalSettings::singleClick()) { + applyPointingHandCursor(); + } + if (isSelectionCandidate) { if (!m_connected) { connect(m_view->model(), SIGNAL(rowsRemoved(const QModelIndex&, int, int)), this, SLOT(slotRowsRemoved(const QModelIndex&, int, int))); @@ -78,54 +137,67 @@ void SelectionManager::slotEntered(const QModelIndex& index) SLOT(slotSelectionChanged(const QItemSelection&, const QItemSelection&))); m_connected = true; } + } else { + disconnect(m_view->model(), SIGNAL(rowsRemoved(const QModelIndex&, int, int)), + this, SLOT(slotRowsRemoved(const QModelIndex&, int, int))); + disconnect(m_view->selectionModel(), + SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), + this, + SLOT(slotSelectionChanged(const QItemSelection&, const QItemSelection&))); + m_connected = false; + } + + if (!m_toggle) { + return; + } + + m_toggle->hide(); + if (isSelectionCandidate) { + m_toggle->setUrl(urlForIndex(index)); - // increase the size of the toggle for large items - const int height = m_view->iconSize().height(); - if (height >= KIconLoader::SizeEnormous) { - m_toggle->resize(KIconLoader::SizeMedium, KIconLoader::SizeMedium); - } else if (height >= KIconLoader::SizeLarge) { - m_toggle->resize(KIconLoader::SizeSmallMedium, KIconLoader::SizeSmallMedium); - } else { - m_toggle->resize(KIconLoader::SizeSmall, KIconLoader::SizeSmall); + // Increase the size of the toggle for large items + const int iconHeight = m_view->iconSize().height(); + + int toggleSize = KIconLoader::SizeSmall; + if (iconHeight >= KIconLoader::SizeEnormous) { + toggleSize = KIconLoader::SizeMedium; + } else if (iconHeight >= KIconLoader::SizeLarge) { + toggleSize = KIconLoader::SizeSmallMedium; } + // Add a small invisible margin, if the item-height is nearly + // equal to the toggleSize (#169494). const QRect rect = m_view->visualRect(index); - int x = rect.left(); - int y = rect.top(); - if (height < KIconLoader::SizeSmallMedium) { - // The height is nearly equal to the smallest toggle height. - // Assure that the toggle is vertically centered instead - // of aligned on the top and gets more horizontal gap. - x += 2; - y += (rect.height() - m_toggle->height()) / 2; + int margin = (rect.height() - toggleSize) / 2; + if (margin > 4) { + margin = 0; } - m_toggle->move(QPoint(x, y)); + toggleSize += 2 * margin; + m_toggle->setMargin(margin); + m_toggle->resize(toggleSize, toggleSize); + m_toggle->move(rect.topLeft()); QItemSelectionModel* selModel = m_view->selectionModel(); m_toggle->setChecked(selModel->isSelected(index)); m_toggle->show(); } else { m_toggle->setUrl(KUrl()); - disconnect(m_view->model(), SIGNAL(rowsRemoved(const QModelIndex&, int, int)), - this, SLOT(slotRowsRemoved(const QModelIndex&, int, int))); - disconnect(m_view->selectionModel(), - SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), - this, - SLOT(slotSelectionChanged(const QItemSelection&, const QItemSelection&))); - m_connected = false; } } void SelectionManager::slotViewportEntered() { - m_toggle->hide(); + if (m_toggle) { + m_toggle->hide(); + } + restoreCursor(); } void SelectionManager::setItemSelected(bool selected) { emit selectionChanged(); - if (!m_toggle->url().isEmpty()) { + if (m_toggle && !m_toggle->url().isEmpty()) { const QModelIndex index = indexForUrl(m_toggle->url()); if (index.isValid()) { QItemSelectionModel* selModel = m_view->selectionModel(); @@ -144,7 +216,10 @@ void SelectionManager::slotRowsRemoved(const QModelIndex& parent, int start, int Q_UNUSED(parent); Q_UNUSED(start); Q_UNUSED(end); - m_toggle->hide(); + if (m_toggle) { + m_toggle->hide(); + } + restoreCursor(); } void SelectionManager::slotSelectionChanged(const QItemSelection& selected, @@ -153,7 +228,7 @@ void SelectionManager::slotSelectionChanged(const QItemSelection& selected, // The selection has been changed outside the scope of the selection manager // (e. g. by the rubberband or the "Select All" action). Take care updating // the state of the toggle button. - if (!m_toggle->url().isEmpty()) { + if (m_toggle && !m_toggle->url().isEmpty()) { const QModelIndex index = indexForUrl(m_toggle->url()); if (index.isValid()) { if (selected.contains(index)) { @@ -183,4 +258,21 @@ const QModelIndex SelectionManager::indexForUrl(const KUrl& url) const return proxyModel->mapFromSource(dirIndex); } + +void SelectionManager::applyPointingHandCursor() +{ + if (!m_appliedPointingHandCursor) { + QApplication::setOverrideCursor(QCursor(Qt::PointingHandCursor)); + m_appliedPointingHandCursor = true; + } +} + +void SelectionManager::restoreCursor() +{ + if (m_appliedPointingHandCursor) { + QApplication::restoreOverrideCursor(); + m_appliedPointingHandCursor = false; + } +} + #include "selectionmanager.moc"