From 85ed71eb30487b653f01359e97371c6230737c44 Mon Sep 17 00:00:00 2001 From: Aniket Anvit Date: Tue, 5 Feb 2013 19:58:06 +0100 Subject: [PATCH 1/2] Apply changes of the KGlobalSettings::singleClick() setting immediately Fixes a regression introduced by commit 7a364cbf489af25e123d18713523151a3a53f814. Patch reviewed and pushed by Frank Reininghaus. BUG: 313342 FIXED-IN: 4.10.1 --- src/kitemviews/kitemlistcontroller.cpp | 14 +++++++------- src/kitemviews/kitemlistcontroller.h | 11 +++++------ src/panels/folders/folderspanel.cpp | 2 +- src/panels/places/placespanel.cpp | 2 +- 4 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp index 697e04fefc..c6239df941 100644 --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -44,7 +44,7 @@ KItemListController::KItemListController(KItemModelBase* model, KItemListView* view, QObject* parent) : QObject(parent), - m_singleClickActivation(KGlobalSettings::singleClick()), + m_singleClickActivationEnforced(false), m_selectionTogglePressed(false), m_clearSelectionIfItemsAreNotDragged(false), m_selectionBehavior(NoSelection), @@ -190,14 +190,14 @@ int KItemListController::autoActivationDelay() const return m_autoActivationTimer->interval(); } -void KItemListController::setSingleClickActivation(bool singleClick) +void KItemListController::setSingleClickActivationEnforced(bool singleClick) { - m_singleClickActivation = singleClick; + m_singleClickActivationEnforced = singleClick; } -bool KItemListController::singleClickActivation() const +bool KItemListController::singleClickActivationEnforced() const { - return m_singleClickActivation; + return m_singleClickActivationEnforced; } bool KItemListController::showEvent(QShowEvent* event) @@ -756,7 +756,7 @@ bool KItemListController::mouseReleaseEvent(QGraphicsSceneMouseEvent* event, con } else if (shiftOrControlPressed) { // The mouse click should only update the selection, not trigger the item emitItemActivated = false; - } else if (!m_singleClickActivation) { + } else if (!(KGlobalSettings::singleClick() || m_singleClickActivationEnforced)) { emitItemActivated = false; } if (emitItemActivated) { @@ -786,7 +786,7 @@ bool KItemListController::mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event, } } - bool emitItemActivated = !m_singleClickActivation && + bool emitItemActivated = !(KGlobalSettings::singleClick() || m_singleClickActivationEnforced) && (event->button() & Qt::LeftButton) && index >= 0 && index < m_model->count(); if (emitItemActivated) { diff --git a/src/kitemviews/kitemlistcontroller.h b/src/kitemviews/kitemlistcontroller.h index 235e4a9eb4..4d5fee3450 100644 --- a/src/kitemviews/kitemlistcontroller.h +++ b/src/kitemviews/kitemlistcontroller.h @@ -129,12 +129,11 @@ public: /** * If set to true, the signals itemActivated() and itemsActivated() are emitted - * after a single-click of the left mouse button. If set to false, a double-click - * is required. Per default the setting from KGlobalSettings::singleClick() is - * used. + * after a single-click of the left mouse button. If set to false (the default), + * the setting from KGlobalSettings::singleClick() is used. */ - void setSingleClickActivation(bool singleClick); - bool singleClickActivation() const; + void setSingleClickActivationEnforced(bool singleClick); + bool singleClickActivationEnforced() const; virtual bool showEvent(QShowEvent* event); virtual bool hideEvent(QHideEvent* event); @@ -301,7 +300,7 @@ private: void updateExtendedSelectionRegion(); private: - bool m_singleClickActivation; + bool m_singleClickActivationEnforced; bool m_selectionTogglePressed; bool m_clearSelectionIfItemsAreNotDragged; SelectionBehavior m_selectionBehavior; diff --git a/src/panels/folders/folderspanel.cpp b/src/panels/folders/folderspanel.cpp index 6e3a7678f6..98c06fb35e 100644 --- a/src/panels/folders/folderspanel.cpp +++ b/src/panels/folders/folderspanel.cpp @@ -152,7 +152,7 @@ void FoldersPanel::showEvent(QShowEvent* event) m_controller->setAutoActivationBehavior(KItemListController::ExpansionOnly); m_controller->setMouseDoubleClickAction(KItemListController::ActivateAndExpandItem); m_controller->setAutoActivationDelay(750); - m_controller->setSingleClickActivation(true); + m_controller->setSingleClickActivationEnforced(true); connect(m_controller, SIGNAL(itemActivated(int)), this, SLOT(slotItemActivated(int))); connect(m_controller, SIGNAL(itemMiddleClicked(int)), this, SLOT(slotItemMiddleClicked(int))); diff --git a/src/panels/places/placespanel.cpp b/src/panels/places/placespanel.cpp index 61c15a7a12..919f2ed45e 100644 --- a/src/panels/places/placespanel.cpp +++ b/src/panels/places/placespanel.cpp @@ -110,7 +110,7 @@ void PlacesPanel::showEvent(QShowEvent* event) m_controller = new KItemListController(m_model, m_view, this); m_controller->setSelectionBehavior(KItemListController::SingleSelection); - m_controller->setSingleClickActivation(true); + m_controller->setSingleClickActivationEnforced(true); readSettings(); From ec628cfa09ea3c33ef34607d5e91a23dcabd3106 Mon Sep 17 00:00:00 2001 From: Frank Reininghaus Date: Tue, 5 Feb 2013 20:06:49 +0100 Subject: [PATCH 2/2] Add unit test for bug 313342 --- src/tests/kitemlistcontrollertest.cpp | 108 ++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) diff --git a/src/tests/kitemlistcontrollertest.cpp b/src/tests/kitemlistcontrollertest.cpp index 2085dead61..8044f9ac94 100644 --- a/src/tests/kitemlistcontrollertest.cpp +++ b/src/tests/kitemlistcontrollertest.cpp @@ -29,6 +29,11 @@ #include "kitemviews/private/kitemlistviewlayouter.h" #include "testdir.h" +#include +#include + +#include + namespace { const int DefaultTimeout = 2000; }; @@ -51,6 +56,7 @@ private slots: void testKeyboardNavigation_data(); void testKeyboardNavigation(); + void testMouseClickActivation(); private: /** @@ -506,6 +512,108 @@ void KItemListControllerTest::testKeyboardNavigation() } } +void KItemListControllerTest::testMouseClickActivation() +{ + m_view->setItemLayout(KFileItemListView::IconsLayout); + + // Make sure that we have a large window, such that + // the items are visible and clickable. + adjustGeometryForColumnCount(5); + + // Make sure that the first item is visible in the view. + QTest::keyClick(m_container, Qt::Key_End, Qt::NoModifier); + QTest::keyClick(m_container, Qt::Key_Home, Qt::NoModifier); + while (m_view->firstVisibleIndex() > 0) { + QTest::qWait(50); + } + + const QPointF pos = m_view->itemContextRect(0).center(); + + // Save the "single click" setting. + const bool restoreKGlobalSettingsSingleClick = KGlobalSettings::singleClick(); + + KConfig config("kcminputrc"); + KConfigGroup group = config.group("KDE"); + + QGraphicsSceneMouseEvent mousePressEvent(QEvent::GraphicsSceneMousePress); + mousePressEvent.setPos(pos); + mousePressEvent.setButton(Qt::LeftButton); + mousePressEvent.setButtons(Qt::LeftButton); + + QGraphicsSceneMouseEvent mouseReleaseEvent(QEvent::GraphicsSceneMouseRelease); + mouseReleaseEvent.setPos(pos); + mouseReleaseEvent.setButton(Qt::LeftButton); + mouseReleaseEvent.setButtons(Qt::NoButton); + + QSignalSpy spyItemActivated(m_controller, SIGNAL(itemActivated(int))); + + // Default setting: single click activation. + group.writeEntry("SingleClick", true, KConfig::Persistent|KConfig::Global); + config.sync(); + KGlobalSettings::self()->emitChange(KGlobalSettings::SettingsChanged, KGlobalSettings::SETTINGS_MOUSE); + while (!KGlobalSettings::singleClick()) { + QTest::qWait(50); + } + m_view->event(&mousePressEvent); + m_view->event(&mouseReleaseEvent); + QCOMPARE(spyItemActivated.count(), 1); + spyItemActivated.clear(); + + // Set the global setting to "double click activation". + group.writeEntry("SingleClick", false, KConfig::Persistent|KConfig::Global); + config.sync(); + KGlobalSettings::self()->emitChange(KGlobalSettings::SettingsChanged, KGlobalSettings::SETTINGS_MOUSE); + while (KGlobalSettings::singleClick()) { + QTest::qWait(50); + } + m_view->event(&mousePressEvent); + m_view->event(&mouseReleaseEvent); + QCOMPARE(spyItemActivated.count(), 0); + spyItemActivated.clear(); + + // Enforce single click activation in the controller. + m_controller->setSingleClickActivationEnforced(true); + m_view->event(&mousePressEvent); + m_view->event(&mouseReleaseEvent); + QCOMPARE(spyItemActivated.count(), 1); + spyItemActivated.clear(); + + // Do not enforce single click activation in the controller. + m_controller->setSingleClickActivationEnforced(false); + m_view->event(&mousePressEvent); + m_view->event(&mouseReleaseEvent); + QCOMPARE(spyItemActivated.count(), 0); + spyItemActivated.clear(); + + // Set the global setting back to "single click activation". + group.writeEntry("SingleClick", true, KConfig::Persistent|KConfig::Global); + config.sync(); + KGlobalSettings::self()->emitChange(KGlobalSettings::SettingsChanged, KGlobalSettings::SETTINGS_MOUSE); + while (!KGlobalSettings::singleClick()) { + QTest::qWait(50); + } + m_view->event(&mousePressEvent); + m_view->event(&mouseReleaseEvent); + QCOMPARE(spyItemActivated.count(), 1); + spyItemActivated.clear(); + + // Enforce single click activation in the controller. + m_controller->setSingleClickActivationEnforced(true); + m_view->event(&mousePressEvent); + m_view->event(&mouseReleaseEvent); + QCOMPARE(spyItemActivated.count(), 1); + spyItemActivated.clear(); + + // Restore previous settings. + m_controller->setSingleClickActivationEnforced(true); + group.writeEntry("SingleClick", restoreKGlobalSettingsSingleClick, KConfig::Persistent|KConfig::Global); + config.sync(); + KGlobalSettings::self()->emitChange(KGlobalSettings::SettingsChanged, KGlobalSettings::SETTINGS_MOUSE); + while (KGlobalSettings::singleClick() != restoreKGlobalSettingsSingleClick) { + QTest::qWait(50); + } +} + void KItemListControllerTest::adjustGeometryForColumnCount(int count) { const QSize size = m_view->itemSize().toSize();