--- a/src/hbcore/decorators/hbtitlebar.cpp Mon Apr 19 14:02:13 2010 +0300
+++ b/src/hbcore/decorators/hbtitlebar.cpp Mon May 03 12:48:33 2010 +0300
@@ -34,6 +34,7 @@
#include <hbwidgetfeedback.h>
#include <hbinstance.h>
#include <hbnamespace.h>
+#include <hbpangesture.h>
#include "hbtitlebar_p.h"
#include "hbtitlebar_p_p.h"
@@ -57,30 +58,40 @@
{
}
+void HbTitleBarPrivate::delayedConstruction()
+{
+ Q_Q(HbTitleBar);
+
+ mTitlePane->delayedConstruction();
+ mIndicatorButton->delayedConstruction();
+ mNavigationButton->delayedConstruction();
+
+#ifdef HB_EFFECTS
+ HbEffect::add(
+ QStringList() << "decorator" << "decorator" << "decorator",
+ QStringList() << "decorator_pressed" << "decorator_released" << "decorator_latched",
+ QStringList() << "pressed" << "released" << "latched");
+#endif
+
+ q->connect(mTitlePane, SIGNAL(launchPopup(QPointF)), mMainWindow, SLOT(_q_launchMenu(QPointF)));
+ q->connect(q, SIGNAL(notificationCountChanged(int)), mIndicatorButton, SLOT(setIcon(int)));
+ q->connect(mMainWindow, SIGNAL(currentViewChanged(HbView*)), q, SLOT(currentViewChanged(HbView*)));
+ q->connect(mDefaultNavigationAction, SIGNAL(triggered()), qApp, SLOT(quit()));
+}
+
void HbTitleBarPrivate::init()
{
Q_Q(HbTitleBar);
-#ifdef HB_EFFECTS
- HbEffect::add("decorator", "decorator_pressed", "pressed");
- HbEffect::add("decorator", "decorator_released", "released");
- HbEffect::add("decorator", "decorator_latched", "latched");
-#endif
-
// create title pane
mTitlePane = new HbTitlePane(q);
mTitlePane->setZValue(HbPrivate::TitlePaneZValue);
- QObject::connect(mTitlePane, SIGNAL(launchPopup(QPointF)),
- mMainWindow, SLOT(_q_launchMenu(QPointF)));
mIndicatorButton = new HbIndicatorButton(q);
- q->connect(q, SIGNAL(notificationCountChanged(int)),
- mIndicatorButton, SLOT(setIcon(int)));
mNavigationButton = new HbNavigationButton(q);
// add default quit action
mDefaultNavigationAction = new HbAction(Hb::QuitNaviAction, q);
mDefaultNavigationAction->setText("Quit");
- q->connect(mDefaultNavigationAction, SIGNAL(triggered()), qApp, SLOT(quit()));
mNavigationButton->setAction(mDefaultNavigationAction);
HbStyle::setItemName(q, "titlebar");
@@ -88,39 +99,27 @@
HbStyle::setItemName(mIndicatorButton, "status");
HbStyle::setItemName(mNavigationButton, "back");
- QObject::connect(mMainWindow, SIGNAL(currentViewChanged(HbView*)), q, SLOT(currentViewChanged(HbView*)));
mPreviousTitleBarProperties = 0; // view not yet ready
+
+ QObject::connect(this->mTitlePane, SIGNAL(panRight()), q, SLOT(gestureRight()));
+ QObject::connect(this->mTitlePane, SIGNAL(panLeft()), q, SLOT(gestureLeft()));
}
void HbTitleBarPrivate::initSceneEventFilters(HbView *view)
{
Q_Q(HbTitleBar);
if (view->viewFlags() & HbView::ViewTitleBarMinimizable) {
- if (!mTitleBarFilter) { // Install scene event filter
- mTitleBarFilter = new HbGestureSceneFilter(Qt::LeftButton, q);
- mTitleBarGestureLeft = new HbGesture(HbGesture::left, 20);
- mTitleBarFilter->addGesture(mTitleBarGestureLeft);
- mTitleBarGestureRight = new HbGesture(HbGesture::right, 20);
- mTitleBarFilter->addGesture(mTitleBarGestureRight);
- QObject::connect(mTitleBarGestureRight, SIGNAL(triggered(int)),
- q, SLOT(gestureRight(int)));
- QObject::connect(mTitleBarGestureLeft, SIGNAL(triggered(int)),
- q, SLOT(gestureLeft(int)));
-
+ if(!mTouchAreaItem) {
// Install sceneEvent filter(s)
mTouchAreaItem = q->style()->createPrimitive(HbStyle::P_TitleBar_toucharea, q);
mTouchAreaItem->setAcceptedMouseButtons(Qt::LeftButton);
mTouchAreaItem->installSceneEventFilter(q);
- mTouchAreaItem->installSceneEventFilter(mTitleBarFilter);
- //mIndicatorButton->installSceneEventFilter(mTitleBarFilter);
- mTitlePane->installSceneEventFilter(mTitleBarFilter);
+ QGraphicsObject *touchAreaItemGraphicsObject = static_cast<QGraphicsObject*>(mTouchAreaItem);
+ touchAreaItemGraphicsObject->grabGesture(Qt::PanGesture);
}
} else { // Remove scene event filter
- if (mTitleBarFilter) {
- //mIndicatorButton->removeSceneEventFilter(mTitleBarFilter);
- mTitlePane->removeSceneEventFilter(mTitleBarFilter);
- delete mTitleBarFilter;
- mTitleBarFilter = 0;
+ if (mTouchAreaItem) {
+ mTouchAreaItem->removeSceneEventFilter(q);
delete mTouchAreaItem;
mTouchAreaItem = 0;
}
@@ -135,8 +134,10 @@
mTitleBarHandle = new HbTitleBarHandle(q);
HbStyle::setItemName(mTitleBarHandle, "handle");
#ifdef HB_EFFECTS
- HbEffect::add("titlebar", "titlebar_minimize", "minimize");
- HbEffect::add("titlebar", "titlebar_maximize", "maximize");
+ HbEffect::add(
+ QStringList() << "titlebar" << "titlebar",
+ QStringList() << "titlebar_minimize" << "titlebar_maximize",
+ QStringList() << "minimize" << "maximize");
#endif
}
} else {
@@ -182,15 +183,23 @@
{
Q_D(HbTitleBar);
// Remove scene event filter
- if(d->mTitleBarFilter) {
- //d->mIndicatorButton->removeSceneEventFilter(d->mTitleBarFilter);
- d->mTitlePane->removeSceneEventFilter(d->mTitleBarFilter);
- delete d->mTitleBarFilter;
- d->mTitleBarFilter = 0;
+ if (d->mTouchAreaItem) {
+ d->mTouchAreaItem->removeSceneEventFilter(this);
+ delete d->mTouchAreaItem;
+ d->mTouchAreaItem = 0;
}
}
/*
+ Delayed constructor.
+ */
+void HbTitleBar::delayedConstruction()
+{
+ Q_D(HbTitleBar);
+ d->delayedConstruction();
+}
+
+/*
titlePane. Return titlepane decorator.
*/
HbTitlePane *HbTitleBar::titlePane() const
@@ -260,9 +269,11 @@
gestureRight. Handles left-to-right flick.
if(layoutDirection() == Qt::LeftToRight) {
*/
-void HbTitleBar::gestureRight(int speed)
+
+void HbTitleBar::gestureRight()
{
Q_D(HbTitleBar);
+
if (!minimizable()) {
return;
}
@@ -273,7 +284,7 @@
QRectF handleRect = d->mTitleBarHandle->boundingRect();
if (layoutDirection() == Qt::LeftToRight && d->mMainWindow &&
- d->mIndicatorButton->isVisible() && (speed > 50) &&
+ d->mIndicatorButton->isVisible() &&
p == HbTitleBar::Original) {
#ifdef HB_EFFECTS
//grabMouse(); // this prevents taps/gestures on top of animating titlebar
@@ -283,7 +294,7 @@
translate(screenSize.width()-handleRect.width(), 0);
#endif //HB_EFFECTS
} else if (layoutDirection() == Qt::RightToLeft && d->mMainWindow &&
- d->mIndicatorButton->isVisible() && (speed > 50) &&
+ d->mIndicatorButton->isVisible() &&
p == HbTitleBar::Minimized) {
#ifdef HB_EFFECTS
//grabMouse(); // this prevents taps/gestures on top of animating titlebar
@@ -298,9 +309,11 @@
/*
gestureLeft. Handles right-to-left flick.
*/
-void HbTitleBar::gestureLeft(int speed)
+
+void HbTitleBar::gestureLeft()
{
Q_D(HbTitleBar);
+
if (!minimizable()) {
return;
}
@@ -312,7 +325,7 @@
// only way to reliable find the position of titlebar is using
// titlebar's transformation information
if (layoutDirection() == Qt::LeftToRight && d->mMainWindow &&
- d->mIndicatorButton->isVisible() && (speed > 50) &&
+ d->mIndicatorButton->isVisible() &&
p == HbTitleBar::Minimized) {
#ifdef HB_EFFECTS
//grabMouse(); // this prevents taps/gestures on top of animating titlebar
@@ -323,7 +336,7 @@
translate(x()-scenePos().x(), y()-scenePos().y());
#endif //HB_EFFECTS
} else if (layoutDirection() == Qt::RightToLeft && d->mMainWindow &&
- d->mIndicatorButton->isVisible() && (speed > 50) &&
+ d->mIndicatorButton->isVisible() &&
p == HbTitleBar::Original) {
#ifdef HB_EFFECTS
//grabMouse(); // this prevents taps/gestures on top of animating titlebar
@@ -459,6 +472,22 @@
filterOutEvent = true;
break;
}
+ case QEvent::Gesture: {
+ QGestureEvent *gestureEvent = static_cast<QGestureEvent*>(event);
+ if (HbPanGesture *pan = qobject_cast<HbPanGesture*>(gestureEvent->gesture(Qt::PanGesture))) {
+ if(pan->state() == Qt::GestureUpdated || pan->state() == Qt::GestureFinished) {
+ if(pan->sceneDelta().x() < -0) {
+ gestureLeft();
+ }
+ if(pan->sceneDelta().x() > 0) {
+ gestureRight();
+ }
+ gestureEvent->accept();
+ }
+ }
+ filterOutEvent = true;
+ break;
+ }
default:
break;
}