src/hbcore/gui/hbscreen.cpp
changeset 0 16d8024aca5e
child 2 06ff229162e9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/hbcore/gui/hbscreen.cpp	Mon Apr 19 14:02:13 2010 +0300
@@ -0,0 +1,282 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (developer.feedback@nokia.com)
+**
+** This file is part of the HbCore module of the UI Extensions for Mobile.
+**
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this file.
+** Please review the following information to ensure the GNU Lesser General
+** Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at developer.feedback@nokia.com.
+**
+****************************************************************************/
+
+#include "hbscreen_p.h"
+#include "hbstyle.h"
+#include "hbtoolbar.h"
+#include "hbtoolbar_p.h"
+#include "hbdockwidget.h"
+#include "hbdockwidget_p.h"
+#include "hbview.h"
+#include "hbcontentwidget_p.h"
+#include "hbmainwindow.h"
+#include "hbevent.h"
+#include "hbmainwindow_p.h"
+#include <QGraphicsLayout>
+
+/*!
+  \class HbScreen
+
+  \brief HbScreen represents the item that is the parent of all
+  graphics items excluding the background.
+
+  \internal
+*/
+
+HbScreen::HbScreen() : 
+    HbWidget(), 
+    mStack(0),
+    mTb(0),
+    mDock(0),
+    mToolBarOrientation(0),
+    mDelayedConstructionHandled(false),
+    mScreenPolished(false)
+{
+}
+
+void HbScreen::setStackWidget(HbContentWidget *stack) 
+{
+    if (mStack != stack) {
+        if (mStack) {
+            HbStyle::setItemName(mTb, QString());
+            HbStyle::setItemName(mDock, QString());
+        }
+        mStack = stack; 
+    }
+}
+
+void HbScreen::setToolBar(HbToolBar *tb)
+{
+    if (mTb != tb) {
+        if (mTb) {
+            disconnect(&HbToolBarPrivate::d_ptr(mTb)->core, 0, this, 0);
+            HbStyle::setItemName(mTb, QString());
+        }
+        mTb = tb; 
+        if (mTb) {
+            setToolBarOrientation(mTb->orientation()); 
+            if (mDelayedConstructionHandled){
+                connect(&HbToolBarPrivate::d_ptr(mTb)->core, SIGNAL(orientationChanged()), this, SLOT(toolBarOrientationChanged()));
+                connect(&HbToolBarPrivate::d_ptr(mTb)->core, SIGNAL(visibilityChanged()), this, SLOT(decoratorVisibilityChanged()));
+            }
+        } else {
+            mToolBarOrientation = 0;
+        }
+    }
+}
+
+void HbScreen::setDockWidget(HbDockWidget *dock)
+{
+    if (mDock != dock) {
+        if (mDock) {
+            disconnect(&HbDockWidgetPrivate::d_ptr(mDock)->core, 0, this, 0);
+            HbStyle::setItemName(mDock, QString());
+        }
+        mDock = dock; 
+        if (mDock && mDelayedConstructionHandled) {
+            connect(&HbDockWidgetPrivate::d_ptr(mDock)->core, SIGNAL(visibilityChanged()), this, SLOT(decoratorVisibilityChanged()));
+        }
+    }
+}
+
+void setName(QGraphicsWidget *item, const QString &name)
+{
+    if (item && (item->isVisible())) {
+        HbStyle::setItemName(item, name);
+    } else {
+        HbStyle::setItemName(item, QString());
+    }
+}
+
+void HbScreen::setToolBarName(bool forced)
+{
+    //we handle toolbar as a special case to
+    //avoid unnecessary complications in setName function.
+    if ((mTb->isVisible() || forced) && mTb->actions().count()) {
+        HbStyle::setItemName(mTb, "toolbar");
+    }
+    else {
+        HbStyle::setItemName(mTb, QString());
+    }
+}
+
+void HbScreen::polish(HbStyleParameters& params)
+{
+    if (!mScreenPolished) {
+        mScreenOrientation = mainWindow()->orientation();
+        connect(mainWindow(), SIGNAL(orientationChanged(Qt::Orientation)), this, SLOT(screenOrientationChanged(Qt::Orientation)));
+    }
+
+    if (mStack) {
+        HbView *currentView = qobject_cast<HbView*>(mStack->currentWidget());
+        if (currentView && currentView->isContentFullScreen()) {
+            setName(mStack, "mainfull");
+        } else { 
+            setName(mStack, "main");
+        }
+    }
+
+    if (mTb) {
+        bool hiddenForEffects = HbToolBarPrivate::d_ptr(mTb)->mOrientationEffectsRunning;
+        setToolBarName(hiddenForEffects);
+    }
+
+    if (mDock) {
+        setName(mDock,"dock");
+    }
+
+    mScreenPolished = true;
+    HbWidget::polish(params);
+
+    if (mTb && mDelayedConstructionHandled) {
+        HbToolBarPrivate::d_ptr(mTb)->mDoLayout = true;
+    }
+    if (layout()) {
+        layout()->activate();
+    }
+    HbMainWindow *w = mainWindow();
+    HbMainWindowPrivate::d_ptr(w)->postIdleEvent(HbMainWindowPrivate::IdleOrientationEvent);   
+}
+
+void HbScreen::delayedConstruction()
+{
+    if (mDelayedConstructionHandled)
+        return;
+    mDelayedConstructionHandled = true;
+    if (mTb) {
+        connect( &HbToolBarPrivate::d_ptr ( mTb )->core, SIGNAL(orientationChanged()), this, SLOT(toolBarOrientationChanged()));
+        connect( &HbToolBarPrivate::d_ptr ( mTb )->core, SIGNAL(visibilityChanged()), this, SLOT(decoratorVisibilityChanged()));
+        HbToolBarPrivate::d_ptr(mTb)->delayedConstruction();
+    }
+    if (mDock) {
+        connect(&HbDockWidgetPrivate::d_ptr(mDock)->core, SIGNAL(visibilityChanged()), this, SLOT(decoratorVisibilityChanged()));
+    }
+}
+
+void HbScreen::setGeometry (const QRectF & rect)
+{
+    prepareGeometryChange();
+    HbWidget::setGeometry(rect);
+}
+
+
+Qt::Orientation HbScreen::toolBarOrientation() const
+{
+    return (Qt::Orientation)mToolBarOrientation;
+}
+
+Qt::Orientation HbScreen::screenOrientation() const
+{
+    return mScreenOrientation;
+}
+
+bool HbScreen::contentUnderTitleBar() const
+{
+    bool contentUnderTitleBar = false;
+    if (mStack) {
+        HbView *currentView = qobject_cast<HbView*>(mStack->currentWidget());
+        if (currentView && (currentView->viewFlags() 
+                            & (HbView::ViewTitleBarMinimized | HbView::ViewTitleBarFloating 
+                            | HbView::ViewTitleBarHidden))) {
+            contentUnderTitleBar = true;
+        }
+    }
+    return contentUnderTitleBar;
+}
+
+bool HbScreen::contentUnderStatusBar() const
+{
+    bool contentUnderStatusBar = false;
+    if (mStack) {
+        HbView *currentView = qobject_cast<HbView*>(mStack->currentWidget());
+        if (currentView && (currentView->viewFlags() 
+                            & (HbView::ViewStatusBarFloating | HbView::ViewStatusBarHidden))) {
+            contentUnderStatusBar = true;
+        }
+    }
+    return contentUnderStatusBar;
+}
+
+bool HbScreen::titleBarMinimizable() const
+{
+    bool titleBarMinimizable = false;
+    if (mStack) {
+        HbView *currentView = qobject_cast<HbView*>(mStack->currentWidget());
+        if (currentView && (currentView->viewFlags() & (HbView::ViewTitleBarMinimizable))) {
+            titleBarMinimizable = true;
+        }
+    }
+    return titleBarMinimizable;
+}
+
+void HbScreen::screenOrientationChanged(Qt::Orientation orientation)
+{
+    if (mScreenOrientation != orientation) {
+        mScreenOrientation = orientation;
+        repolish();
+        prepareGeometryChange();
+    }
+}
+
+void HbScreen::toolBarOrientationChanged()
+{
+    setToolBarOrientation(mTb->orientation());
+}
+
+void HbScreen::setToolBarOrientation(Qt::Orientation orientation)
+{
+    if (orientation != mToolBarOrientation) {
+        if (mTb){
+            HbToolBarPrivate::d_ptr(mTb)->mDoLayout = false;
+            repolish();
+        }
+        mToolBarOrientation = orientation;
+    }
+}
+
+void HbScreen::decoratorVisibilityChanged()
+{
+    if (mTb) {
+        HbToolBarPrivate::d_ptr(mTb)->mDoLayout = false;
+    }
+    repolish();
+}
+
+void HbScreen::currentViewChanged(HbView* view)
+{
+    Q_UNUSED(view);
+    repolish();
+}
+
+bool HbScreen::event(QEvent *e)
+{
+    if (e->type() == HbEvent::DeviceProfileChanged) {
+        // supress polishEvent() [which is called in HbWidget::event()] into repolish()
+        repolish();
+        return QGraphicsWidget::event(e);
+    } else {
+        return HbWidget::event(e);
+    }
+}