src/hbwidgets/sliders/hbsliderhandle.cpp
changeset 7 923ff622b8b9
parent 6 c3690ec91ef8
child 21 4633027730f5
child 34 ed14f46c0e55
--- 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 <hbtapgesture.h>
 #include <hbpangesture.h>
+#include <hbtapandholdgesture.h>
 #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<int>(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<HbTapAndHoldGesture *>(event->gesture(Qt::TapAndHoldGesture))) {
+        if(tapandHold->state() == Qt::GestureStarted) {
+            sliderControl->showToolTip();
+        }
+    }
+    if(HbTapGesture *tap = qobject_cast<HbTapGesture *>(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<HbPanGesture*>(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<int>(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;
+        }
+    }
+
 }
 
 /*!