X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/652d08c9242ed51d86dba3b2afda9d3b2e9a9cd7..6c8c052b3ffa628fd99f4e4d726017e2fc8e0e1d:/src/views/selectionmanager.cpp diff --git a/src/views/selectionmanager.cpp b/src/views/selectionmanager.cpp index 0d3efae09..7353e5a39 100644 --- a/src/views/selectionmanager.cpp +++ b/src/views/selectionmanager.cpp @@ -49,12 +49,27 @@ SelectionManager::SelectionManager(QAbstractItemView* parent) : m_toggle->hide(); connect(m_toggle, SIGNAL(clicked(bool)), this, SLOT(setItemSelected(bool))); + + m_view->viewport()->installEventFilter(this); } SelectionManager::~SelectionManager() { } +bool SelectionManager::eventFilter(QObject* watched, QEvent* event) +{ + Q_ASSERT(watched == m_view->viewport()); + if (event->type() == 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. + const QRect toggleBounds(m_toggle->mapToGlobal(QPoint(0, 0)), m_toggle->size()); + m_toggle->setVisible(toggleBounds.contains(QCursor::pos())); + } + return QObject::eventFilter(watched, event); +} + void SelectionManager::reset() { m_toggle->reset(); @@ -79,27 +94,27 @@ void SelectionManager::slotEntered(const QModelIndex& index) m_connected = true; } - // 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));