diff options
author | Daniel d'Andrada <daniel.dandrada@nokia.com> | 2010-01-22 14:57:12 +0200 |
---|---|---|
committer | Daniel d'Andrada <daniel.dandrada@nokia.com> | 2010-03-23 14:50:00 +0200 |
commit | 164147b9d96a107d8047019b15901104dcfe53b1 (patch) | |
tree | a38c9fac345708c2886f5ef6f0a03f9163199e07 | |
parent | ea57dee9c4d81216d7830b2801c50e18df7b3221 (diff) |
New: Automatic handling of escape button
RevBy: Dominik Kapusta
Details:
That's the final piece for the "automatic page management" use case.
Currenlty, the following code is necessary to implement a regular parentPage -> childPage navigation:
childPage->setEscapeButtonMode(DuiEscapeButtonPanelModel::BackMode);
childPage->connect(childPage, SIGNAL(backButtonClicked()), SLOT(dismiss()));
childPage->appear(DestroyWhenDismissed);
With this patch the code will be simply that:
childPage->appear(DestroyWhenDismissed);
Manual handling and wiring will still be possible, but won't be the default behavior.
-rw-r--r-- | demos/widgetsgallery/listpage.cpp | 3 | ||||
-rw-r--r-- | demos/widgetsgallery/navigationbarpage.cpp | 55 | ||||
-rw-r--r-- | demos/widgetsgallery/navigationbarpage.h | 8 | ||||
-rw-r--r-- | demos/widgetsgallery/staticpagebenchmark.cpp | 1 | ||||
-rw-r--r-- | demos/widgetsgallery/videocontainerpage.cpp | 8 | ||||
-rw-r--r-- | doc/src/news.dox | 19 | ||||
-rw-r--r-- | src/widgets/duiapplicationpage.cpp | 27 | ||||
-rw-r--r-- | src/widgets/duiapplicationpage.h | 32 | ||||
-rw-r--r-- | src/widgets/duiapplicationpagemodel.h | 32 | ||||
-rw-r--r-- | src/widgets/duiapplicationwindow.cpp | 159 | ||||
-rw-r--r-- | src/widgets/duiapplicationwindow.h | 2 | ||||
-rw-r--r-- | src/widgets/duiapplicationwindow_p.h | 8 | ||||
-rw-r--r-- | tests/ut_duiapplicationpage/ut_duiapplicationpage.cpp | 27 | ||||
-rw-r--r-- | tests/ut_duiapplicationpage/ut_duiapplicationpage.h | 1 | ||||
-rw-r--r-- | tests/ut_duiapplicationwindow/ut_duiapplicationwindow.cpp | 83 | ||||
-rw-r--r-- | tests/ut_duiapplicationwindow/ut_duiapplicationwindow.h | 9 |
16 files changed, 327 insertions, 147 deletions
diff --git a/demos/widgetsgallery/listpage.cpp b/demos/widgetsgallery/listpage.cpp index ab38245b..0a18ffae 100644 --- a/demos/widgetsgallery/listpage.cpp +++ b/demos/widgetsgallery/listpage.cpp @@ -268,8 +268,6 @@ void ListPage::addPage(TemplatePage *page) // Take ownership of page page->setParent(this); pages.append(page); - - connect(page, SIGNAL(backButtonClicked()), page, SLOT(dismiss())); } void ListPage::handleListItemClick() @@ -293,7 +291,6 @@ int ListPage::pageCount() const void ListPage::showPage(DuiApplicationPage *page) { if (page) { - page->setEscapeButtonMode(DuiEscapeButtonPanelModel::BackMode); page->appear(); shownPage = page; } diff --git a/demos/widgetsgallery/navigationbarpage.cpp b/demos/widgetsgallery/navigationbarpage.cpp index 6957d765..f7ca1a79 100644 --- a/demos/widgetsgallery/navigationbarpage.cpp +++ b/demos/widgetsgallery/navigationbarpage.cpp @@ -87,7 +87,7 @@ void NavigationBarPage::createContent() lblEscapeModeDesc = new DuiLabel(this); comboEscapeMode = new DuiComboBox(this); - connect(comboEscapeMode, SIGNAL(currentIndexChanged(int)), SLOT(changeEscapeButtonMode(int))); + connect(comboEscapeMode, SIGNAL(currentIndexChanged(int)), SLOT(changeEscapeMode(int))); lytMain->addItem(lblDisplayMode); lytMain->addItem(lytButtons); @@ -128,20 +128,20 @@ void NavigationBarPage::retranslateUi() //% "Components' display mode:" lblDisplayMode->setText(qtTrId("xx_navigationbar_display_mode")); //% "Escape Button mode:" - lblEscapeModeDesc->setText(qtTrId("xx_navigationbar_escapebutton_mode_label")); + lblEscapeModeDesc->setText(qtTrId("xx_navigationbar_escape_mode_label")); int oldIndex = comboEscapeMode->currentIndex(); comboEscapeMode->clear(); - comboEscapeMode->insertItem(BackButton, + comboEscapeMode->insertItem(Auto, + //% "Auto" + qtTrId("xx_navigationbar_auto")); + comboEscapeMode->insertItem(ManualBack, "Icon-back", - //% "Back button" - qtTrId("xx_navigationbar_back_button")); - comboEscapeMode->insertItem(CloseButton, + //% "Manual Back" + qtTrId("xx_navigationbar_manual_back")); + comboEscapeMode->insertItem(CloseWindow, "Icon-close", - //% "Close button" - qtTrId("xx_navigationbar_close_button")); - comboEscapeMode->insertItem(Hidden, - //% "Hidden" - qtTrId("xx_navigationbar_hidden")); + //% "Close Window" + qtTrId("xx_navigationbar_close_window")); if (oldIndex == -1) comboEscapeMode->setCurrentIndex(0); @@ -171,15 +171,20 @@ void NavigationBarPage::retranslateDisplayModeComboBox(DuiComboBox *combo) combo->setCurrentIndex(oldIndex); } -void NavigationBarPage::changeEscapeButtonMode(int index) +void NavigationBarPage::changeEscapeMode(int index) { switch (index) { - case BackButton: - setEscapeButtonMode(DuiEscapeButtonPanelModel::BackMode); - break; - case CloseButton: - setEscapeButtonMode(DuiEscapeButtonPanelModel::CloseMode); - break; + case Auto: + setEscapeMode(DuiApplicationPageModel::EscapeAuto); + break; + case ManualBack: + setEscapeMode(DuiApplicationPageModel::EscapeManualBack); + break; + case CloseWindow: + setEscapeMode(DuiApplicationPageModel::EscapeCloseWindow); + break; + default: + qFatal("Invalid index"); } } @@ -227,6 +232,18 @@ void NavigationBarPage::changeHomeButtonDisplayMode(int index) void NavigationBarPage::setButtonsState() { - comboEscapeMode->setCurrentIndex(escapeButtonMode()); + switch (escapeMode()) { + case DuiApplicationPageModel::EscapeAuto: + comboEscapeMode->setCurrentIndex(Auto); + break; + case DuiApplicationPageModel::EscapeManualBack: + comboEscapeMode->setCurrentIndex(ManualBack); + break; + case DuiApplicationPageModel::EscapeCloseWindow: + comboEscapeMode->setCurrentIndex(CloseWindow); + break; + default: + qFatal("Invalid page escape mode."); + } } diff --git a/demos/widgetsgallery/navigationbarpage.h b/demos/widgetsgallery/navigationbarpage.h index a668251e..b8fe6ed9 100644 --- a/demos/widgetsgallery/navigationbarpage.h +++ b/demos/widgetsgallery/navigationbarpage.h @@ -31,9 +31,9 @@ class NavigationBarPage : public TemplatePage Q_OBJECT public: enum ButtonIndex { - BackButton = 0, - CloseButton, - Hidden + Auto = 0, + ManualBack, + CloseWindow }; enum DisplayModeComboBoxIndex { @@ -50,7 +50,7 @@ public: public slots: void setButtonsState(); - void changeEscapeButtonMode(int index); + void changeEscapeMode(int index); void changeNavigationBarDisplayMode(int index); void changeEscapeButtonDisplayMode(int index); void changeHomeButtonDisplayMode(int index); diff --git a/demos/widgetsgallery/staticpagebenchmark.cpp b/demos/widgetsgallery/staticpagebenchmark.cpp index 589178ee..f59bd1b4 100644 --- a/demos/widgetsgallery/staticpagebenchmark.cpp +++ b/demos/widgetsgallery/staticpagebenchmark.cpp @@ -26,7 +26,6 @@ void StaticPageBenchmark::start() { if (!applicationPage->isActiveWindow()) { connect(applicationPage, SIGNAL(appeared()), this, SLOT(stabilizeFps())); - applicationPage->setEscapeButtonMode(DuiEscapeButtonPanelModel::BackMode); applicationPage->appear(); } else { QTimer::singleShot(0, this, SLOT(stabilizeFps())); diff --git a/demos/widgetsgallery/videocontainerpage.cpp b/demos/widgetsgallery/videocontainerpage.cpp index c79fdcde..4a2b492c 100644 --- a/demos/widgetsgallery/videocontainerpage.cpp +++ b/demos/widgetsgallery/videocontainerpage.cpp @@ -400,10 +400,6 @@ void VideoContainerPage::openVideoDetailPage(const QString& itemid) ItemDetailPage* page = new ItemDetailPage(); page->setVideoId(itemid); page->setParent(this); - - connect(page, SIGNAL(backButtonClicked()), page, SLOT(dismiss())); - - page->setEscapeButtonMode(DuiEscapeButtonPanelModel::BackMode); page->appear(DestroyWhenDismissed); } @@ -412,10 +408,6 @@ void VideoContainerPage::openImageDetailPage(const QString& itemid) ItemDetailPage* page = new ItemDetailPage(); page->setImageId(itemid); page->setParent(this); - - connect(page, SIGNAL(backButtonClicked()), page, SLOT(dismiss())); - - page->setEscapeButtonMode(DuiEscapeButtonPanelModel::BackMode); page->appear(DestroyWhenDismissed); } diff --git a/doc/src/news.dox b/doc/src/news.dox index 68cbe26b..3e526ca7 100644 --- a/doc/src/news.dox +++ b/doc/src/news.dox @@ -10,6 +10,25 @@ - Removed DuiPopupList's property batchSize and signals: itemModelChanged, selectionModelChanged. +- DuiApplicationPage escapeMode() property. Replaces escapeButtonMode() property. + Previously, the following code was necessary to implement a regular parentPage -> childPage navigation: + + <CODE> + childPage->setEscapeButtonMode(DuiEscapeButtonPanelModel::BackMode); + childPage->connect(childPage, SIGNAL(backButtonClicked()), SLOT(dismiss())); + childPage->appear(DestroyWhenDismissed); + </CODE> + + Now only one line is needed: + + <CODE> + childPage->appear(DestroyWhenDismissed); + </CODE> + + Manual handling and wiring is still possible, but it's not the default behavior. + +\subsection removed Removed or Renamed +- escapeButtonMode() property was removed from DuiApplicationPage. Use escapeMode() instead. \section v0190 diff --git a/src/widgets/duiapplicationpage.cpp b/src/widgets/duiapplicationpage.cpp index c72424af..d5bfe80d 100644 --- a/src/widgets/duiapplicationpage.cpp +++ b/src/widgets/duiapplicationpage.cpp @@ -274,23 +274,6 @@ bool DuiApplicationPage::isContentCreated() const return d->contentCreated; } -DuiEscapeButtonPanelModel::EscapeMode DuiApplicationPage::escapeButtonMode() const -{ - Q_D(const DuiApplicationPage); - - return d->escapeButtonMode; -} - -void DuiApplicationPage::setEscapeButtonMode(DuiEscapeButtonPanelModel::EscapeMode mode) -{ - Q_D(DuiApplicationPage); - - if (d->escapeButtonMode != mode) { - d->escapeButtonMode = mode; - emit escapeButtonModeChanged(mode); - } -} - void DuiApplicationPage::setRememberPosition(bool remember) { Q_D(DuiApplicationPage); @@ -450,4 +433,14 @@ bool DuiApplicationPage::autoMarginsForComponentsEnabled() const return model()->autoMarginsForComponentsEnabled(); } +DuiApplicationPageModel::PageEscapeMode DuiApplicationPage::escapeMode() const +{ + return model()->escapeMode(); +} + +void DuiApplicationPage::setEscapeMode(DuiApplicationPageModel::PageEscapeMode mode) +{ + model()->setEscapeMode(mode); +} + #include "moc_duiapplicationpage.cpp" diff --git a/src/widgets/duiapplicationpage.h b/src/widgets/duiapplicationpage.h index 7b926eb3..70feffd9 100644 --- a/src/widgets/duiapplicationpage.h +++ b/src/widgets/duiapplicationpage.h @@ -80,7 +80,7 @@ class DUI_EXPORT DuiApplicationPage : public DuiSceneWindow Q_PROPERTY(bool autoMarginsForComponentsEnabled READ autoMarginsForComponentsEnabled WRITE setAutoMarginsForComponentsEnabled) Q_PROPERTY(QString title READ title WRITE setTitle) Q_PROPERTY(bool contentCreated READ isContentCreated) - Q_PROPERTY(DuiEscapeButtonPanelModel::EscapeMode escapeButtonMode READ escapeButtonMode WRITE setEscapeButtonMode) + Q_PROPERTY(DuiApplicationPageModel::PageEscapeMode escapeMode READ escapeMode WRITE setEscapeMode) Q_PROPERTY(bool pannableAreaInteractive READ isPannableAreaInteractive WRITE setPannableAreaInteractive) Q_PROPERTY(Qt::Orientations pannableAreaDirection READ pannableAreaDirection WRITE setPannableAreaDirection) Q_PROPERTY(bool rememberPosition READ rememberPosition WRITE setRememberPosition) @@ -199,12 +199,6 @@ public: */ const QString title() const; - /*! - * Returns the escape button mode for this application page. - * \sa DuiEscapeButtonPanelModel::EscapeMode - */ - DuiEscapeButtonPanelModel::EscapeMode escapeButtonMode() const; - /** * \brief Returns whether progress indicator is visible * \return <code>true</code> if the progress indicator is visible, otherwise <code>false</code> @@ -212,9 +206,16 @@ public: */ bool isProgressIndicatorVisible() const; + /*! + * \brief Returns the page's escape mode + * + * By default, it's EscapeAuto. + * + * \sa DuiApplicationPageMode::PageEscapeMode, setEscapeMode() + */ + DuiApplicationPageModel::PageEscapeMode escapeMode() const; + Q_SIGNALS: - //! Signal emitted when page changes mode of the escape button - void escapeButtonModeChanged(DuiEscapeButtonPanelModel::EscapeMode mode); //! Signal emitted when the page title changes. void pageTitleChanged(DuiApplicationPage *, const QString &title); //! Signal emitted when back button called @@ -344,18 +345,17 @@ public Q_SLOTS: void setPannableAreaDirection(Qt::Orientations directions); /*! - * Sets the escape button mode for the page, which can serve either - * as a back or close button, or can be hidden. - * \sa DuiEscapeButtonPanelModel::EscapeMode - */ - void setEscapeButtonMode(DuiEscapeButtonPanelModel::EscapeMode mode); - - /*! * Sets the visible of progress indicator * \param bool visible */ void setProgressIndicatorVisible(bool visible); + /*! + * \brief Sets the page escape mode + * \sa DuiApplicationPageModel::PageEscapeMode, escapeMode() + */ + void setEscapeMode(DuiApplicationPageModel::PageEscapeMode mode); + protected: //! \reimp virtual void actionEvent(QActionEvent *); diff --git a/src/widgets/duiapplicationpagemodel.h b/src/widgets/duiapplicationpagemodel.h index a6eeb461..4a64862e 100644 --- a/src/widgets/duiapplicationpagemodel.h +++ b/src/widgets/duiapplicationpagemodel.h @@ -52,6 +52,31 @@ public: Component is hidden */ + /*! + This enum specifies the page's escape mode. + \sa DuiSceneManager::pageHistoryStack() + */ + enum PageEscapeMode { + EscapeAuto, /*!< Default value. Escape button will automatically be set + to either back or close according to the page navigation + history. + + If the page history is not empty, the escape button + will be set to back mode and its clicked signal connected + to the page's dismiss() slot. + + If the page happens to be the root (page history is empty), + escape button will be set to close mode. */ + + EscapeManualBack, /*!< Escape button will be set so back mode. All that + happens when it gets clicked is the emission of the + backButtonClicked() signal. It's up to the application + developer to connect that signal to some useful slot. */ + + EscapeCloseWindow /*!< Escape button will be set to close mode. Clicking + it will cause the application window to be closed. */ + }; + private: DUI_MODEL_PROPERTY(DuiApplicationPageModel::ComponentDisplayMode, homeButtonDisplayMode, HomeButtonDisplayMode, true, DuiApplicationPageModel::Show) @@ -60,6 +85,13 @@ private: DUI_MODEL_PROPERTY(DuiApplicationPageModel::ComponentDisplayMode, navigationBarDisplayMode, NavigationBarDisplayMode, true, DuiApplicationPageModel::Show) /*! + * \property DuiApplicationPageModel::escapeMode + * \brief Page's escape mode. + * \sa DuiApplicationPageMode::EscapeMode + */ + DUI_MODEL_PROPERTY(DuiApplicationPageModel::PageEscapeMode, escapeMode, EscapeMode, true, DuiApplicationPageModel::EscapeAuto) + + /*! \property DuiApplicationPageModel::progressIndicatorVisible \brief Whether the progress indicator is visible. */ diff --git a/src/widgets/duiapplicationwindow.cpp b/src/widgets/duiapplicationwindow.cpp index f4973a1c..3de22902 100644 --- a/src/widgets/duiapplicationwindow.cpp +++ b/src/widgets/duiapplicationwindow.cpp @@ -111,9 +111,6 @@ void DuiApplicationWindowPrivate::init() q->connect(homeButtonPanel, SIGNAL(buttonClicked()), q, SLOT(showMinimized())); #endif - q->connect(escapeButtonPanel, SIGNAL(escapeModeChanged(DuiEscapeButtonPanelModel::EscapeMode)), - q, SLOT(_q_connectEscapeButton(DuiEscapeButtonPanelModel::EscapeMode))); - q->connect(navigationBar, SIGNAL(viewmenuTriggered()), q, SLOT(openMenu())); @@ -130,7 +127,10 @@ void DuiApplicationWindowPrivate::init() navigationBar->appearNow(q); homeButtonPanel->appearNow(q); escapeButtonPanel->appearNow(q); - _q_connectEscapeButton(escapeButtonPanel->escapeMode()); + + // Initialize escape button to close mode. + escapeButtonPanel->setEscapeMode(DuiEscapeButtonPanelModel::CloseMode); + QObject::connect(escapeButtonPanel, SIGNAL(buttonClicked()), q, SLOT(close())); if (q->orientation() == Dui::Portrait) { dockWidget->appearNow(q); @@ -180,29 +180,6 @@ void DuiApplicationWindowPrivate::windowStateChangeEvent(QWindowStateChangeEvent } } -void DuiApplicationWindowPrivate::_q_connectEscapeButton(DuiEscapeButtonPanelModel::EscapeMode mode) -{ - Q_Q(DuiApplicationWindow); - - QObject::disconnect(escapeButtonPanel, SIGNAL(buttonClicked()), 0, 0); - - switch (mode) { - case DuiEscapeButtonPanelModel::BackMode: - if (page) - QObject::connect(escapeButtonPanel, SIGNAL(buttonClicked()), page, SIGNAL(backButtonClicked())); - - QObject::connect(escapeButtonPanel, SIGNAL(buttonClicked()), menu, SLOT(disappear())); - break; - case DuiEscapeButtonPanelModel::CloseMode: - if (page) - QObject::connect(escapeButtonPanel, SIGNAL(buttonClicked()), page, SIGNAL(closeButtonClicked())); - - QObject::connect(escapeButtonPanel, SIGNAL(buttonClicked()), q, SLOT(close())); - break; - default:; - } -} - void DuiApplicationWindowPrivate::_q_pageTitleChanged(DuiApplicationPage *page, const QString &title) { if (page->isVisible()) @@ -261,6 +238,9 @@ void DuiApplicationWindowPrivate::_q_handlePageModelModifications(const QList<co } else if (member == DuiApplicationPageModel::AutoMarginsForComponentsEnabled) { updatePageAutoMarginsForComponents(q->orientation()); + + } else if (member == DuiApplicationPageModel::EscapeMode) { + setupPageEscape(); } } } @@ -544,9 +524,8 @@ void DuiApplicationWindowPrivate::applicationPageAppearEvent(DuiSceneWindowEvent Q_ASSERT(pageFromEvent != page); if (page != 0) { - // We are going to change pages. - - q->closeMenu(); + menu->disappear(); + disconnectPage(page); } connectPage(pageFromEvent); @@ -556,16 +535,106 @@ void DuiApplicationWindowPrivate::applicationPageAppearEvent(DuiSceneWindowEvent void DuiApplicationWindowPrivate::applicationPageDisappearEvent(DuiSceneWindowEvent *event) { - Q_Q(DuiApplicationWindow); - DuiApplicationPage *pageFromEvent = static_cast<DuiApplicationPage *>(event->sceneWindow()); - q->closeMenu(); - // Page is going away. Let's disconnect it if it's the current page. - if (pageFromEvent == page) + if (pageFromEvent == page) { + menu->disappear(); disconnectPage(pageFromEvent); + } +} + +void DuiApplicationWindowPrivate::setupPageEscape() +{ + if (!page) { + // Nothing to be done. + return; + } + + // Tear down any previous page escape setup. + tearDownPageEscape(); + + switch (page->escapeMode()) { + case DuiApplicationPageModel::EscapeAuto: + setupPageEscapeAuto(); + break; + + case DuiApplicationPageModel::EscapeManualBack: + setupPageEscapeBack(); + break; + + case DuiApplicationPageModel::EscapeCloseWindow: + setupPageEscapeClose(); + break; + + default: + qFatal("DuiApplicationWindow: Invalid page escape mode"); + }; +} + +void DuiApplicationWindowPrivate::setupPageEscapeAuto() +{ + Q_Q(DuiApplicationWindow); + QList<DuiSceneWindow*> pageHistory = q->sceneManager()->pageHistory(); + + if (pageHistory.isEmpty()) { + setupPageEscapeClose(); + } else { + setupPageEscapeBack(); + page->connect(escapeButtonPanel, SIGNAL(buttonClicked()), SLOT(dismiss())); + } + + // We must update the wiring of our escape button if the application manually + // changes the page history while a page in EscapeAuto mode is being displayed. + q->connect(q->sceneManager(), SIGNAL(pageHistoryChanged()), SLOT(_q_updatePageEscapeAuto())); +} + +void DuiApplicationWindowPrivate::setupPageEscapeBack() +{ + escapeButtonPanel->setEscapeMode(DuiEscapeButtonPanelModel::BackMode); + page->connect(escapeButtonPanel, SIGNAL(buttonClicked()), SIGNAL(backButtonClicked())); +} + +void DuiApplicationWindowPrivate::setupPageEscapeClose() +{ + Q_Q(DuiApplicationWindow); + + escapeButtonPanel->setEscapeMode(DuiEscapeButtonPanelModel::CloseMode); + page->connect(escapeButtonPanel, SIGNAL(buttonClicked()), SIGNAL(closeButtonClicked())); + QObject::connect(escapeButtonPanel, SIGNAL(buttonClicked()), q, SLOT(close())); +} + +void DuiApplicationWindowPrivate::tearDownPageEscape() +{ + Q_Q(DuiApplicationWindow); + + QObject::disconnect(escapeButtonPanel, SIGNAL(buttonClicked()), 0, 0); + + QObject::disconnect(q->sceneManager(), SIGNAL(pageHistoryChanged()), + q, SLOT(_q_updatePageEscapeAuto())); +} + +void DuiApplicationWindowPrivate::_q_updatePageEscapeAuto() +{ + Q_Q(DuiApplicationWindow); + QList<DuiSceneWindow*> pageHistory = q->sceneManager()->pageHistory(); + Q_ASSERT(page != 0); + Q_ASSERT(page->escapeMode() == DuiApplicationPageModel::EscapeAuto); + + if (pageHistory.isEmpty() && + (escapeButtonPanel->escapeMode() != DuiEscapeButtonPanelModel::CloseMode)) { + + QObject::disconnect(escapeButtonPanel, SIGNAL(buttonClicked()), 0, 0); + setupPageEscapeClose(); + + } else if (!pageHistory.isEmpty() && + (escapeButtonPanel->escapeMode() != DuiEscapeButtonPanelModel::BackMode)) { + + QObject::disconnect(escapeButtonPanel, SIGNAL(buttonClicked()), 0, 0); + setupPageEscapeBack(); + page->connect(escapeButtonPanel, SIGNAL(buttonClicked()), SLOT(dismiss())); + } } // TODO: Remove that now useless method override after API freeze period @@ -726,22 +795,10 @@ void DuiApplicationWindowPrivate::connectPage(DuiApplicationPage *newPage) manageActions(); - QObject::connect(page, SIGNAL(escapeButtonModeChanged(DuiEscapeButtonPanelModel::EscapeMode)), - escapeButtonPanel, SLOT(setEscapeMode(DuiEscapeButtonPanelModel::EscapeMode))); - q->connect(page->model(), SIGNAL(modified(QList<const char *>)), SLOT(_q_handlePageModelModifications(QList<const char *>))); - DuiEscapeButtonPanelModel::EscapeMode pageEscapeMode = page->escapeButtonMode(); - if (pageEscapeMode != escapeButtonPanel->escapeMode()) { - // Change the mode of the escape button, which will trigger a reconnection - // between escape button and application window + page. - escapeButtonPanel->setEscapeMode(pageEscapeMode); - } else { - // Escape button is already in the correct mode. - // Force a reconnection between escape button and application window + page - _q_connectEscapeButton(page->escapeButtonMode()); - } + setupPageEscape(); navigationBar->setViewMenuDescription(page->title()); @@ -770,14 +827,10 @@ void DuiApplicationWindowPrivate::disconnectPage(DuiApplicationPage *pageToDisco QObject::disconnect(page, SIGNAL(actionUpdated(QActionEvent *)), q, SLOT(_q_actionUpdated(QActionEvent *))); - QObject::disconnect(page, SIGNAL(escapeButtonModeChanged(DuiEscapeButtonPanelModel::EscapeMode)), - escapeButtonPanel, SLOT(setEscapeMode(DuiEscapeButtonPanelModel::EscapeMode))); - QObject::disconnect(page->model(), SIGNAL(modified(QList<const char *>)), q, SLOT(_q_handlePageModelModifications(QList<const char *>))); - QObject::disconnect(escapeButtonPanel, SIGNAL(buttonClicked()), page, SIGNAL(backButtonClicked())); - QObject::disconnect(escapeButtonPanel, SIGNAL(buttonClicked()), page, SIGNAL(closeButtonClicked())); + tearDownPageEscape(); removePageActions(); diff --git a/src/widgets/duiapplicationwindow.h b/src/widgets/duiapplicationwindow.h index 8a3cc761..ad2ff896 100644 --- a/src/widgets/duiapplicationwindow.h +++ b/src/widgets/duiapplicationwindow.h @@ -158,7 +158,6 @@ private: Q_DISABLE_COPY(DuiApplicationWindow) Q_DECLARE_PRIVATE(DuiApplicationWindow) - Q_PRIVATE_SLOT(d_func(), void _q_connectEscapeButton(DuiEscapeButtonPanelModel::EscapeMode)) Q_PRIVATE_SLOT(d_func(), void _q_pageTitleChanged(DuiApplicationPage *, const QString &)) Q_PRIVATE_SLOT(d_func(), void _q_actionUpdated(QActionEvent *)) Q_PRIVATE_SLOT(d_func(), void _q_placeToolBar(Dui::Orientation)) @@ -168,6 +167,7 @@ private: #ifdef HAVE_N900 Q_PRIVATE_SLOT(d_func(), void _q_exitAppView()) #endif + Q_PRIVATE_SLOT(d_func(), void _q_updatePageEscapeAuto()) }; #endif diff --git a/src/widgets/duiapplicationwindow_p.h b/src/widgets/duiapplicationwindow_p.h index 2a99b4ef..23bd5a93 100644 --- a/src/widgets/duiapplicationwindow_p.h +++ b/src/widgets/duiapplicationwindow_p.h @@ -104,13 +104,19 @@ public: void addDuiStatusBarOverlayProperty(); #endif + void setupPageEscape(); + void setupPageEscapeAuto(); + void setupPageEscapeBack(); + void setupPageEscapeClose(); + void tearDownPageEscape(); + void _q_updatePageEscapeAuto(); + private: void init(); void initAutoHideComponentsTimer(); void removePageActions(); QAction* findPageCheckedAction() const; public: - void _q_connectEscapeButton(DuiEscapeButtonPanelModel::EscapeMode); void _q_pageTitleChanged(DuiApplicationPage *, const QString &); void _q_actionUpdated(QActionEvent *e); void _q_placeToolBar(Dui::Orientation); diff --git a/tests/ut_duiapplicationpage/ut_duiapplicationpage.cpp b/tests/ut_duiapplicationpage/ut_duiapplicationpage.cpp index 5ba53704..3fd6fa59 100644 --- a/tests/ut_duiapplicationpage/ut_duiapplicationpage.cpp +++ b/tests/ut_duiapplicationpage/ut_duiapplicationpage.cpp @@ -69,7 +69,7 @@ void Ut_DuiApplicationPage::testInitialValues() QVERIFY(m_subject->centralWidget()); QCOMPARE(m_subject->isPannableAreaInteractive(), true); - QCOMPARE(m_subject->escapeButtonMode(), DuiEscapeButtonPanelModel::CloseMode); + QCOMPARE(m_subject->escapeMode(), DuiApplicationPageModel::EscapeAuto); QCOMPARE(m_subject->rememberPosition(), true); } @@ -79,7 +79,7 @@ void Ut_DuiApplicationPage::testProperties() bool pannableAreaInteractive = true; Qt::Orientations pannableAreaDirection = Qt::Horizontal | Qt::Vertical; bool autoMarginsForComponents = true; - DuiEscapeButtonPanelModel::EscapeMode escapeMode = DuiEscapeButtonPanelModel::BackMode; + DuiApplicationPageModel::PageEscapeMode escapeMode = DuiApplicationPageModel::EscapeManualBack; bool rememberPosition = false; m_subject->setTitle(title); @@ -90,8 +90,8 @@ void Ut_DuiApplicationPage::testProperties() QCOMPARE(m_subject->pannableAreaDirection(), pannableAreaDirection); m_subject->setAutoMarginsForComponentsEnabled(autoMarginsForComponents); QCOMPARE(m_subject->autoMarginsForComponentsEnabled(), autoMarginsForComponents); - m_subject->setEscapeButtonMode(escapeMode); - QCOMPARE(m_subject->escapeButtonMode(), escapeMode); + m_subject->setEscapeMode(escapeMode); + QCOMPARE(m_subject->escapeMode(), escapeMode); m_subject->setRememberPosition(rememberPosition); QCOMPARE(m_subject->rememberPosition(), rememberPosition); } @@ -145,25 +145,6 @@ void Ut_DuiApplicationPage::testPageTitleChanged() QCOMPARE(spy.at(1).at(1).toString(), QString()); } -void Ut_DuiApplicationPage::testEscapeButtonModeChanged() -{ - QSignalSpy spy(m_subject, SIGNAL(escapeButtonModeChanged(DuiEscapeButtonPanelModel::EscapeMode))); - DuiEscapeButtonPanelModel::EscapeMode backMode = DuiEscapeButtonPanelModel::BackMode; - DuiEscapeButtonPanelModel::EscapeMode closeMode = DuiEscapeButtonPanelModel::CloseMode; - - m_subject->setEscapeButtonMode(m_subject->escapeButtonMode()); - QCOMPARE(spy.count(), 0); - m_subject->setEscapeButtonMode(backMode); - QCOMPARE(spy.count(), 1); - m_subject->setEscapeButtonMode(backMode); - QCOMPARE(spy.count(), 1); - m_subject->setEscapeButtonMode(closeMode); - QCOMPARE(spy.count(), 2); - - QCOMPARE(spy.at(0).at(0).value<DuiEscapeButtonPanelModel::EscapeMode>(), backMode); - QCOMPARE(spy.at(1).at(0).value<DuiEscapeButtonPanelModel::EscapeMode>(), closeMode); -} - void Ut_DuiApplicationPage::testRememberPosition() { m_subject->setRememberPosition(true); diff --git a/tests/ut_duiapplicationpage/ut_duiapplicationpage.h b/tests/ut_duiapplicationpage/ut_duiapplicationpage.h index 82f85a3f..f17956b8 100644 --- a/tests/ut_duiapplicationpage/ut_duiapplicationpage.h +++ b/tests/ut_duiapplicationpage/ut_duiapplicationpage.h @@ -47,7 +47,6 @@ private slots: void testCentralWidget(); void testCreateContent(); void testPageTitleChanged(); - void testEscapeButtonModeChanged(); void testRememberPosition(); void testForgetPosition(); void testActionUpdated(); diff --git a/tests/ut_duiapplicationwindow/ut_duiapplicationwindow.cpp b/tests/ut_duiapplicationwindow/ut_duiapplicationwindow.cpp index 18de163a..f62e53f5 100644 --- a/tests/ut_duiapplicationwindow/ut_duiapplicationwindow.cpp +++ b/tests/ut_duiapplicationwindow/ut_duiapplicationwindow.cpp @@ -26,6 +26,8 @@ #include <duiapplicationpage.h> #include <DuiComponentData> #include <DuiScene> +#include <DuiSceneManager> +#include <DuiEscapeButtonPanel> #include <QSignalSpy> #include <QEvent> @@ -288,4 +290,85 @@ void Ut_DuiApplicationWindow::testDisplayExitedOnCloseLazyShutdownApp() QCOMPARE(spy.count(), 1); } +void Ut_DuiApplicationWindow::testPageEscapeAuto() +{ + DuiApplicationPage *firstPage = new DuiApplicationPage; + DuiApplicationPage *secondPage = new DuiApplicationPage; + DuiEscapeButtonPanel *escapeButtonPanel = fetchEscapeButtonPanel(m_subject->scene()->items()); + + QVERIFY(escapeButtonPanel != 0); + + firstPage->appearNow(m_subject); + + QCOMPARE(escapeButtonPanel->escapeMode(), DuiEscapeButtonPanelModel::CloseMode); + + secondPage->appearNow(m_subject); + + QCOMPARE(escapeButtonPanel->escapeMode(), DuiEscapeButtonPanelModel::BackMode); + + secondPage->dismissNow(); + + QCOMPARE(escapeButtonPanel->escapeMode(), DuiEscapeButtonPanelModel::CloseMode); +} + +void Ut_DuiApplicationWindow::testPageEscapeAutoWhenAddingPageHistory() +{ + DuiApplicationPage *firstPage = new DuiApplicationPage; + DuiApplicationPage *secondPage = new DuiApplicationPage; + DuiEscapeButtonPanel *escapeButtonPanel = fetchEscapeButtonPanel(m_subject->scene()->items()); + QList<DuiSceneWindow *> pageHistory; + + QVERIFY(escapeButtonPanel != 0); + + secondPage->appearNow(m_subject); + + QCOMPARE(escapeButtonPanel->escapeMode(), DuiEscapeButtonPanelModel::CloseMode); + + pageHistory.append(firstPage); + m_subject->sceneManager()->setPageHistory(pageHistory); + + QCOMPARE(escapeButtonPanel->escapeMode(), DuiEscapeButtonPanelModel::BackMode); +} + +void Ut_DuiApplicationWindow::testPageEscapeAutoWhenClearingPageHistory() +{ + DuiApplicationPage *firstPage = new DuiApplicationPage; + DuiApplicationPage *secondPage = new DuiApplicationPage; + DuiEscapeButtonPanel *escapeButtonPanel = fetchEscapeButtonPanel(m_subject->scene()->items()); + QList<DuiSceneWindow *> pageHistory; + + QVERIFY(escapeButtonPanel != 0); + + firstPage->appearNow(m_subject); + secondPage->appearNow(m_subject); + + QCOMPARE(escapeButtonPanel->escapeMode(), DuiEscapeButtonPanelModel::BackMode); + + m_subject->sceneManager()->setPageHistory(pageHistory); + + QCOMPARE(escapeButtonPanel->escapeMode(), DuiEscapeButtonPanelModel::CloseMode); +} + +DuiEscapeButtonPanel *Ut_DuiApplicationWindow::fetchEscapeButtonPanel( + const QList<QGraphicsItem *> &itemsList) const +{ + int i = 0; + int itemsCount = itemsList.count(); + QGraphicsItem *item; + QGraphicsWidget *widget; + DuiEscapeButtonPanel *escapeButtonPanel = 0; + + while (escapeButtonPanel == 0 && i < itemsCount) { + item = itemsList.at(i); + if (item->isWidget()) { + widget = static_cast<QGraphicsWidget *>(item); + escapeButtonPanel = qobject_cast<DuiEscapeButtonPanel*>(widget); + } + + ++i; + } + + return escapeButtonPanel; +} + QTEST_MAIN(Ut_DuiApplicationWindow) diff --git a/tests/ut_duiapplicationwindow/ut_duiapplicationwindow.h b/tests/ut_duiapplicationwindow/ut_duiapplicationwindow.h index c1a46da3..a4edb4b4 100644 --- a/tests/ut_duiapplicationwindow/ut_duiapplicationwindow.h +++ b/tests/ut_duiapplicationwindow/ut_duiapplicationwindow.h @@ -21,11 +21,15 @@ #define UT_DUIAPPLICATIONWINDOW #include <QObject> +#include <QList> #include <QtTest> #include <DuiNamespace> +class QGraphicsItem; + class DuiApplicationWindow; class DuiApplicationPage; +class DuiEscapeButtonPanel; class Ut_DuiApplicationWindow : public QObject { @@ -56,7 +60,12 @@ private slots: void testDisplayExitedOnClose(); void testDisplayExitedOnCloseLazyShutdownApp(); + void testPageEscapeAuto(); + void testPageEscapeAutoWhenAddingPageHistory(); + void testPageEscapeAutoWhenClearingPageHistory(); + private: + DuiEscapeButtonPanel *fetchEscapeButtonPanel(const QList<QGraphicsItem *> &itemsList) const; DuiApplicationWindow *m_subject; }; |