src/hbcore/decorators/hbtitlebar.cpp
changeset 7 923ff622b8b9
parent 6 c3690ec91ef8
child 21 4633027730f5
child 34 ed14f46c0e55
equal deleted inserted replaced
6:c3690ec91ef8 7:923ff622b8b9
    30 #include <hbmenu.h>
    30 #include <hbmenu.h>
    31 #include <hbaction.h>
    31 #include <hbaction.h>
    32 #include <hbwidgetfeedback.h>
    32 #include <hbwidgetfeedback.h>
    33 #include <hbinstance.h>
    33 #include <hbinstance.h>
    34 #include <hbnamespace.h>
    34 #include <hbnamespace.h>
    35 #include <hbpangesture.h>
    35 
       
    36 #include <hbswipegesture.h>
    36 
    37 
    37 #include "hbtitlebar_p.h"
    38 #include "hbtitlebar_p.h"
    38 #include "hbtitlebar_p_p.h"
    39 #include "hbtitlebar_p_p.h"
    39 
    40 
    40 #include "hbmainwindow_p.h"
    41 #include "hbmainwindow_p.h"
    77         mIndicatorButton, SLOT(deactivate(const QList<IndicatorClientInfo> &)));
    78         mIndicatorButton, SLOT(deactivate(const QList<IndicatorClientInfo> &)));
    78     q->connect(q, SIGNAL(allActivated(const QList<IndicatorClientInfo> &)), 
    79     q->connect(q, SIGNAL(allActivated(const QList<IndicatorClientInfo> &)), 
    79         mIndicatorButton, SLOT(activateAll(const QList<IndicatorClientInfo> &)));
    80         mIndicatorButton, SLOT(activateAll(const QList<IndicatorClientInfo> &)));
    80     q->connect(mMainWindow, SIGNAL(currentViewChanged(HbView*)), q, SLOT(currentViewChanged(HbView*)));
    81     q->connect(mMainWindow, SIGNAL(currentViewChanged(HbView*)), q, SLOT(currentViewChanged(HbView*)));
    81     q->connect(mDefaultNavigationAction, SIGNAL(triggered()), qApp, SLOT(quit()));  
    82     q->connect(mDefaultNavigationAction, SIGNAL(triggered()), qApp, SLOT(quit()));  
       
    83 }
       
    84 
       
    85 void HbTitleBarPrivate::init()
       
    86 {
       
    87     Q_Q(HbTitleBar);
    82 
    88 
    83     q->setFlag(QGraphicsItem::ItemIsPanel, true);
    89     q->setFlag(QGraphicsItem::ItemIsPanel, true);
    84 }
       
    85 
       
    86 void HbTitleBarPrivate::init()
       
    87 {
       
    88     Q_Q(HbTitleBar);
       
    89 
    90 
    90     // create title pane
    91     // create title pane
    91     mTitlePane = new HbTitlePane(q);
    92     mTitlePane = new HbTitlePane(q);
    92     mTitlePane->setZValue(HbPrivate::TitlePaneZValue);
    93     mTitlePane->setZValue(HbPrivate::TitlePaneZValue);
    93 
    94 
   108     HbStyle::setItemName(mIndicatorButton, "status");
   109     HbStyle::setItemName(mIndicatorButton, "status");
   109     HbStyle::setItemName(mNavigationButton, "back");
   110     HbStyle::setItemName(mNavigationButton, "back");
   110     
   111     
   111     mPreviousTitleBarProperties = 0; // view not yet ready
   112     mPreviousTitleBarProperties = 0; // view not yet ready
   112 
   113 
   113     QObject::connect(this->mTitlePane, SIGNAL(panRight()), q, SLOT(gestureRight()));
   114     QObject::connect(this->mTitlePane, SIGNAL(swipeRight()), q, SLOT(gestureSwipeRight()));
   114     QObject::connect(this->mTitlePane, SIGNAL(panLeft()), q, SLOT(gestureLeft()));
   115     QObject::connect(this->mTitlePane, SIGNAL(swipeLeft()), q, SLOT(gestureSwipeLeft()));
   115 }
   116 }
   116 
   117 
   117 void HbTitleBarPrivate::initSceneEventFilters(HbView *view)
   118 void HbTitleBarPrivate::initSceneEventFilters(HbView *view)
   118 {
   119 {
   119     Q_Q(HbTitleBar);
   120     Q_Q(HbTitleBar);
   122             // Install sceneEvent filter(s)
   123             // Install sceneEvent filter(s)
   123             mTouchAreaItem = q->style()->createPrimitive(HbStyle::P_TitleBar_toucharea, q);
   124             mTouchAreaItem = q->style()->createPrimitive(HbStyle::P_TitleBar_toucharea, q);
   124             mTouchAreaItem->setAcceptedMouseButtons(Qt::LeftButton);
   125             mTouchAreaItem->setAcceptedMouseButtons(Qt::LeftButton);
   125             mTouchAreaItem->installSceneEventFilter(q);
   126             mTouchAreaItem->installSceneEventFilter(q);
   126             QGraphicsObject *touchAreaItemGraphicsObject = static_cast<QGraphicsObject*>(mTouchAreaItem);
   127             QGraphicsObject *touchAreaItemGraphicsObject = static_cast<QGraphicsObject*>(mTouchAreaItem);
   127             touchAreaItemGraphicsObject->grabGesture(Qt::PanGesture);
   128             touchAreaItemGraphicsObject->grabGesture(Qt::SwipeGesture);
   128         }
   129         }
   129     } else { // Remove scene event filter
   130     } else { // Remove scene event filter
   130         if (mTouchAreaItem) {
   131         if (mTouchAreaItem) {
   131             mTouchAreaItem->removeSceneEventFilter(q);
   132             mTouchAreaItem->removeSceneEventFilter(q);
   132             delete mTouchAreaItem;
   133             delete mTouchAreaItem;
   171 {
   172 {
   172     Q_D(HbTitleBar);
   173     Q_D(HbTitleBar);
   173     d->q_ptr = this;
   174     d->q_ptr = this;
   174     d->mMainWindow = mainWindow;
   175     d->mMainWindow = mainWindow;
   175     d->init();
   176     d->init();
       
   177     setFlag(QGraphicsItem::ItemIsPanel, true);
   176 }
   178 }
   177 
   179 
   178 HbTitleBar::HbTitleBar(HbTitleBarPrivate &dd, HbMainWindow *mainWindow,
   180 HbTitleBar::HbTitleBar(HbTitleBarPrivate &dd, HbMainWindow *mainWindow,
   179                        QGraphicsItem *parent)
   181                        QGraphicsItem *parent)
   180     : HbWidget(dd, parent)
   182     : HbWidget(dd, parent)
   202 /*
   204 /*
   203     Delayed constructor.
   205     Delayed constructor.
   204  */
   206  */
   205 void HbTitleBar::delayedConstruction()
   207 void HbTitleBar::delayedConstruction()
   206 {
   208 {
   207        Q_D(HbTitleBar);
   209     Q_D(HbTitleBar);
   208        d->delayedConstruction();
   210     d->delayedConstruction();
   209 }
   211 }
   210 
   212 
   211 /*
   213 /*
   212     titlePane. Return titlepane decorator.
   214     titlePane. Return titlepane decorator.
   213 */
   215 */
   273     Q_D(HbTitleBar);
   275     Q_D(HbTitleBar);
   274     setNavigationAction(d->mDefaultNavigationAction);
   276     setNavigationAction(d->mDefaultNavigationAction);
   275 }
   277 }
   276 
   278 
   277 /*
   279 /*
   278     gestureRight. Handles left-to-right flick.
   280     gestureSwipeRight. Handles left-to-right flick.
   279             if(layoutDirection() == Qt::LeftToRight) {
   281 */
   280 */
   282 
   281 
   283 void HbTitleBar::gestureSwipeRight()
   282 void HbTitleBar::gestureRight()
   284 {
   283 {
   285     Q_D(HbTitleBar);
   284     Q_D(HbTitleBar);
   286 
   285 
   287     if (!minimizable()) {      
   286     if (!minimizable()) {
       
   287         return;
   288         return;
   288     }
   289     }
       
   290 
   289     HbWidgetFeedback::triggered(this, Hb::InstantFlicked);
   291     HbWidgetFeedback::triggered(this, Hb::InstantFlicked);
   290 
   292 
   291     Position p(position());
   293     Position p(position());
   292     QSize screenSize = HbDeviceProfile::profile(this).logicalSize();
   294     QSize screenSize = HbDeviceProfile::profile(this).logicalSize();
   293     QRectF handleRect = d->mTitleBarHandle->boundingRect();
   295     QRectF handleRect = d->mTitleBarHandle->boundingRect();
   294 
   296 
   295     if (d->mMainWindow &&
   297     if (d->mMainWindow &&
   296         d->mIndicatorButton->isVisible() &&
   298         d->mIndicatorButton->isVisible() &&
   297         p == HbTitleBar::Original) {
   299         p == HbTitleBar::Original) {
   298 #ifdef HB_EFFECTS
   300 #ifdef HB_EFFECTS
   299         //grabMouse(); // this prevents taps/gestures on top of animating titlebar
       
   300         QRectF extRect(scenePos().x(), 0.0, screenSize.width(), 10.0);
   301         QRectF extRect(scenePos().x(), 0.0, screenSize.width(), 10.0);
   301         HbEffect::start(this, "titlebar", "minimize", this, "effectFinished", QVariant(), extRect);
   302         HbEffect::start(this, "titlebar", "minimize", this, "effectFinished", QVariant(), extRect);
   302 #else // no effects, just do the translation
   303 #else // no effects, just do the translation
   303         translate(screenSize.width()-handleRect.width(), 0);
   304         translate(screenSize.width()-handleRect.width(), 0);
   304 #endif //HB_EFFECTS
   305 #endif //HB_EFFECTS
   305     } 
   306     } 
   306 }
   307 }
   307 
   308 
   308 /*
   309 /*
   309     gestureLeft. Handles right-to-left flick.
   310     gestureSwipeLeft. Handles right-to-left flick.
   310 */
   311 */
   311 
   312 
   312 void HbTitleBar::gestureLeft()
   313 void HbTitleBar::gestureSwipeLeft()
   313 {
   314 {
   314     Q_D(HbTitleBar);
   315     Q_D(HbTitleBar);
   315 
   316 
   316     if (!minimizable()) {
   317     if (!minimizable()) {
   317         return;
   318         return;
   318     }
   319     }
       
   320 
   319     HbWidgetFeedback::triggered(this, Hb::InstantFlicked);
   321     HbWidgetFeedback::triggered(this, Hb::InstantFlicked);
   320 
   322 
   321     Position p(position());
   323     Position p(position());
   322     QSize screenSize = HbDeviceProfile::profile(this).logicalSize();
   324     QSize screenSize = HbDeviceProfile::profile(this).logicalSize();
   323     QRectF handleRect = d->mTitleBarHandle->boundingRect();
   325     QRectF handleRect = d->mTitleBarHandle->boundingRect();
   325     // titlebar's transformation information
   327     // titlebar's transformation information
   326     if (d->mMainWindow &&
   328     if (d->mMainWindow &&
   327         d->mIndicatorButton->isVisible() &&
   329         d->mIndicatorButton->isVisible() &&
   328         p == HbTitleBar::Minimized) {
   330         p == HbTitleBar::Minimized) {
   329 #ifdef HB_EFFECTS
   331 #ifdef HB_EFFECTS
   330         //grabMouse(); // this prevents taps/gestures on top of animating titlebar
       
   331         // effect translates widget from rect's right x-coordinate to left x-coordinate
   332         // effect translates widget from rect's right x-coordinate to left x-coordinate
   332         QRectF extRect(-handleRect.width(), 0.0, scenePos().x(), 10.0); // height not used in effect
   333         QRectF extRect(-handleRect.width(), 0.0, scenePos().x(), 10.0); // height not used in effect
   333         HbEffect::start(this, "titlebar", "maximize", this, "effectFinished", QVariant(), extRect);
   334         HbEffect::start(this, "titlebar", "maximize", this, "effectFinished", QVariant(), extRect);
   334 #else // no effects, just do the translation
   335 #else // no effects, just do the translation
   335         translate(x()-scenePos().x(), y()-scenePos().y());
   336         translate(x()-scenePos().x(), y()-scenePos().y());
   432 {
   433 {
   433     Q_UNUSED(watched)
   434     Q_UNUSED(watched)
   434 
   435 
   435     Q_D(HbTitleBar);
   436     Q_D(HbTitleBar);
   436     bool filterOutEvent = false;
   437     bool filterOutEvent = false;
   437     switch(event->type()){
   438     switch(event->type()){    
   438     case QEvent::GraphicsSceneMousePress:
   439     case QEvent::GraphicsSceneMousePress:
   439         HbWidgetFeedback::triggered(this, Hb::InstantPressed);
   440         HbWidgetFeedback::triggered(this, Hb::InstantPressed);
   440         event->accept(); //we need to catch the mouse release and move events also
   441         event->accept(); //we need to catch the mouse release and move events also
   441         filterOutEvent = true;
   442         filterOutEvent = true;
   442         break;
   443         break;
   460         } else if (d->mHandleDown) {
   461         } else if (d->mHandleDown) {
   461             d->mHandleDown = false;
   462             d->mHandleDown = false;
   462             HbWidgetFeedback::triggered(this, Hb::InstantReleased);
   463             HbWidgetFeedback::triggered(this, Hb::InstantReleased);
   463         }
   464         }
   464         filterOutEvent = true;
   465         filterOutEvent = true;
   465         break;
   466         break;    
   466     }
   467     }
   467     case QEvent::Gesture: {
   468     case QEvent::Gesture: {
   468         QGestureEvent *gestureEvent = static_cast<QGestureEvent*>(event);
   469         QGestureEvent *gestureEvent = static_cast<QGestureEvent*>(event);
   469         if (HbPanGesture *pan = qobject_cast<HbPanGesture*>(gestureEvent->gesture(Qt::PanGesture))) {
   470         HbSwipeGesture *swipe = qobject_cast<HbSwipeGesture*>(gestureEvent->gesture(Qt::SwipeGesture));
   470             if (pan->state() == Qt::GestureFinished) {
   471         if(swipe) {
   471                 if(pan->sceneDelta().x() < -0) {
   472             if(swipe->sceneHorizontalDirection() == QSwipeGesture::Right) {
   472                     gestureLeft();
   473                 gestureSwipeRight();
   473                 }
   474             } else if(swipe->sceneHorizontalDirection() == QSwipeGesture::Left) {
   474                 else if (pan->sceneDelta().x() > 0) {
   475                 gestureSwipeLeft();
   475                     gestureRight();
       
   476                 }
       
   477                 gestureEvent->accept();
       
   478             }
   476             }
   479         }
   477             gestureEvent->accept();
       
   478         }
       
   479 
   480         filterOutEvent = true;
   480         filterOutEvent = true;
   481         break;
   481         break;
   482     }
   482     }   
   483     default:
   483     default:
   484         break;
   484         break;
   485     }
   485     }
   486     return filterOutEvent;
   486     return filterOutEvent;
   487 }
   487 }