diff -r c3690ec91ef8 -r 923ff622b8b9 src/hbwidgets/sliders/hbsliderhandle.cpp --- a/src/hbwidgets/sliders/hbsliderhandle.cpp Wed Jun 23 18:33:25 2010 +0300 +++ b/src/hbwidgets/sliders/hbsliderhandle.cpp Tue Jul 06 14:36:53 2010 +0300 @@ -40,6 +40,7 @@ #ifdef HB_GESTURE_FW #include #include +#include #endif /*! This is internal class for HbSlider @@ -63,6 +64,7 @@ // create handle icon item gItem = slider->style()->createPrimitive(HbStyle::P_Slider_thumb, this); HbStyle::setItemName(gItem , "icon"); + setFiltersChildEvents(true) ; // create touch area for handle touchItem = slider->style()->createPrimitive(HbStyle::P_SliderElement_touchhandle, this); @@ -72,11 +74,12 @@ #ifdef HB_GESTURE_FW grabGesture(Qt::TapGesture); grabGesture(Qt::PanGesture); + grabGesture(Qt::TapAndHoldGesture); if(touchItem) { if(QGraphicsObject *touchArea = touchItem->toGraphicsObject()) { - Q_UNUSED(touchArea); - touchArea->grabGesture(Qt::PanGesture); - touchArea->grabGesture(Qt::TapGesture); + touchArea->grabGesture(Qt::PanGesture); + touchArea->grabGesture(Qt::TapGesture); + touchArea->grabGesture(Qt::TapAndHoldGesture); } } #endif @@ -96,6 +99,8 @@ #endif } + + /*! Destroys the slider handle. */ @@ -162,7 +167,6 @@ mHandleItem->removeSceneEventFilter(this); mHandleItem->installSceneEventFilter(this); } - mHandleItem->setFlag(QGraphicsItem::ItemIsMovable,true);//required as the press has to be accepted to filter move events. } @@ -190,18 +194,27 @@ { //TODO: touch area does not work with the current filtering mechanism. find better solution if( obj == mHandleItem) { - if(event->type() == QEvent::GraphicsSceneMouseMove){ - mouseMoveEvent ( (QGraphicsSceneMouseEvent *) event ) ; - return true; - } - else if (event->type() == QEvent::GraphicsSceneMousePress){ - mousePressEvent((QGraphicsSceneMouseEvent *) event); - } - else if (event->type() == QEvent::GraphicsSceneMouseRelease){ - mouseReleaseEvent((QGraphicsSceneMouseEvent *) event); - } + if(event->type() == QEvent::GraphicsSceneMouseMove){ + mouseMoveEvent ((QGraphicsSceneMouseEvent *) event) ; + return true; + } else if (event->type() == QEvent::GraphicsSceneMousePress){ + mousePressEvent((QGraphicsSceneMouseEvent *) event); + return true; + } else if (event->type() == QEvent::GraphicsSceneMouseRelease){ + mouseReleaseEvent((QGraphicsSceneMouseEvent *) event); + return true; + } } - return false; + if( obj == touchItem ) { + if (!isEnabled() ) { + return false; + } + if (event->type() == QEvent::Gesture){ + gestureEvent( (QGestureEvent *) (event)); + return true; + } + } + return false; } /*! @@ -210,6 +223,7 @@ */ void HbSliderHandle::mousePressEvent(QGraphicsSceneMouseEvent *event) { +#ifndef HB_GESTURE_FW qreal span = 0; HbWidget::mousePressEvent(event); QRectF sliderBounds=sliderControl->boundingRect(); @@ -239,6 +253,9 @@ updatePrimitives(); } event->accept(); +#else + Q_UNUSED(event) +#endif } /*! @@ -247,6 +264,7 @@ */ void HbSliderHandle::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { +#ifndef HB_GESTURE_FW HbWidget::mouseReleaseEvent(event); #ifdef HB_EFFECTS if( sliderControl->orientation() == Qt::Horizontal ) { @@ -270,6 +288,9 @@ sliderControl->updateSliderPosToTick(); } updatePrimitives(); +#else + Q_UNUSED(event) +#endif } /*! @@ -278,6 +299,7 @@ */ void HbSliderHandle::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { +#ifndef HB_GESTURE_FW qreal span = 0; HbWidget::mouseMoveEvent(event); QRectF sliderBounds=sliderControl->boundingRect(); @@ -312,6 +334,9 @@ sliderPos, static_cast(span),opt.upsideDown); sliderControl->setSliderPosition(pressValue); sliderControl->showToolTip(); +#else + Q_UNUSED(event) +#endif } /*! @@ -319,8 +344,123 @@ */ void HbSliderHandle::gestureEvent(QGestureEvent *event) -{ - Q_UNUSED(event); +{ + if(HbTapAndHoldGesture *tapandHold= qobject_cast(event->gesture(Qt::TapAndHoldGesture))) { + if(tapandHold->state() == Qt::GestureStarted) { + sliderControl->showToolTip(); + } + } + if(HbTapGesture *tap = qobject_cast(event->gesture(Qt::TapGesture))) { + switch(tap->state()) { + case Qt::GestureStarted: { + if (!sliderControl->isSliderDown( ) ) { + sliderControl->setSliderDown(true); + updatePrimitives(); + } + HbWidgetFeedback::triggered(sliderControl, Hb::InstantPressed, Hb::ModifierSliderHandle); + if (scene()){ + HbStyleOptionSlider opt; + sliderControl->initStyleOption(&opt); + if (sliderControl->orientation() == Qt::Horizontal) { +#ifdef HB_EFFECTS + HbEffect::start(gItem, HB_SLIDERHANDLE_TYPE, "h_thumbpress"); +#endif + } else { +#ifdef HB_EFFECTS + HbEffect::start(gItem, HB_SLIDERHANDLE_TYPE, "v_thumbpress"); +#endif + } + event->accept(); + } + } + break; + case Qt::GestureFinished: + { +#ifdef HB_EFFECTS + if( sliderControl->orientation() == Qt::Horizontal ) { + HbEffect::start(gItem, HB_SLIDERHANDLE_TYPE, "h_thumbrelease"); + } else { + HbEffect::start(gItem, HB_SLIDERHANDLE_TYPE, "v_thumbrelease"); + } +#endif + HbWidgetFeedback::triggered(sliderControl, Hb::InstantReleased, Hb::ModifierSliderHandle); + sliderControl->setSliderDown(false); + updatePrimitives(); + break; + } + default: + break; + + } + } + if (HbPanGesture *panGesture = qobject_cast(event->gesture(Qt::PanGesture))) { + switch(panGesture->state( )) { + case Qt::GestureStarted: + case Qt::GestureUpdated:{ + QPointF eventScenePos =panGesture->sceneOffset( )+panGesture->sceneStartPos( ); + QPointF relativePos = mapToParent( mapFromScene(eventScenePos )); + qreal span = 0; + QRectF sliderBounds=sliderControl->boundingRect(); + QRectF handleBounds=boundingRect(); + HbStyleOptionSlider opt; + sliderControl->initStyleOption(&opt); + int sliderPos; + if ( sliderControl->orientation() == Qt::Horizontal ) { +#ifdef HB_EFFECTS + if( sliderBounds.topLeft().x() > relativePos.rx( ) || + sliderBounds.bottomRight().x() < relativePos.rx()) { + HbEffect::start(gItem, HB_SLIDERHANDLE_TYPE, "h_outofbound"); + } +#endif + sliderBounds.adjust(0, 0, -handleBounds.width(), 0); + span = sliderBounds.width(); + sliderPos = relativePos.rx(); + sliderPos-=handleBounds.width()/2; + } else { +#ifdef HB_EFFECTS + if( sliderBounds.topLeft().y() > relativePos.ry() || + sliderBounds.bottomRight().y() < relativePos.ry()) { + HbEffect::start(gItem, HB_SLIDERHANDLE_TYPE, "v_outofbound"); + } +#endif + sliderBounds.adjust(0, 0, 0, -handleBounds.height()); + span = sliderBounds.height(); + sliderPos = relativePos.ry(); + sliderPos -= handleBounds.height() / 2; + + } + int pressValue= QStyle::sliderValueFromPosition(opt.minimum, opt.maximum, + sliderPos, static_cast(span),opt.upsideDown); + sliderControl->setSliderPosition(pressValue); + sliderControl->showToolTip(); + break; + } + case Qt::GestureFinished: + case Qt::GestureCanceled: { +#ifdef HB_EFFECTS + if( sliderControl->orientation() == Qt::Horizontal ) { + HbEffect::start(gItem, HB_SLIDERHANDLE_TYPE, "h_thumbrelease"); + } else { + HbEffect::start(gItem, HB_SLIDERHANDLE_TYPE, "v_thumbrelease"); + } +#endif + HbWidgetFeedback::triggered(sliderControl, Hb::InstantReleased, Hb::ModifierSliderHandle); + sliderControl->setSliderDown(false); + QRectF controlRect = sliderControl->sceneBoundingRect(); + if(sliderControl->singleStep() != 0) { + HbWidgetFeedback::continuousStopped(sliderControl, Hb::ContinuousDragged); + } + if( sliderControl->snappingMode()!= HbSliderControl::NoSnapping ){ + sliderControl->updateSliderPosToTick(); + } + updatePrimitives(); + break; + } + default: + break; + } + } + } /*!