diff --git a/src/widgets/pageview.h b/src/widgets/pageview.h --- a/src/widgets/pageview.h +++ b/src/widgets/pageview.h @@ -69,6 +69,7 @@ void onAddItemRequested(); void onRemoveItemRequested(); void onPromoteItemRequested(); + void onFilterToggled(bool show); void onCurrentChanged(const QModelIndex ¤t); private: diff --git a/src/widgets/pageview.cpp b/src/widgets/pageview.cpp --- a/src/widgets/pageview.cpp +++ b/src/widgets/pageview.cpp @@ -115,6 +115,7 @@ m_quickAddEdit(new QLineEdit(this)) { m_filterWidget->setObjectName(QStringLiteral("filterWidget")); + m_filterWidget->hide(); m_centralView->setObjectName(QStringLiteral("centralView")); m_centralView->header()->hide(); @@ -177,8 +178,8 @@ filterViewAction->setText(tr("Filter...")); filterViewAction->setIcon(QIcon::fromTheme(QStringLiteral("edit-find"))); filterViewAction->setShortcut(Qt::CTRL | Qt::Key_F); - connect(filterViewAction, &QAction::triggered, - m_filterWidget, static_cast(&QWidget::setFocus)); + filterViewAction->setCheckable(true); + connect(filterViewAction, &QAction::triggered, this, &PageView::onFilterToggled); m_actions.insert(QStringLiteral("page_view_add"), addItemAction); m_actions.insert(QStringLiteral("page_view_remove"), removeItemAction); @@ -333,6 +334,15 @@ QMetaObject::invokeMethod(m_model, "promoteItem", Q_ARG(QModelIndex, currentIndex)); } +void PageView::onFilterToggled(bool show) +{ + m_filterWidget->setVisible(show); + if (show) + m_filterWidget->setFocus(); + else + m_filterWidget->clear(); +} + void PageView::onCurrentChanged(const QModelIndex ¤t) { auto data = current.data(Presentation::QueryTreeModelBase::ObjectRole); diff --git a/tests/units/widgets/pageviewtest.cpp b/tests/units/widgets/pageviewtest.cpp --- a/tests/units/widgets/pageviewtest.cpp +++ b/tests/units/widgets/pageviewtest.cpp @@ -117,6 +117,7 @@ auto filter = page.findChild(QStringLiteral("filterWidget")); QVERIFY(filter); + QVERIFY(!filter->isVisibleTo(&page)); QVERIFY(filter->proxyModel()); QCOMPARE(filter->proxyModel(), centralView->model()); @@ -136,6 +137,8 @@ QVERIFY(promoteAction); auto filterAction = page.findChild(QStringLiteral("filterViewAction")); QVERIFY(filterAction); + QVERIFY(filterAction->isCheckable()); + QVERIFY(!filterAction->isChecked()); auto actions = page.globalActions(); QCOMPARE(actions.value(QStringLiteral("page_view_add")), addAction); @@ -208,6 +211,7 @@ centralView->setFocus(); QVERIFY(centralView->hasFocus()); QVERIFY(!quickAddEdit->hasFocus()); + QVERIFY(!filter->isVisibleTo(&page)); QVERIFY(!filterEdit->hasFocus()); auto addAction = page.findChild(QStringLiteral("addItemAction")); @@ -220,33 +224,79 @@ // THEN QVERIFY(!centralView->hasFocus()); QVERIFY(quickAddEdit->hasFocus()); + QVERIFY(!filter->isVisibleTo(&page)); QVERIFY(!filterEdit->hasFocus()); // WHEN cancelAddAction->trigger(); // THEN QVERIFY(centralView->hasFocus()); QVERIFY(!quickAddEdit->hasFocus()); + QVERIFY(!filter->isVisibleTo(&page)); QVERIFY(!filterEdit->hasFocus()); // WHEN filterAction->trigger(); // THEN QVERIFY(!centralView->hasFocus()); QVERIFY(!quickAddEdit->hasFocus()); + QVERIFY(filter->isVisibleTo(&page)); QVERIFY(filterEdit->hasFocus()); // WHEN cancelAddAction->trigger(); // THEN QVERIFY(centralView->hasFocus()); QVERIFY(!quickAddEdit->hasFocus()); + QVERIFY(filter->isVisibleTo(&page)); QVERIFY(!filterEdit->hasFocus()); } + void shouldManageFilterVisibilityThroughAction() + { + // GIVEN + Widgets::PageView page; + auto centralView = page.findChild(QStringLiteral("centralView")); + auto filter = page.findChild(QStringLiteral("filterWidget")); + auto filterEdit = filter->findChild(); + QVERIFY(filterEdit); + page.show(); + QTest::qWaitForWindowShown(&page); + + centralView->setFocus(); + QVERIFY(centralView->hasFocus()); + QVERIFY(!filter->isVisibleTo(&page)); + QVERIFY(!filterEdit->hasFocus()); + + auto filterAction = page.findChild(QStringLiteral("filterViewAction")); + + // WHEN + filterAction->trigger(); + + // THEN + QVERIFY(!centralView->hasFocus()); + QVERIFY(filter->isVisibleTo(&page)); + QVERIFY(filterEdit->hasFocus()); + + // WHEN + filterEdit->setText("Foo"); + + // THEN + QCOMPARE(filterEdit->text(), QString("Foo")); + + // WHEN + filterAction->trigger(); + + // THEN + QVERIFY(centralView->hasFocus()); + QVERIFY(!filter->isVisibleTo(&page)); + QVERIFY(!filterEdit->hasFocus()); + QVERIFY(filterEdit->text().isEmpty()); + } + void shouldCreateTasksWithNoParentWhenHittingReturnWithoutSelectedIndex() { // GIVEN