/***************************************************************************
- * Copyright (C) 2008 by Peter Penz <peter.penz@gmx.at> *
+ * Copyright (C) 2008 by Peter Penz <peter.penz19@gmail.com> *
* *
* 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 *
#include "selectionmanager.h"
#include "dolphinmodel.h"
+#include "dolphin_generalsettings.h"
#include "selectiontoggle.h"
-#include <kdirmodel.h>
-#include <kiconeffect.h>
+#include "settings/dolphinsettings.h"
+#include <KDirModel>
+#include <KGlobalSettings>
+#include <KIconEffect>
#include <QAbstractButton>
#include <QAbstractItemView>
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);
}
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()));
+ if (watched == m_view->viewport()) {
+ switch (event->type()) {
+ case QEvent::Leave:
+ if (m_toggle != 0) {
+ 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 != 0) {
+ 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 != 0) {
+ 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)));
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 == 0) {
+ return;
+ }
+
+ m_toggle->hide();
+ if (isSelectionCandidate) {
+ m_toggle->setUrl(urlForIndex(index));
// Increase the size of the toggle for large items
const int iconHeight = m_view->iconSize().height();
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 != 0) {
+ m_toggle->hide();
+ }
+ restoreCursor();
}
void SelectionManager::setItemSelected(bool selected)
{
emit selectionChanged();
- if (!m_toggle->url().isEmpty()) {
+ if ((m_toggle != 0) && !m_toggle->url().isEmpty()) {
const QModelIndex index = indexForUrl(m_toggle->url());
if (index.isValid()) {
QItemSelectionModel* selModel = m_view->selectionModel();
Q_UNUSED(parent);
Q_UNUSED(start);
Q_UNUSED(end);
- m_toggle->hide();
+ if (m_toggle != 0) {
+ m_toggle->hide();
+ }
+ restoreCursor();
}
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 != 0) && !m_toggle->url().isEmpty()) {
const QModelIndex index = indexForUrl(m_toggle->url());
if (index.isValid()) {
if (selected.contains(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"