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&)));
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:
+ m_toggle->hide();
+ 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.
+ 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::Hide:
+ // If the toggle button gets hidden, the cursor is not above the item
+ // anymore and the shape must get restored
+ restoreCursor();
+ break;
+
+ 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();
(index.column() == DolphinModel::Name) &&
(QApplication::mouseButtons() == Qt::NoButton);
if (showToggle) {
+ applyPointingHandCursor();
+
m_toggle->setUrl(urlForIndex(index));
if (!m_connected) {
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));
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"