X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/40c71d5ce0f6978ce48eb67fd73ed211bab4e887..96ba990d865b2dfb966961061ba5154dcd3187b4:/src/tests/kitemlistcontrollertest.cpp diff --git a/src/tests/kitemlistcontrollertest.cpp b/src/tests/kitemlistcontrollertest.cpp index 3b67e7b50..60e93e539 100644 --- a/src/tests/kitemlistcontrollertest.cpp +++ b/src/tests/kitemlistcontrollertest.cpp @@ -29,11 +29,16 @@ #include "kitemviews/private/kitemlistviewlayouter.h" #include "testdir.h" +#include +#include + +#include + namespace { const int DefaultTimeout = 2000; }; -Q_DECLARE_METATYPE(KFileItemListView::Layout); +Q_DECLARE_METATYPE(KFileItemListView::ItemLayout); Q_DECLARE_METATYPE(Qt::Orientation); Q_DECLARE_METATYPE(KItemListController::SelectionBehavior); Q_DECLARE_METATYPE(QSet); @@ -51,6 +56,7 @@ private slots: void testKeyboardNavigation_data(); void testKeyboardNavigation(); + void testMouseClickActivation(); private: /** @@ -79,22 +85,20 @@ void KItemListControllerTest::initTestCase() m_testDir = new TestDir(); m_model = new KFileItemModel(); - m_container = new KItemListContainer(); + m_view = new KFileItemListView(); + m_controller = new KItemListController(m_model, m_view, this); + m_container = new KItemListContainer(m_controller); m_controller = m_container->controller(); m_controller->setSelectionBehavior(KItemListController::MultiSelection); m_selectionManager = m_controller->selectionManager(); - m_view = new KFileItemListView(); - m_controller->setView(m_view); - m_controller->setModel(m_model); - QStringList files; files << "a1" << "a2" << "a3" << "b1" << "c1" << "c2" << "c3" << "c4" << "c5" << "d1" << "d2" << "d3" << "d4" - << "e1" << "e2" << "e3" << "e4" << "e5" << "e6" << "e7"; + << "e" << "e 2" << "e 3" << "e 4" << "e 5" << "e 6" << "e 7"; m_testDir->createFiles(files); m_model->loadDirectory(m_testDir->url()); @@ -106,15 +110,8 @@ void KItemListControllerTest::initTestCase() void KItemListControllerTest::cleanupTestCase() { - delete m_view; - m_view = 0; - delete m_container; m_container = 0; - m_controller = 0; - - delete m_model; - m_model = 0; delete m_testDir; m_testDir = 0; @@ -187,15 +184,15 @@ Q_DECLARE_METATYPE(QList); */ void KItemListControllerTest::testKeyboardNavigation_data() { - QTest::addColumn("layout"); + QTest::addColumn("layout"); QTest::addColumn("scrollOrientation"); QTest::addColumn("columnCount"); QTest::addColumn("selectionBehavior"); QTest::addColumn("groupingEnabled"); QTest::addColumn > >("testList"); - QList layoutList; - QHash layoutNames; + QList layoutList; + QHash layoutNames; layoutList.append(KFileItemListView::IconsLayout); layoutNames[KFileItemListView::IconsLayout] = "Icons"; layoutList.append(KFileItemListView::CompactLayout); @@ -219,7 +216,7 @@ void KItemListControllerTest::testKeyboardNavigation_data() groupingEnabledList.append(true); groupingEnabledNames[true] = "grouping enabled"; - foreach (KFileItemListView::Layout layout, layoutList) { + foreach (const KFileItemListView::ItemLayout& layout, layoutList) { // The following settings depend on the layout. // Note that 'columns' are actually 'rows' in // Compact layout. @@ -258,8 +255,8 @@ void KItemListControllerTest::testKeyboardNavigation_data() } foreach (int columnCount, columnCountList) { - foreach (KItemListController::SelectionBehavior selectionBehavior, selectionBehaviorList) { - foreach (bool groupingEnabled, groupingEnabledList) { + foreach (const KItemListController::SelectionBehavior& selectionBehavior, selectionBehaviorList) { + foreach (bool groupingEnabled, groupingEnabledList) { // krazy:exclude=foreach QList > testList; // First, key presses which should have the same effect @@ -285,7 +282,14 @@ void KItemListControllerTest::testKeyboardNavigation_data() << qMakePair(KeyPress(Qt::Key_Home), ViewState(0, QSet() << 0)) << qMakePair(KeyPress(Qt::Key_Space, Qt::ControlModifier), ViewState(0, QSet())) << qMakePair(KeyPress(Qt::Key_Enter), ViewState(0, QSet(), true)) - << qMakePair(KeyPress(Qt::Key_Space, Qt::ControlModifier), ViewState(0, QSet() << 0)); + << qMakePair(KeyPress(Qt::Key_Space, Qt::ControlModifier), ViewState(0, QSet() << 0)) + << qMakePair(KeyPress(Qt::Key_Space, Qt::ControlModifier), ViewState(0, QSet())) + << qMakePair(KeyPress(Qt::Key_Space), ViewState(0, QSet() << 0)) + << qMakePair(KeyPress(Qt::Key_E), ViewState(13, QSet() << 13)) + << qMakePair(KeyPress(Qt::Key_Space), ViewState(14, QSet() << 14)) + << qMakePair(KeyPress(Qt::Key_3), ViewState(15, QSet() << 15)) + << qMakePair(KeyPress(Qt::Key_Home), ViewState(0, QSet() << 0)) + << qMakePair(KeyPress(Qt::Key_Escape), ViewState(0, QSet())); // Next, we test combinations of key presses which only work for a // particular number of columns and either enabled or disabled grouping. @@ -443,7 +447,7 @@ void KItemListControllerTest::testKeyboardNavigation_data() */ void KItemListControllerTest::testKeyboardNavigation() { - QFETCH(KFileItemListView::Layout, layout); + QFETCH(KFileItemListView::ItemLayout, layout); QFETCH(Qt::Orientation, scrollOrientation); QFETCH(int, columnCount); QFETCH(KItemListController::SelectionBehavior, selectionBehavior); @@ -515,6 +519,141 @@ 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. + m_view->setScrollOffset(0); + QCOMPARE(m_view->firstVisibleIndex(), 0); + + 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); + + int iterations = 0; + const int maxIterations = 20; + while (!KGlobalSettings::singleClick() && iterations < maxIterations) { + QTest::qWait(50); + ++iterations; + } + + if (!KGlobalSettings::singleClick()) { + // TODO: Try to find a way to make sure that changing the global setting works. + QSKIP("Failed to change the KGlobalSettings::singleClick() setting!", SkipSingle); + } + + 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); + + iterations = 0; + while (KGlobalSettings::singleClick() && iterations < maxIterations) { + QTest::qWait(50); + ++iterations; + } + + if (KGlobalSettings::singleClick()) { + // TODO: Try to find a way to make sure that changing the global setting works. + QSKIP("Failed to change the KGlobalSettings::singleClick() setting!", SkipSingle); + } + + 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); + + iterations = 0; + while (!KGlobalSettings::singleClick() && iterations < maxIterations) { + QTest::qWait(50); + ++iterations; + } + + if (!KGlobalSettings::singleClick()) { + // TODO: Try to find a way to make sure that changing the global setting works. + QSKIP("Failed to change the KGlobalSettings::singleClick() setting!", SkipSingle); + } + + 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); + + iterations = 0; + while (KGlobalSettings::singleClick() != restoreKGlobalSettingsSingleClick && iterations < maxIterations) { + QTest::qWait(50); + ++iterations; + } + + if (KGlobalSettings::singleClick() != restoreKGlobalSettingsSingleClick) { + // TODO: Try to find a way to make sure that changing the global setting works. + QSKIP("Failed to change the KGlobalSettings::singleClick() setting!", SkipSingle); + } +} + void KItemListControllerTest::adjustGeometryForColumnCount(int count) { const QSize size = m_view->itemSize().toSize();