diff options
author | Paweł Łukaszewicz <Pawel.Lukaszewicz@teleca.com> | 2010-12-30 15:20:23 +0100 |
---|---|---|
committer | Dominik Kapusta <dominik.kapusta@teleca.com> | 2010-12-31 15:00:21 +0100 |
commit | e38575c43c1da424ff318bed92eb63a75335333b (patch) | |
tree | d27507d7f7009d552d90b198d04a5a36de5a2a18 | |
parent | 28415b1f23cd3a5c51830b43b3836d1e355b4aff (diff) |
Fixes: NB#207322 - Navigation bar appears briefly when it should be hidden
RevBy: Marcin, Daniel, Dominik
Details: Initially navigationbar is hidden and is displayed only when not empty.
To make its inital appearance non animated, additional bool value has been added.
Unit test included.
-rw-r--r-- | src/corelib/scene/mscenemanager.h | 1 | ||||
-rw-r--r-- | src/corelib/widgets/mapplicationwindow.cpp | 22 | ||||
-rw-r--r-- | src/corelib/widgets/mapplicationwindow_p.h | 1 | ||||
-rw-r--r-- | tests/ut_mapplicationwindow/ut_mapplicationwindow.cpp | 110 | ||||
-rw-r--r-- | tests/ut_mapplicationwindow/ut_mapplicationwindow.h | 3 |
5 files changed, 133 insertions, 4 deletions
diff --git a/src/corelib/scene/mscenemanager.h b/src/corelib/scene/mscenemanager.h index 16aa2e64..3e8c8f91 100644 --- a/src/corelib/scene/mscenemanager.h +++ b/src/corelib/scene/mscenemanager.h @@ -55,6 +55,7 @@ class M_CORE_EXPORT MSceneManager : public QObject Q_OBJECT friend class MSceneWindow; friend class MWindow; + friend class MApplicationWindowPrivate; #ifdef UNIT_TEST friend class Ut_MSceneManager; diff --git a/src/corelib/widgets/mapplicationwindow.cpp b/src/corelib/widgets/mapplicationwindow.cpp index d1b1a95d..e9cff950 100644 --- a/src/corelib/widgets/mapplicationwindow.cpp +++ b/src/corelib/widgets/mapplicationwindow.cpp @@ -97,6 +97,7 @@ MApplicationWindowPrivate::MApplicationWindowPrivate() , showingStatusBar(false) , showingNavigationBar(false) , showingDockWidget(false) + , animateNavigationBarTransitions(false) , navigationBarPressed(false) , navigationBarAnimation(0) , styleContainer(0) @@ -206,7 +207,12 @@ void MApplicationWindowPrivate::init() SLOT(_q_scheduleNavigationBarVisibilityUpdate())); navigationBar->setStyleName(style()->navigationBarStyleName()); - sceneManager->appearSceneWindowNow(navigationBar); + + // Create the view to get the "isEmpty" property updates. + navigationBar->view(); + navigationBar->setVisible(false); + sceneManager->addSceneWindow(navigationBar); + sceneManager->appearSceneWindowNow(homeButtonPanel); navigationBarAnimation = new MContentFadeAndSlideAnimation(q); @@ -770,9 +776,13 @@ void MApplicationWindowPrivate::_q_updateNavigationBarVisibility() bool navigationBarIsEmpty = navigationBar->property("isEmpty").toBool(); if (navigationBarIsEmpty) - sceneManager->disappearSceneWindow(navigationBar); - else - sceneManager->appearSceneWindow(navigationBar); + sceneManager->disappearSceneWindow(navigationBar); + else { + if (animateNavigationBarTransitions) + sceneManager->appearSceneWindow(navigationBar); + else + sceneManager->appearSceneWindowNow(navigationBar); + } } void MApplicationWindowPrivate::_q_scheduleNavigationBarVisibilityUpdate() @@ -860,6 +870,7 @@ void MApplicationWindowPrivate::sceneWindowDismissEvent(MSceneWindowEvent *event void MApplicationWindowPrivate::applicationPageAppearEvent(MSceneWindowEvent *event) { MApplicationPage *pageFromEvent = static_cast<MApplicationPage *>(event->sceneWindow()); + animateNavigationBarTransitions = event->animatedTransition(); // It cannot be the current page Q_ASSERT(pageFromEvent != page); @@ -1411,6 +1422,9 @@ void MApplicationWindow::mouseReleaseEvent(QMouseEvent *event) MWindow::mouseReleaseEvent(event); + // This is for skipping appearing of auto hide elements on page switch + if (d->page && d->page->sceneWindowState() == MSceneWindow::Appearing) return; + if (d->componentsOnAutoHide.count() > 0) { // restart timer d->autoHideComponentsTimer.start(); diff --git a/src/corelib/widgets/mapplicationwindow_p.h b/src/corelib/widgets/mapplicationwindow_p.h index 3a979146..46efc9bd 100644 --- a/src/corelib/widgets/mapplicationwindow_p.h +++ b/src/corelib/widgets/mapplicationwindow_p.h @@ -83,6 +83,7 @@ public: bool showingNavigationBar; bool showingDockWidget; + bool animateNavigationBarTransitions; QTimer navigationBarVisibilityUpdateTimer; bool navigationBarPressed; diff --git a/tests/ut_mapplicationwindow/ut_mapplicationwindow.cpp b/tests/ut_mapplicationwindow/ut_mapplicationwindow.cpp index 6261d0d8..c07596e1 100644 --- a/tests/ut_mapplicationwindow/ut_mapplicationwindow.cpp +++ b/tests/ut_mapplicationwindow/ut_mapplicationwindow.cpp @@ -777,4 +777,114 @@ void Ut_MApplicationWindow::testGoingBackDoesntMakeNavigationBarDisappearAndReap QCOMPARE(navigationBar->sceneWindowState(), MSceneWindow::Appeared); } +void Ut_MApplicationWindow::testNavigationBarInOutAnimations_data() +{ + //init data + QTest::addColumn<bool>("hasRootPage"); + QTest::addColumn<int>("rootPageNavBarDisplayMode"); + QTest::addColumn<bool>("hasSubPage"); + QTest::addColumn<int>("subPageNavBarDisplayMode"); + QTest::addColumn<bool>("windowHasActions"); + //results + QTest::addColumn<MSceneWindow::SceneWindowState>("initialNavBarState"); + QTest::addColumn<MSceneWindow::SceneWindowState>("subPageNavBarState"); + QTest::addColumn<MSceneWindow::SceneWindowState>("finalNavBarState"); + + // first page no actions, second page back button > no navbar, navbar slides in + QTest::newRow("1st page no actions, 2nd back button") + << true << (int)MApplicationPageModel::Show << true << (int)MApplicationPageModel::Show << false + << MSceneWindow::Disappeared << MSceneWindow::Appearing << MSceneWindow::Appeared; + + // first page no actions, second page back button and navbar hidden > no navbar, no navbar + QTest::newRow("1st page no actions, 2nd back button and navbar hidden") + << true << (int)MApplicationPageModel::Show << true << (int)MApplicationPageModel::Hide << false + << MSceneWindow::Disappeared << MSceneWindow::Disappeared << MSceneWindow::Disappeared; + + // first page one action (hidden before appear), + // second page back button and navbar hidden in create contents > no navbar, no navbar + QTest::newRow("1st page one action (hidden), 2nd + back button and navbar hidden") + << true << (int)MApplicationPageModel::Hide << true << (int)MApplicationPageModel::Hide << true + << MSceneWindow::Disappeared << MSceneWindow::Disappeared << MSceneWindow::Disappeared; + + // first page one action (hidden before appear), + // second page + back button > no navbar, navbar slides in + QTest::newRow("1st page one action, 2nd page + back button") + << true << (int)MApplicationPageModel::Hide << true << (int)MApplicationPageModel::Show << true + << MSceneWindow::Disappeared << MSceneWindow::Appearing << MSceneWindow::Appeared; + + // first page one action (hiiden before appear) > no navbar + QTest::newRow("1st page one action (hidden before appear)") + << true << (int)MApplicationPageModel::Hide << false << (int)MApplicationPageModel::Show << true + << MSceneWindow::Disappeared << MSceneWindow::Disappeared << MSceneWindow::Disappeared; + + // app window no page, no actions > no navbar + QTest::newRow("app window no page, no actions") + << false << (int)MApplicationPageModel::Show << false << (int)MApplicationPageModel::Show << false + << MSceneWindow::Disappeared << MSceneWindow::Disappeared << MSceneWindow::Disappeared; + + // app window no page, one action > initial navbar + QTest::newRow("app window no page, one action") + << false << (int)MApplicationPageModel::Show << false << (int)MApplicationPageModel::Show << true + << MSceneWindow::Appeared << MSceneWindow::Disappeared << MSceneWindow::Appeared; + + // 1st page with actions > initial navbar + QTest::newRow("1st page with actions") + << true << (int)MApplicationPageModel::Show << false << (int)MApplicationPageModel::Show << true + << MSceneWindow::Appeared << MSceneWindow::Disappeared << MSceneWindow::Appeared; + + // 1st page with actions, navbar hidden > no navbar + QTest::newRow("1st page with actions, navbar hidden") + << true << (int)MApplicationPageModel::Hide << false << (int)MApplicationPageModel::Show << true + << MSceneWindow::Disappeared << MSceneWindow::Disappeared << MSceneWindow::Disappeared; + + // 1st page one action, 2nd page + back button (hidden before appear) + // > initial navbar, navbar slides out + QTest::newRow("1st page with actions, 2nd page navbar hidden") + << true << (int)MApplicationPageModel::Show << true << (int)MApplicationPageModel::Hide << true + << MSceneWindow::Appeared << MSceneWindow::Disappearing << MSceneWindow::Disappeared; + + +} + +void Ut_MApplicationWindow::testNavigationBarInOutAnimations() +{ + QFETCH(bool, hasRootPage); + QFETCH(int,rootPageNavBarDisplayMode); + QFETCH(bool, hasSubPage); + QFETCH(int,subPageNavBarDisplayMode); + QFETCH(bool, windowHasActions); + QFETCH(MSceneWindow::SceneWindowState,initialNavBarState); + QFETCH(MSceneWindow::SceneWindowState,subPageNavBarState); + QFETCH(MSceneWindow::SceneWindowState,finalNavBarState); + + MApplicationPage *rootPage = new MApplicationPage; + MApplicationPage *subPage = new MApplicationPage; + MNavigationBar* navigationBar = m_subject->d_func()->navigationBar; + MSceneManager *sceneManager = m_subject->sceneManager(); + + if(windowHasActions) { + MAction* action = new MAction("window action", m_subject); + action->setLocation(MAction::ApplicationMenuLocation); + m_subject->addAction(action); + } + + if(hasRootPage) { + rootPage->setComponentsDisplayMode(MApplicationPage::AllComponents, (MApplicationPageModel::ComponentDisplayMode) rootPageNavBarDisplayMode); + rootPage->appear(); + } + + m_subject->show(); + QCoreApplication::processEvents(); + QCOMPARE(navigationBar->sceneWindowState(), initialNavBarState); + + if(hasSubPage) { + subPage->setComponentsDisplayMode(MApplicationPage::AllComponents, (MApplicationPageModel::ComponentDisplayMode) subPageNavBarDisplayMode); + subPage->appear(); + QCOMPARE(navigationBar->sceneWindowState(), subPageNavBarState); + } + + sceneManager->fastForwardSceneWindowTransitionAnimation(navigationBar); + QCOMPARE(navigationBar->sceneWindowState(), finalNavBarState); +} + QTEST_MAIN(Ut_MApplicationWindow) diff --git a/tests/ut_mapplicationwindow/ut_mapplicationwindow.h b/tests/ut_mapplicationwindow/ut_mapplicationwindow.h index 05b162fc..77a9eaee 100644 --- a/tests/ut_mapplicationwindow/ut_mapplicationwindow.h +++ b/tests/ut_mapplicationwindow/ut_mapplicationwindow.h @@ -95,6 +95,9 @@ private slots: void testGoingBackDoesntMakeNavigationBarDisappearAndReappear(); + void testNavigationBarInOutAnimations_data(); + void testNavigationBarInOutAnimations(); + private: MApplicationWindow *m_subject; MComponentData *m_componentData; |