aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel d'Andrada <daniel.dandrada@nokia.com>2010-01-22 14:57:12 +0200
committerDaniel d'Andrada <daniel.dandrada@nokia.com>2010-03-23 14:50:00 +0200
commit164147b9d96a107d8047019b15901104dcfe53b1 (patch)
treea38c9fac345708c2886f5ef6f0a03f9163199e07
parentea57dee9c4d81216d7830b2801c50e18df7b3221 (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.cpp3
-rw-r--r--demos/widgetsgallery/navigationbarpage.cpp55
-rw-r--r--demos/widgetsgallery/navigationbarpage.h8
-rw-r--r--demos/widgetsgallery/staticpagebenchmark.cpp1
-rw-r--r--demos/widgetsgallery/videocontainerpage.cpp8
-rw-r--r--doc/src/news.dox19
-rw-r--r--src/widgets/duiapplicationpage.cpp27
-rw-r--r--src/widgets/duiapplicationpage.h32
-rw-r--r--src/widgets/duiapplicationpagemodel.h32
-rw-r--r--src/widgets/duiapplicationwindow.cpp159
-rw-r--r--src/widgets/duiapplicationwindow.h2
-rw-r--r--src/widgets/duiapplicationwindow_p.h8
-rw-r--r--tests/ut_duiapplicationpage/ut_duiapplicationpage.cpp27
-rw-r--r--tests/ut_duiapplicationpage/ut_duiapplicationpage.h1
-rw-r--r--tests/ut_duiapplicationwindow/ut_duiapplicationwindow.cpp83
-rw-r--r--tests/ut_duiapplicationwindow/ut_duiapplicationwindow.h9
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;
};