src/hbwidgets/sliders/hbsliderhandle.cpp
changeset 34 ed14f46c0e55
parent 7 923ff622b8b9
equal deleted inserted replaced
31:7516d6d86cf5 34:ed14f46c0e55
    24 ****************************************************************************/
    24 ****************************************************************************/
    25 
    25 
    26 #include "hbsliderhandle_p.h"
    26 #include "hbsliderhandle_p.h"
    27 #include "hbslidercontrol_p.h"
    27 #include "hbslidercontrol_p.h"
    28 #include "hbslidercontrol_p_p.h"
    28 #include "hbslidercontrol_p_p.h"
       
    29 #include "hbstyle_p.h"
    29 #include <hbwidgetfeedback.h>
    30 #include <hbwidgetfeedback.h>
    30 #include <hbstyle.h>
    31 #include <hbstyle.h>
    31 #include <hbstyleoptionslider_p.h>
    32 #include <hbstyleoptionslider_p.h>
    32 #include <QGraphicsSceneMouseEvent>
    33 #include <QGraphicsSceneMouseEvent>
    33 #include <QGraphicsScene>
    34 #include <QGraphicsScene>
    60     handleDragPos(0),
    61     handleDragPos(0),
    61     touchItem(0),
    62     touchItem(0),
    62     mHandleItem(0)
    63     mHandleItem(0)
    63 {
    64 {
    64     // create handle icon item
    65     // create handle icon item
    65     gItem = slider->style()->createPrimitive(HbStyle::P_Slider_thumb, this); 
    66     gItem = HbStylePrivate::createPrimitive(HbStylePrivate::P_Slider_thumb, this); 
    66     HbStyle::setItemName(gItem , "icon");
    67     HbStyle::setItemName(gItem , "icon");
    67     setFiltersChildEvents(true) ;
    68     setFiltersChildEvents(true) ;
    68 
    69 
    69     // create touch area for handle
    70     // create touch area for handle
    70     touchItem = slider->style()->createPrimitive(HbStyle::P_SliderElement_touchhandle, this); 
    71     touchItem = HbStylePrivate::createPrimitive(HbStylePrivate::P_SliderElement_touchhandle, this); 
    71     HbStyle::setItemName(touchItem , "toucharea");
    72     HbStyle::setItemName(touchItem , "toucharea");
    72 
    73 
    73     setZValue(slider->zValue() + 1);
    74     setZValue(slider->zValue() + 1);
    74 #ifdef HB_GESTURE_FW    
    75 #ifdef HB_GESTURE_FW    
    75     grabGesture(Qt::TapGesture);
    76     grabGesture(Qt::TapGesture);
   104 /*!
   105 /*!
   105     Destroys the slider handle.
   106     Destroys the slider handle.
   106 */
   107 */
   107 HbSliderHandle::~HbSliderHandle()
   108 HbSliderHandle::~HbSliderHandle()
   108 {
   109 {
   109 	if(mHandleItem) {
   110     if(mHandleItem) {
   110 		mHandleItem->removeSceneEventFilter(this);
   111         mHandleItem->removeSceneEventFilter(this);
   111 	}
   112     }
   112 }
   113 }
   113 
   114 
   114 
   115 
   115 /*!
   116 /*!
   116   reimp
   117   reimp
   131     HbStyleOptionSlider opt;
   132     HbStyleOptionSlider opt;
   132     sliderControl->initStyleOption(&opt);
   133     sliderControl->initStyleOption(&opt);
   133     if( scene()){
   134     if( scene()){
   134         if (true == sliderControl->isSliderDown()){
   135         if (true == sliderControl->isSliderDown()){
   135             opt.state |= QStyle::State_Sunken;
   136             opt.state |= QStyle::State_Sunken;
   136             sliderControl->style()->updatePrimitive(
   137             HbStylePrivate::updatePrimitive(
   137                 sliderControl->primitive(HbStyle::P_Slider_groove), HbStyle::P_Slider_groove, &opt);
   138                 sliderControl->primitive((HbStyle::Primitive)HbStylePrivate::P_Slider_groove), HbStylePrivate::P_Slider_groove, &opt);
   138           } else {
   139           } else {
   139             opt.state &= ~QStyle::State_Sunken;
   140             opt.state &= ~QStyle::State_Sunken;
   140         } 
   141         } 
   141     } else {
   142     } else {
   142         opt.state &= ~QStyle::State_Sunken;
   143         opt.state &= ~QStyle::State_Sunken;
   143     }
   144     }
   144 
   145 
   145     opt.boundingRect=boundingRect();
   146     opt.boundingRect=boundingRect();
   146     sliderControl->style()->updatePrimitive(gItem, HbStyle::P_Slider_thumb, &opt); 
   147     HbStylePrivate::updatePrimitive(gItem, HbStylePrivate::P_Slider_thumb, &opt); 
   147 }
   148 }
   148 
   149 
   149 void HbSliderHandle::setHandleItem(QGraphicsItem *item)
   150 void HbSliderHandle::setHandleItem(QGraphicsItem *item)
   150 {
   151 {
   151 	if(!item) {
   152     if(!item) {
   152 		return;
   153         return;
   153 	}
   154     }
   154 	if(mHandleItem) {
   155     if(mHandleItem) {
   155 		delete mHandleItem;
   156         delete mHandleItem;
   156         mHandleItem =0;
   157         mHandleItem =0;
   157 	}
   158     }
   158 
   159 
   159     setHandlesChildEvents(false);
   160     setHandlesChildEvents(false);
   160 
   161 
   161     mHandleItem = item;  
   162     mHandleItem = item;  
   162 	mHandleItem->setParentItem(this);
   163     mHandleItem->setParentItem(this);
   163 	sliderControl->style()->setItemName(mHandleItem,"widget");
   164     HbStyle::setItemName(mHandleItem,"widget");
   164     //((QGraphicsWidget*)mHandleItem)->setGeometry(gItem->geometry());//TODO:geometry from css
   165     //((QGraphicsWidget*)mHandleItem)->setGeometry(gItem->geometry());//TODO:geometry from css
   165 
   166 
   166     if(scene()) {
   167     if(scene()) {
   167         mHandleItem->removeSceneEventFilter(this);
   168         mHandleItem->removeSceneEventFilter(this);
   168         mHandleItem->installSceneEventFilter(this);
   169         mHandleItem->installSceneEventFilter(this);
   191     }
   192     }
   192 }
   193 }
   193 bool HbSliderHandle::sceneEventFilter(QGraphicsItem *obj,QEvent *event)
   194 bool HbSliderHandle::sceneEventFilter(QGraphicsItem *obj,QEvent *event)
   194 {
   195 {
   195     //TODO: touch area does not work with the current filtering mechanism. find better solution
   196     //TODO: touch area does not work with the current filtering mechanism. find better solution
   196 	if( obj == mHandleItem) {
   197     if( obj == mHandleItem) {
   197         if(event->type() == QEvent::GraphicsSceneMouseMove){
   198         if(event->type() == QEvent::GraphicsSceneMouseMove){
   198             mouseMoveEvent ((QGraphicsSceneMouseEvent *) event) ;
   199             mouseMoveEvent ((QGraphicsSceneMouseEvent *) event) ;
   199             return true;
   200             return true;
   200         } else if (event->type() == QEvent::GraphicsSceneMousePress){
   201         } else if (event->type() == QEvent::GraphicsSceneMousePress){
   201             mousePressEvent((QGraphicsSceneMouseEvent *) event);
   202             mousePressEvent((QGraphicsSceneMouseEvent *) event);
   202             return true;
   203             return true;
   203         } else if (event->type() == QEvent::GraphicsSceneMouseRelease){
   204         } else if (event->type() == QEvent::GraphicsSceneMouseRelease){
   204             mouseReleaseEvent((QGraphicsSceneMouseEvent *) event);
   205             mouseReleaseEvent((QGraphicsSceneMouseEvent *) event);
   205             return true;
   206             return true;
   206         }
   207         }
   207 	} 
   208     } 
   208     if( obj == touchItem ) {
   209     if( obj == touchItem ) {
   209         if (!isEnabled() ) {
   210         if (!isEnabled() ) {
   210             return false;
   211             return false;
   211         }
   212         }
   212 	    if (event->type() == QEvent::Gesture){
   213         if (event->type() == QEvent::Gesture){
   213             gestureEvent( (QGestureEvent *) (event));
   214             gestureEvent( (QGestureEvent *) (event));
   214             return true;
   215             return true;
   215         }
   216         }
   216     }
   217     }
   217     return false;
   218     return false;
   345 */
   346 */
   346 void HbSliderHandle::gestureEvent(QGestureEvent *event)
   347 void HbSliderHandle::gestureEvent(QGestureEvent *event)
   347 { 
   348 { 
   348     if(HbTapAndHoldGesture *tapandHold= qobject_cast<HbTapAndHoldGesture *>(event->gesture(Qt::TapAndHoldGesture))) {
   349     if(HbTapAndHoldGesture *tapandHold= qobject_cast<HbTapAndHoldGesture *>(event->gesture(Qt::TapAndHoldGesture))) {
   349         if(tapandHold->state() == Qt::GestureStarted) {
   350         if(tapandHold->state() == Qt::GestureStarted) {
       
   351             sliderControl->setToolTip(QString::number(sliderControl->sliderPosition()));
   350             sliderControl->showToolTip();
   352             sliderControl->showToolTip();
   351         }
   353         }
   352     }
   354     }
   353     if(HbTapGesture *tap = qobject_cast<HbTapGesture *>(event->gesture(Qt::TapGesture))) {
   355     if(HbTapGesture *tap = qobject_cast<HbTapGesture *>(event->gesture(Qt::TapGesture))) {
   354         switch(tap->state()) {
   356         switch(tap->state()) {
   412                     HbEffect::start(gItem, HB_SLIDERHANDLE_TYPE, "h_outofbound");
   414                     HbEffect::start(gItem, HB_SLIDERHANDLE_TYPE, "h_outofbound");
   413                 }
   415                 }
   414 #endif
   416 #endif
   415                 sliderBounds.adjust(0, 0, -handleBounds.width(), 0);
   417                 sliderBounds.adjust(0, 0, -handleBounds.width(), 0);
   416                 span = sliderBounds.width();
   418                 span = sliderBounds.width();
   417                 sliderPos = relativePos.rx();
   419                 sliderPos = static_cast<int>(relativePos.x());
   418                 sliderPos-=handleBounds.width()/2;
   420                 sliderPos-= static_cast<int>(handleBounds.width()/2);
   419             } else {
   421             } else {
   420 #ifdef HB_EFFECTS
   422 #ifdef HB_EFFECTS
   421                 if( sliderBounds.topLeft().y() > relativePos.ry() ||
   423                 if( sliderBounds.topLeft().y() > relativePos.ry() ||
   422                     sliderBounds.bottomRight().y() < relativePos.ry()) {
   424                     sliderBounds.bottomRight().y() < relativePos.ry()) {
   423                     HbEffect::start(gItem, HB_SLIDERHANDLE_TYPE, "v_outofbound");
   425                     HbEffect::start(gItem, HB_SLIDERHANDLE_TYPE, "v_outofbound");
   424                 }
   426                 }
   425 #endif
   427 #endif
   426                 sliderBounds.adjust(0, 0, 0, -handleBounds.height());
   428                 sliderBounds.adjust(0, 0, 0, -handleBounds.height());
   427                 span = sliderBounds.height();
   429                 span = sliderBounds.height();
   428                 sliderPos = relativePos.ry();
   430                 sliderPos = static_cast<int>(relativePos.y());
   429                 sliderPos -=  handleBounds.height() / 2;
   431                 sliderPos -= static_cast<int>(handleBounds.height()/2);
   430                     
   432                     
   431             }
   433             }
   432             int pressValue= QStyle::sliderValueFromPosition(opt.minimum, opt.maximum,
   434             int pressValue= QStyle::sliderValueFromPosition(opt.minimum, opt.maximum,
   433                 sliderPos, static_cast<int>(span),opt.upsideDown);
   435                 sliderPos, static_cast<int>(span),opt.upsideDown);
   434             sliderControl->setSliderPosition(pressValue);
   436             sliderControl->setSliderPosition(pressValue);
       
   437             sliderControl->setToolTip(QString::number(pressValue));
   435             sliderControl->showToolTip();
   438             sliderControl->showToolTip();
   436             break;
   439             break;
   437         }
   440         }
   438         case Qt::GestureFinished:
   441         case Qt::GestureFinished:
   439         case Qt::GestureCanceled: {
   442         case Qt::GestureCanceled: {
   472     HbStyleOptionSlider opt;
   475     HbStyleOptionSlider opt;
   473     sliderControl->initStyleOption(&opt);
   476     sliderControl->initStyleOption(&opt);
   474     if( scene()){
   477     if( scene()){
   475         if (true == sliderControl->isSliderDown()){
   478         if (true == sliderControl->isSliderDown()){
   476             opt.state |= QStyle::State_Sunken;
   479             opt.state |= QStyle::State_Sunken;
   477             sliderControl->style()->updatePrimitive(
   480             HbStylePrivate::updatePrimitive(
   478                 sliderControl->primitive(HbStyle::P_Slider_groove), HbStyle::P_Slider_groove, &opt);
   481                 sliderControl->primitive((HbStyle::Primitive)HbStylePrivate::P_Slider_groove), HbStylePrivate::P_Slider_groove, &opt);
   479         } else {
   482         } else {
   480             opt.state &= ~QStyle::State_Sunken;
   483             opt.state &= ~QStyle::State_Sunken;
   481         } 
   484         } 
   482     } else {
   485     } else {
   483         opt.state &= ~QStyle::State_Sunken;
   486         opt.state &= ~QStyle::State_Sunken;
   484     }
   487     }
   485 
   488 
   486     opt.boundingRect=boundingRect();
   489     opt.boundingRect=boundingRect();
   487     sliderControl->style()->updatePrimitive(gItem, HbStyle::P_Slider_thumb, &opt); 
   490     HbStylePrivate::updatePrimitive(gItem, HbStylePrivate::P_Slider_thumb, &opt); 
   488     sliderControl->style()->updatePrimitive(touchItem , HbStyle::P_SliderElement_touchhandle ,&opt);
   491     HbStylePrivate::updatePrimitive(touchItem , HbStylePrivate::P_SliderElement_touchhandle ,&opt);
   489     sliderControl->update(boundingRect());
   492     sliderControl->update(boundingRect());
   490 }
   493 }
   491 
   494 
   492 /*!
   495 /*!
   493   reimp
   496   reimp
   494 
   497 
   495 */
   498 */
   496 QGraphicsItem * HbSliderHandle::primitive(HbStyle::Primitive primitive) const
   499 QGraphicsItem * HbSliderHandle::primitive(HbStyle::Primitive primitive) const
   497  {
   500  {
   498        switch (primitive) {
   501        switch (primitive) {
   499         case HbStyle::P_Slider_thumb:
   502         case HbStylePrivate::P_Slider_thumb:
   500             return gItem;
   503             return gItem;
   501         case HbStyle::P_SliderElement_touchhandle:
   504         case HbStylePrivate::P_SliderElement_touchhandle:
   502             return touchItem;
   505             return touchItem;
   503         default:
   506         default:
   504             return NULL;
   507             return NULL;
   505     }
   508     }
   506  }
   509  }