--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/camerauis/cameraxui/cxui/src/cxuifullscreenpopup.cpp Thu Jul 15 01:55:05 2010 +0300
@@ -0,0 +1,256 @@
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#include <QGraphicsScene>
+#include <QGraphicsRectItem>
+#include <QGraphicsAnchorLayout>
+#include <HbLabel>
+#include <HbPushButton>
+#include <HbInstantFeedback>
+#include "cxutils.h"
+#include "cxuienums.h"
+#include "cxuiview.h"
+#include "cxuidocumentloader.h"
+#include "cxuifullscreenpopup.h"
+
+/*!
+* Constructor.
+*/
+CxuiFullScreenPopup::CxuiFullScreenPopupLoader::CxuiFullScreenPopupLoader()
+ : HbDocumentLoader()
+{
+}
+
+/*!
+* Create object from DocML.
+* Custom type of object created when object name matches the full screen dialog one.
+* Other items are propagated to HbDocumentLoader for standard handling.
+* @param type Object type (class name)
+* @param name Object name, name of the item in DocML.
+*/
+QObject *CxuiFullScreenPopup::CxuiFullScreenPopupLoader::createObject(const QString& type, const QString &name)
+{
+ CX_DEBUG_ENTER_FUNCTION();
+ QObject *object = NULL;
+
+ // HbWidget as type in DocML to support UI layout tool.
+ if (type == "HbWidget") {
+ if (name == CxUiLayout::FULL_SCREEN_POPUP) {
+ object = new CxuiFullScreenPopup();
+ }
+ }
+
+ if (object) {
+ object->setObjectName(name);
+ } else {
+ object = HbDocumentLoader::createObject(type, name);
+ }
+
+ CX_DEBUG_EXIT_FUNCTION();
+ return object;
+}
+
+/*!
+* Load a full screen popup from DocML and set given message and action text to it.
+* @param scene Graphics scene where to insert the popup.
+* @param message Popup message text.
+* @param action Popup action button text.
+*/
+CxuiFullScreenPopup *CxuiFullScreenPopup::create(QGraphicsScene *scene,
+ const QString &message,
+ const QString &action)
+{
+ CX_DEBUG_ENTER_FUNCTION();
+
+ bool ok(true);
+
+ // Load popup structure from DocML.
+ CxuiFullScreenPopupLoader *loader = new CxuiFullScreenPopupLoader();
+ loader->load(CxUiLayout::FULL_SCREEN_POPUP_XML, &ok);
+ CX_ASSERT_ALWAYS(ok);
+
+ // Popup container widget.
+ CxuiFullScreenPopup *popup = qobject_cast<CxuiFullScreenPopup *>(loader->findWidget(CxUiLayout::FULL_SCREEN_POPUP));
+ CX_ASSERT_ALWAYS(popup);
+ // Popup needs scene to move in front of all widgets.
+ popup->setScene(scene);
+ // Add background graphic for popup.
+ QGraphicsRectItem *bg = new QGraphicsRectItem(popup);
+ bg->setRect(popup->geometry());
+ bg->setBrush(Qt::black);
+ popup->setBackgroundItem(bg);
+
+ // Popup text.
+ //!@todo: Move text color definition to DocML once supported there.
+ HbLabel *text = qobject_cast<HbLabel*>(loader->findWidget(CxUiLayout::FULL_SCREEN_POPUP_TEXT));
+ CX_ASSERT_ALWAYS(text);
+ text->setPlainText(message);
+ text->setTextColor(Qt::white);
+
+ // Action button.
+ // Hidden if empty text given.
+ HbPushButton *button = qobject_cast<HbPushButton*>(loader->findWidget(CxUiLayout::FULL_SCREEN_POPUP_BUTTON));
+ CX_ASSERT_ALWAYS(button);
+ if (action.isEmpty()) {
+ CX_DEBUG(("CxuiFullScreenPopup - no button text given, hiding button.."));
+ button->setVisible(false);
+ } else {
+ button->setText(action);
+ }
+
+ delete loader;
+ loader = NULL;
+
+ CX_DEBUG_EXIT_FUNCTION();
+ return popup;
+}
+
+/*!
+* Popup destructor.
+*/
+CxuiFullScreenPopup::~CxuiFullScreenPopup()
+{
+ CX_DEBUG_ENTER_FUNCTION();
+ hide();
+ CX_DEBUG_EXIT_FUNCTION();
+}
+
+/*!
+* Handle mouse press event.
+*/
+void CxuiFullScreenPopup::handleMousePress()
+{
+ CX_DEBUG_ENTER_FUNCTION();
+ // Give standard feedback.
+ HbInstantFeedback feedback(HbFeedback::BasicItem);
+ feedback.setModalities(HbFeedback::All);
+ feedback.play();
+ CX_DEBUG_EXIT_FUNCTION();
+}
+
+/*!
+* Handle mouse release event.
+*/
+void CxuiFullScreenPopup::handleMouseRelease()
+{
+ CX_DEBUG_ENTER_FUNCTION();
+ //!@todo: sound disabling doesn't work in orbit yet so don't do feedback on release
+ // needs to be enabled when orbit support is done
+ // Give tactile feedback but no sound feedback on mouse release.
+ /*
+ HbInstantFeedback feedback(HbFeedback::BasicItem);
+ feedback.setModalities(HbFeedback::Tactile);
+ feedback.play();
+ CX_DEBUG_EXIT_FUNCTION();
+ */
+}
+
+/*!
+* Show the popup.
+* Checks current top most item in the scene and adds this popup in front of it.
+* Input to below widgets is blocked.
+*/
+void CxuiFullScreenPopup::show()
+{
+ CX_DEBUG_ENTER_FUNCTION();
+
+ CX_ASSERT_ALWAYS(mScene);
+
+ if (!mPopupShown) {
+ mPopupShown = true;
+ // Store current top item z value.
+ qreal topZ(topZValue());
+ // Add popup widget to scene to actually get it visible.
+ mScene->addItem(this);
+ // Make sure popup is just above the top item.
+ setZValue(topZ + 1);
+
+ // Block input to other widgets below the popup.
+ setWindowFlags(Qt::Dialog);
+ setPanelModality(QGraphicsItem::PanelModal);
+
+ // Show popup.
+ HbWidget::show();
+ }
+ CX_DEBUG_EXIT_FUNCTION();
+}
+
+/*!
+* Hide the popup.
+*/
+void CxuiFullScreenPopup::hide()
+{
+ CX_DEBUG_ENTER_FUNCTION();
+
+ if (mPopupShown) {
+ HbWidget::hide();
+ // Double check non-nullness.
+ if (mScene) {
+ mScene->removeItem(this);
+ }
+ mPopupShown = false;
+ }
+ CX_DEBUG_EXIT_FUNCTION();
+}
+
+/*!
+* Get the z value of top item in scene.
+* @return Top (max) z value.
+*/
+qreal CxuiFullScreenPopup::topZValue() const
+{
+ CX_DEBUG_ENTER_FUNCTION();
+
+ qreal z(0);
+ if (mScene) {
+ const QList<QGraphicsItem *> itemList(mScene->items(Qt::DescendingOrder));
+ foreach (QGraphicsItem *item, itemList) {
+ // Max of z values.
+ z = (item && item->zValue() > z) ? item->zValue() : z;
+#ifdef CX_DEBUG
+ const QGraphicsObject *gObject(item->toGraphicsObject());
+ CX_DEBUG(("Item of class [%s] z value [%s]",
+ gObject ? gObject->metaObject()->className() : qPrintable(QString("QGraphicsItem")),
+ qPrintable(QString::number(item->zValue()))));
+#endif // CX_DEBUG
+ }
+ } else {
+ CX_DEBUG(("[WARNING] No scene found, returning zero"));
+ }
+ CX_DEBUG_EXIT_FUNCTION();
+ return z;
+}
+
+/*!
+* Store the scene in which this popup is to be shown.
+*/
+void CxuiFullScreenPopup::setScene(QGraphicsScene *scene)
+{
+ mScene = scene;
+}
+
+/*!
+* Popup (private) constructor.
+*/
+CxuiFullScreenPopup::CxuiFullScreenPopup()
+ : mScene(NULL),
+ mPopupShown(false)
+{
+ CX_DEBUG_IN_FUNCTION();
+}
+
+// end of file