src/hbcore/gui/hbview.cpp
changeset 34 ed14f46c0e55
parent 6 c3690ec91ef8
--- a/src/hbcore/gui/hbview.cpp	Mon Oct 04 17:49:30 2010 +0300
+++ b/src/hbcore/gui/hbview.cpp	Mon Oct 18 18:23:13 2010 +0300
@@ -38,6 +38,7 @@
 #include "hbscreen_p.h"
 #include "hbviewactionmanager_p.h"
 #include "hbglobal_p.h"
+#include "hbevent.h"
 #include <QPointer>
 
 /*!
@@ -271,6 +272,18 @@
 }
 
 /*!
+    \internal
+ */
+void HbViewPrivate::delayedConstruction()
+{
+   //view content is drawn already on screen.Try to
+   //create the content of options menu now.
+    if (menu) {
+        HbMenuPrivate::d_ptr(menu)->delayedLayout();
+    }
+}
+
+/*!
     Constructs a view with the given \a parent.
 */
 HbView::HbView(QGraphicsItem *parent) :
@@ -408,8 +421,13 @@
 {
     Q_D(const HbView);
     if (!d->toolBar) {
-        HbView *that = const_cast<HbView *>(this);
-        that->setToolBar(new HbToolBar);
+        HbViewPrivate* p = const_cast<HbViewPrivate*>(d);
+        p->toolBar = new HbToolBar;
+        // duplicates functionality of HbMainWindowPrivate::_q_viewToolBarChanged as a perf optimisation
+        if ( mainWindow() && mainWindow()->currentView() == this ) {
+            HbMainWindowPrivate::d_ptr(mainWindow())->addToolBarToLayout(p->toolBar);
+        }
+
     }
     return d->toolBar;
 }
@@ -534,6 +552,9 @@
                 d->mLayout = 0;
             }
         }
+        // remove view switch effects the item might be part of
+        HbEffect::cancel(this);
+
         delete d->widget;
         d->widget = widget;
     }
@@ -723,49 +744,53 @@
     HbView::HbViewFlags originalFlags(d->mViewFlags);
     d->mViewFlags = flags;
     if (mainWindow()) {
-
-        // Statusbar-animation
-        bool statusBarAnimating = false;
-        HbStatusBar *statusBar = HbMainWindowPrivate::d_ptr(mainWindow())->mStatusBar;
-        if ((d->mViewFlags & HbView::ViewStatusBarHidden) && !(originalFlags & HbView::ViewStatusBarHidden)) {
+        bool isCurrentView(mainWindow()->currentView() == this);
+        if (isCurrentView) {
+            // Statusbar-animation
+            bool statusBarAnimating = false;
+            HbStatusBar *statusBar = HbMainWindowPrivate::d_ptr(mainWindow())->mStatusBar;
+            if ((d->mViewFlags & HbView::ViewStatusBarHidden) && !(originalFlags & HbView::ViewStatusBarHidden)) {
 #ifdef HB_EFFECTS
             HbEffect::start(statusBar, "statusbar", "disappear", this, "statusBarEffectFinished");
 #endif // HB_EFFECTS
             statusBarAnimating = true;
         } else if (!(d->mViewFlags & HbView::ViewStatusBarHidden) && (originalFlags & HbView::ViewStatusBarHidden)) {
 #ifdef HB_EFFECTS
+            statusBar->setVisible(true);
             HbEffect::start(statusBar, "statusbar", "appear", this, "statusBarEffectFinished");
 #endif // HB_EFFECTS
             statusBarAnimating = true;
-        }
+            }
 
-        // Titlebar-animation
-        bool titleBarAnimating = false;
-        HbTitleBar *titleBar = HbMainWindowPrivate::d_ptr(mainWindow())->mTitleBar;
-        if ((d->mViewFlags & HbView::ViewTitleBarHidden) && !(originalFlags & HbView::ViewTitleBarHidden)) {
+            // Titlebar-animation
+            bool titleBarAnimating = false;
+            HbTitleBar *titleBar = HbMainWindowPrivate::d_ptr(mainWindow())->mTitleBar;
+            if ((d->mViewFlags & HbView::ViewTitleBarHidden) && !(originalFlags & HbView::ViewTitleBarHidden)) {
 #ifdef HB_EFFECTS
-            HbEffect::start(titleBar, "titlebar", "disappear", this, "titleBarEffectFinished");
+                HbEffect::start(titleBar, "titlebar", "disappear", this, "titleBarEffectFinished");
 #endif // HB_EFFECTS
-            titleBarAnimating = true;
-        } else if (!(d->mViewFlags & HbView::ViewTitleBarHidden) && (originalFlags & HbView::ViewTitleBarHidden)) {
+                titleBarAnimating = true;
+            } else if (!(d->mViewFlags & HbView::ViewTitleBarHidden) && (originalFlags & HbView::ViewTitleBarHidden)) {
 #ifdef HB_EFFECTS
-            HbEffect::start(titleBar, "titlebar", "appear", this, "titleBarEffectFinished");
+                titleBar->setVisible(true);
+                HbEffect::start(titleBar, "titlebar", "appear", this, "titleBarEffectFinished");
 #endif // HB_EFFECTS
-            titleBarAnimating = true;
-        }
+                titleBarAnimating = true;
+            }
 
-        if (!statusBarAnimating) {
-            statusBar->setVisible(!(d->mViewFlags & HbView::ViewStatusBarHidden));
-            statusBar->propertiesChanged();
-        }
-        if (!titleBarAnimating) {
-            titleBar->setVisible(!(d->mViewFlags & HbView::ViewTitleBarHidden));
-            if (d->mNavigationActionSet) {
-                titleBar->setNavigationAction(d->mNavigationAction);
-            } else {
-                titleBar->setDefaultNavigationAction();
+            if (!statusBarAnimating && !titleBarAnimating) {
+                statusBar->setVisible(!(d->mViewFlags & HbView::ViewStatusBarHidden));
+                statusBar->propertiesChanged();
             }
-            titleBar->propertiesChanged();
+            if (!titleBarAnimating && !statusBarAnimating) {
+                titleBar->setVisible(!(d->mViewFlags & HbView::ViewTitleBarHidden));
+                if (d->mNavigationActionSet) {
+                    titleBar->setNavigationAction(d->mNavigationAction);
+                } else {
+                    titleBar->setDefaultNavigationAction();
+                }
+                titleBar->propertiesChanged();
+            }
         }
         if (d->toolBar) {
             d->toolBar->updatePrimitives();
@@ -793,7 +818,7 @@
         int visibilityFlags = HbView::ViewTitleBarMinimized | HbView::ViewTitleBarFloating
                               | HbView::ViewTitleBarMinimizable | HbView::ViewStatusBarHidden | HbView::ViewStatusBarFloating
                               | HbView::ViewTitleBarHidden | HbView::ViewDisableRelayout;
-        if ((d->mViewFlags & visibilityFlags) != (originalFlags & visibilityFlags)) {
+        if (isCurrentView && (d->mViewFlags & visibilityFlags) != (originalFlags & visibilityFlags)) {
             HbMainWindowPrivate::d_ptr(mainWindow())->mClippingItem->decoratorVisibilityChanged();
         }
     }
@@ -810,8 +835,9 @@
 void HbView::setTitleBarVisible(bool visible)
 {
     Q_D(HbView);
-    if (visible) {
-        setViewFlags(d->mViewFlags &~ HbView::ViewTitleBarHidden);
+
+    if (visible) {        
+        setViewFlags(d->mViewFlags &~ HbView::ViewTitleBarHidden);        
     } else {
         setViewFlags(d->mViewFlags | HbView::ViewTitleBarHidden);
     }
@@ -891,6 +917,7 @@
  */
 void HbView::changeEvent(QEvent *event)
 {
+    Q_D(const HbView);
 
     // We're listening for layout direction changes, because the screen needs to be
     // repolished, if the layout direction changes and the titlebar is minimizable.
@@ -903,6 +930,11 @@
         if (mw && mw->currentView() == this) {
             HbMainWindowPrivate::d_ptr(mw)->mClippingItem->decoratorVisibilityChanged();
         }
+    } else if(event->type() == HbEvent::ThemeChanged) {
+        HbMainWindow *mw = mainWindow();
+        if (d->toolBar && mw && mw->currentView() != this) {
+            d->toolBar->changeEvent(event);
+        }
     }
 
     HbWidget::changeEvent(event);
@@ -1029,6 +1061,9 @@
 
   Ownership of \a action is not taken.
 
+  \note The navigation button will not display text that is assigned to the
+  action.
+
   \sa navigationAction()
  */
 void HbView::setNavigationAction(HbAction *action)