src/hbwidgets/sliders/hbslidercontrol.cpp
changeset 1 f7ac710697a9
parent 0 16d8024aca5e
child 2 06ff229162e9
equal deleted inserted replaced
0:16d8024aca5e 1:f7ac710697a9
    36 #include <hbtooltip.h>
    36 #include <hbtooltip.h>
    37 #include <hbwidgetfeedback.h>
    37 #include <hbwidgetfeedback.h>
    38 #include <hbgraphicsscene.h>
    38 #include <hbgraphicsscene.h>
    39 #include <QGraphicsItem>
    39 #include <QGraphicsItem>
    40 #include <QGraphicsSceneMouseEvent>
    40 #include <QGraphicsSceneMouseEvent>
       
    41 #ifdef HB_GESTURE_FW
       
    42 #include "hbtapgesture.h"
       
    43 #include "hbpangesture.h"
       
    44 #endif 
    41 
    45 
    42 #ifdef HB_EFFECTS
    46 #ifdef HB_EFFECTS
    43 #include "hbeffect.h"
    47 #include "hbeffect.h"
    44 #include "hbeffectinternal_p.h"
    48 #include "hbeffectinternal_p.h"
    45 #define HB_SLIDERCONTROL_TYPE "HB_SLIDERCONTROL"
    49 #define HB_SLIDERCONTROL_TYPE "HB_SLIDERCONTROL"
    46 #endif
    50 #endif
       
    51 
    47 
    52 
    48 
    53 
    49 /*!
    54 /*!
    50     private class  
    55     private class  
    51 */
    56 */
    59     progressGroove( 0 ),//progress mask top of groove
    64     progressGroove( 0 ),//progress mask top of groove
    60     tickmarksLeft( 0 ), // slider left/top tick mark item
    65     tickmarksLeft( 0 ), // slider left/top tick mark item
    61     tickmarksRight( 0 ),// slider right/bottom tick mark item
    66     tickmarksRight( 0 ),// slider right/bottom tick mark item
    62     tickmarkslabelLeft( 0 ),// slider left/above tick mark label
    67     tickmarkslabelLeft( 0 ),// slider left/above tick mark label
    63     tickmarkslabelRight ( 0 ),// slider right/bottom tick mark label
    68     tickmarkslabelRight ( 0 ),// slider right/bottom tick mark label
    64     displayCurrValueToolTip( false ), // holds whether to show current value tooltip or not
    69     displayCurrValueToolTip( true ), // holds whether to show current value tooltip or not
    65     toolTipAlignment( Qt::AlignTop|Qt::AlignRight ), // tooltip alignment
    70     toolTipAlignment( Qt::AlignTop|Qt::AlignRight ), // tooltip alignment
    66     groovePressed( false ), // hold whether groove is pressed or not
    71     groovePressed( false ), // hold whether groove is pressed or not
    67     setDefault( false ), // holds whther default value for track press is set
    72     setDefault( false ), // holds whther default value for track press is set
    68     previousValue( 0 ),  // default value for track press
    73     previousValue( 0 ),  // default value for track press
    69     trackHandlingEnable( false ),// this variable holds whether track will be interective or not
    74     trackHandlingEnable( false ),// this variable holds whether track will be interective or not
    93 void HbSliderControlPrivate::init( )
    98 void HbSliderControlPrivate::init( )
    94 {
    99 {
    95     Q_Q( HbSliderControl );
   100     Q_Q( HbSliderControl );
    96    
   101    
    97     q->enableTrackEventHandling( true );
   102     q->enableTrackEventHandling( true );
    98    
   103 #ifdef HB_GESTURE_FW
       
   104     q->grabGesture(Qt::TapGesture);
       
   105     q->grabGesture(Qt::PanGesture,Qt::ReceivePartialGestures);
       
   106     q->setFiltersChildEvents(true) ;
       
   107 #endif    
    99     // creating handle
   108     // creating handle
   100     handle = createHandle();
   109     handle = createHandle();
   101     if(handle) {
   110     if(handle) {
   102         HbStyle::setItemName( handle, "handle" );
   111         HbStyle::setItemName( handle, "handle" );
   103     }
   112     }
   249    This api returns true if pos in on handle rect
   258    This api returns true if pos in on handle rect
   250 */
   259 */
   251 bool HbSliderControlPrivate::onHandle( QPointF pos )
   260 bool HbSliderControlPrivate::onHandle( QPointF pos )
   252 {
   261 {
   253     Q_Q( HbSliderControl );
   262     Q_Q( HbSliderControl );
   254     QRectF handleRect = handle->sceneBoundingRect( );
   263     QRectF handleRect = handle->touchItem->sceneBoundingRect( );
   255     bool result = false;
   264     bool result = false;
   256     switch ( q->orientation( ) ) {
   265     switch ( q->orientation( ) ) {
   257         case Qt::Horizontal:
   266         case Qt::Horizontal:
   258             if ( handleRect.contains( pos.x( ) , handleRect.y( ) ) ) {
   267             if ( handleRect.contains( pos.x( ) , handleRect.y( ) ) ) {
   259                 result = true;
   268                 result = true;
   818 /*!
   827 /*!
   819   reimp
   828   reimp
   820 
   829 
   821 */
   830 */
   822 void HbSliderControl::mousePressEvent( QGraphicsSceneMouseEvent *event )
   831 void HbSliderControl::mousePressEvent( QGraphicsSceneMouseEvent *event )
   823 {   
   832 { 
       
   833 #ifndef HB_GESTURE_FW
   824     Q_D( HbSliderControl );
   834     Q_D( HbSliderControl );
   825     HbAbstractSliderControl::mousePressEvent( event );
   835     HbAbstractSliderControl::mousePressEvent( event );
   826     if ( !d->trackHandlingEnable ) {
   836     if ( !d->trackHandlingEnable ) {
   827         event->ignore( );
   837         event->ignore( );
   828         return;
   838         return;
   914             setSliderPosition( pressValue );
   924             setSliderPosition( pressValue );
   915             triggerAction( SliderMove );
   925             triggerAction( SliderMove );
   916             setRepeatAction( SliderNoAction, pressValue );
   926             setRepeatAction( SliderNoAction, pressValue );
   917         }
   927         }
   918     }
   928     }
       
   929 #else
       
   930     Q_UNUSED(event)
       
   931 #endif
   919     
   932     
   920 }
   933 }
   921 
   934 
   922 /*!
   935 /*!
   923   reimp
   936   reimp
   924 
   937 
   925 */
   938 */
   926 void HbSliderControl::mouseReleaseEvent( QGraphicsSceneMouseEvent *event )
   939 void HbSliderControl::mouseReleaseEvent( QGraphicsSceneMouseEvent *event )
   927 {
   940 {
       
   941 #ifndef HB_GESTURE_FW
   928     HbAbstractSliderControl::mouseReleaseEvent( event );
   942     HbAbstractSliderControl::mouseReleaseEvent( event );
   929     Q_D( HbSliderControl );
   943     Q_D( HbSliderControl );
   930     d->handleMoving = false;
   944     d->handleMoving = false;
   931     if ( !d->trackHandlingEnable ) {
   945     if ( !d->trackHandlingEnable ) {
   932         event->ignore( );
   946         event->ignore( );
   974     }
   988     }
   975     // update handle
   989     // update handle
   976     setSliderDown( false );
   990     setSliderDown( false );
   977     d->handle->updatePrimitives( );
   991     d->handle->updatePrimitives( );
   978     HbToolTip::hideText( qobject_cast<HbGraphicsScene *>( scene( ) ) );
   992     HbToolTip::hideText( qobject_cast<HbGraphicsScene *>( scene( ) ) );
   979 }
   993 #else
       
   994     Q_UNUSED(event);
       
   995 #endif 
       
   996 }
       
   997 
       
   998 
       
   999 #ifdef HB_GESTURE_FW
       
  1000 void HbSliderControl::gestureEvent(QGestureEvent *event)
       
  1001 {
       
  1002     Q_D(HbSliderControl);
       
  1003     if(HbTapGesture *tap = qobject_cast<HbTapGesture *>(event->gesture(Qt::TapGesture))) {
       
  1004             if( d->onHandle( event->mapToGraphicsScene(tap->position( ) ) ) ){
       
  1005                 event->ignore();
       
  1006                 return;
       
  1007             }
       
  1008         switch(tap->state()) {
       
  1009         case Qt::GestureStarted: {
       
  1010             QRectF eventRect = d->grooveTouchArea->sceneBoundingRect( );
       
  1011             if ( !d->trackHandlingEnable  || maximum( ) == minimum( ) || 
       
  1012                 !eventRect.contains( event->mapToGraphicsScene(tap->position( ) ) ) ){
       
  1013                 event->ignore( );
       
  1014                 return;
       
  1015             }
       
  1016             
       
  1017 #if defined( QT_KEYPAD_NAVIGATION ) && !defined( Q_OS_SYMBIAN )
       
  1018             if ( QApplication::keypadNavigationEnabled( ) ) {
       
  1019                 setEditFocus( true );
       
  1020             }
       
  1021 #endif
       
  1022             event->accept( );
       
  1023         // effect
       
  1024 #ifdef HB_EFFECTS
       
  1025             if( orientation( ) == Qt::Horizontal ) {   
       
  1026             // effect for horizontal track press
       
  1027                 HbEffectInternal::add( HB_SLIDERCONTROL_TYPE,"slider_h_trackpress", "h_trackpress" );
       
  1028                 HbEffect::start( d->groove, HB_SLIDERCONTROL_TYPE, "h_trackrpress" );
       
  1029             }
       
  1030             else {
       
  1031                 HbEffectInternal::add( HB_SLIDERCONTROL_TYPE,"slider_v_trackpress", "v_trackpress" );
       
  1032                 HbEffect::start( d->groove, HB_SLIDERCONTROL_TYPE, "v_trackpress" );
       
  1033             }  
       
  1034     
       
  1035 #endif
       
  1036             HbStyleOptionSlider opt;
       
  1037             d->groovePressed = true;
       
  1038             initStyleOption( &opt );
       
  1039             style( )->updatePrimitive( d->groove, HbStyle::P_Slider_groove, &opt );  
       
  1040             HbWidgetFeedback::triggered( this, Hb::InstantPressed );
       
  1041         }
       
  1042         break;
       
  1043         case Qt::GestureFinished:{
       
  1044             if ( !d->trackHandlingEnable ) {
       
  1045                 event->ignore( );
       
  1046                 return;
       
  1047             }
       
  1048             qreal handlePos = 0;
       
  1049             qreal span = 0;
       
  1050             QRectF bounds = boundingRect( );
       
  1051             QRectF handleBounds = d->handle->boundingRect( );
       
  1052             bounds.adjust( 0, 0, -handleBounds.width( ), -handleBounds.height( ) );
       
  1053             QPointF relativePos = mapFromScene( event->mapToGraphicsScene(tap->position( ) ) );
       
  1054             // calculate handle position and span
       
  1055             switch ( orientation( ) ) {
       
  1056                 case Qt::Horizontal:
       
  1057                     handlePos = relativePos.x( ) - handleBounds.width( ) / 2;
       
  1058                     span = bounds.width( );
       
  1059                     break;
       
  1060                 case Qt::Vertical:
       
  1061                     handlePos = relativePos.y( ) - handleBounds.height( ) / 2;
       
  1062                     span = bounds.height( );
       
  1063                     break;
       
  1064                 default:
       
  1065                     break;
       
  1066             }
       
  1067             HbStyleOptionSlider opt;
       
  1068             initStyleOption( &opt );
       
  1069 
       
  1070             int pressValue = QStyle::sliderValueFromPosition( opt.minimum, opt.maximum,
       
  1071                 static_cast<int>( handlePos ),static_cast<int>( span ),opt.upsideDown );
       
  1072 
       
  1073 
       
  1074             // if default is set then dont increment or decrement slider value
       
  1075             // just set default value to slider
       
  1076             setSliderPosition( pressValue );
       
  1077             triggerAction( SliderMove );
       
  1078             setRepeatAction( SliderNoAction, pressValue );
       
  1079             }
       
  1080         case Qt::GestureCanceled: {
       
  1081             if ( d->groovePressed ) {
       
  1082 #ifdef HB_EFFECTS    
       
  1083                 if( orientation( ) == Qt::Horizontal ) {   
       
  1084                     HbEffectInternal::add( HB_SLIDERCONTROL_TYPE,"slider_h_trackrelease", "h_trackrelease" );
       
  1085                     HbEffect::start( d->groove, HB_SLIDERCONTROL_TYPE, "h_trackrelease" );
       
  1086                 }  else {
       
  1087                     HbEffectInternal::add( HB_SLIDERCONTROL_TYPE,"slider_v_trackrelease", "v_trackrelease" );
       
  1088                     HbEffect::start( d->groove, HB_SLIDERCONTROL_TYPE, "v_trackrelease" );
       
  1089                 }    
       
  1090 #endif
       
  1091                 HbStyleOptionSlider opt;
       
  1092                 d->groovePressed = false;
       
  1093                 initStyleOption( &opt );    
       
  1094                 // update primitive from press to normal
       
  1095                 style( )->updatePrimitive( d->groove, HbStyle::P_Slider_groove, &opt );
       
  1096             }
       
  1097         }
       
  1098         default:
       
  1099             break;
       
  1100         }
       
  1101     }
       
  1102     if (HbPanGesture *panGesture = qobject_cast<HbPanGesture*>(event->gesture(Qt::PanGesture))) {
       
  1103         switch(panGesture->state( )) {
       
  1104             case Qt::GestureStarted: 
       
  1105             case Qt::GestureUpdated:{
       
  1106                 QPointF startPoint = event->mapToGraphicsScene(panGesture->offset()+panGesture->startPos( ) );
       
  1107                 if( d->onHandle( startPoint)||isSliderDown( ) ) {
       
  1108                     qreal handlePos = 0;
       
  1109                     qreal span = 0;
       
  1110                     QRectF bounds = boundingRect( );
       
  1111                     QRectF handleBounds = d->handle->boundingRect( );
       
  1112                     bounds.adjust( 0, 0, -handleBounds.width( ), -handleBounds.height( ) );
       
  1113                     QPointF relativePos = mapFromScene( event->mapToGraphicsScene(panGesture->startPos( ) + panGesture->offset()) );
       
  1114                     // calculate handle position and span
       
  1115                     switch ( orientation( ) ) {
       
  1116                         case Qt::Horizontal:
       
  1117                             handlePos = relativePos.x( ) - handleBounds.width( ) / 2;
       
  1118                             span = bounds.width( );
       
  1119                             break;
       
  1120                         case Qt::Vertical:
       
  1121                             handlePos = relativePos.y( ) - handleBounds.height( ) / 2;
       
  1122                             span = bounds.height( );
       
  1123                             break;
       
  1124                         default:
       
  1125                             break;
       
  1126                     }
       
  1127                     HbStyleOptionSlider opt;
       
  1128                     initStyleOption( &opt );
       
  1129 
       
  1130                     int pressValue = QStyle::sliderValueFromPosition( opt.minimum, opt.maximum,
       
  1131                         static_cast<int>( handlePos ),static_cast<int>( span ),opt.upsideDown ); 
       
  1132                     setRepeatAction( SliderNoAction,static_cast<int>( pressValue ) );
       
  1133                     setSliderDown( true );
       
  1134                     setSliderPosition( pressValue );
       
  1135                     showToolTip( );
       
  1136                     d->groovePressed = false;
       
  1137                     updatePrimitives();
       
  1138                     d->handleMoving = true ;
       
  1139                     break;
       
  1140                 } else if(d->grooveTouchArea->sceneBoundingRect().contains(startPoint) ){
       
  1141                     HbStyleOptionSlider opt;
       
  1142                     d->groovePressed = true;
       
  1143                     initStyleOption( &opt );
       
  1144                     style( )->updatePrimitive( d->groove, HbStyle::P_Slider_groove, &opt );  
       
  1145                     HbWidgetFeedback::triggered( this, Hb::InstantPressed );
       
  1146                     event->ignore();
       
  1147                     break;
       
  1148                 }
       
  1149             }
       
  1150             case Qt::GestureFinished:
       
  1151             case Qt::GestureCanceled: {
       
  1152                 setSliderDown( false );
       
  1153                 d->groovePressed = false;
       
  1154                 updatePrimitives( );
       
  1155                 d->handle->updatePrimitives();
       
  1156                 d->handleMoving = false;
       
  1157                 event->ignore();
       
  1158             }
       
  1159             default:
       
  1160                 break;
       
  1161         }
       
  1162     }
       
  1163 
       
  1164   //  HbAbstractSliderControl::gestureEvent(event);
       
  1165 }
       
  1166 #endif
   980 
  1167 
   981 
  1168 
   982 bool HbSliderControl::sceneEventFilter(QGraphicsItem *obj,QEvent *event)
  1169 bool HbSliderControl::sceneEventFilter(QGraphicsItem *obj,QEvent *event)
   983 {
  1170 {
   984     Q_D(HbSliderControl);
  1171     Q_D(HbSliderControl);
   985     if( obj == d->grooveTouchArea) {
  1172     if( obj == d->grooveTouchArea) {
   986         if (!isEnabled() ) {
  1173         if (!isEnabled() ) {
   987             return false;
  1174             return false;
   988         }
  1175         }
   989 	    if (event->type() == QEvent::GraphicsSceneMousePress){
  1176 	    if (event->type() == QEvent::Gesture){
   990 			mousePressEvent((QGraphicsSceneMouseEvent *) event);
  1177             gestureEvent( (QGestureEvent *) (event));
   991              return true;
       
   992 		}
       
   993 		else if (event->type() == QEvent::GraphicsSceneMouseRelease){
       
   994 			mouseReleaseEvent((QGraphicsSceneMouseEvent *) event);
       
   995             return true;
  1178             return true;
   996 		}
  1179         }
   997 	} 
  1180     }
       
  1181     else if ( obj == d->handle) {
       
  1182         event->ignore();
       
  1183     }
   998 	return false;
  1184 	return false;
   999 }
  1185 }
       
  1186 
  1000 
  1187 
  1001 /*!
  1188 /*!
  1002   
  1189   
  1003 */
  1190 */
  1004 void HbSliderControl::releasedOutside( bool outside )
  1191 void HbSliderControl::releasedOutside( bool outside )
  1030 {
  1217 {
  1031 
  1218 
  1032     Q_D( HbSliderControl );
  1219     Q_D( HbSliderControl );
  1033     HbStyleOptionSlider option;
  1220     HbStyleOptionSlider option;
  1034     initStyleOption( &option );
  1221     initStyleOption( &option );
  1035     updatePrimitives( );
       
  1036     HbAbstractSliderControl::polish( params );
  1222     HbAbstractSliderControl::polish( params );
  1037     d->adjustHandle( );
  1223     d->adjustHandle( );
  1038     d->updateTickAndLabel();
  1224     d->updateTickAndLabel();
       
  1225     updatePrimitives( );
       
  1226 
       
  1227 
  1039 }
  1228 }
  1040 
  1229 
  1041 /*!
  1230 /*!
  1042  
  1231  
  1043 */
  1232 */
  1247             } else {
  1436             } else {
  1248                 repolish();
  1437                 repolish();
  1249             }
  1438             }
  1250         break;
  1439         break;
  1251         case ItemSceneHasChanged: {
  1440         case ItemSceneHasChanged: {
  1252             // scene event filter for gestures can be installed
       
  1253             // once the widget has been added to the scene
       
  1254             if(!value.isNull() && d->grooveTouchArea) {
       
  1255                 d->grooveTouchArea->installSceneEventFilter(this);
       
  1256             }
       
  1257             updatePrimitives();
  1441             updatePrimitives();
  1258         }
  1442         }
  1259         break;
  1443         break;
  1260         default:
  1444         default:
  1261             break;
  1445             break;
  1293     }
  1477     }
  1294     if ( d->groove ) {
  1478     if ( d->groove ) {
  1295         style( )->updatePrimitive( d->groove, HbStyle::P_Slider_groove, &opt );
  1479         style( )->updatePrimitive( d->groove, HbStyle::P_Slider_groove, &opt );
  1296     }
  1480     }
  1297 
  1481 
  1298     if ( d->enableProgressTrack ) {
  1482     if( d->progressGroove ) {
  1299         if ( !d->progressGroove ) {
  1483             style( )->updatePrimitive( d->progressGroove, HbStyle::P_Slider_progressgroove, &opt );
  1300             d->progressGroove = d->createProgressGroove();  
  1484     }
  1301             if(d->progressGroove) {
  1485 
  1302                 HbStyle::setItemName( d->progressGroove, "progressgroove");
       
  1303                 repolish();
       
  1304             }  
       
  1305         }
       
  1306         style( )->updatePrimitive( d->progressGroove, HbStyle::P_Slider_progressgroove, &opt );
       
  1307     }else if ( d->progressGroove ) {
       
  1308         delete d->progressGroove;
       
  1309         d->progressGroove = 0 ;
       
  1310     }
       
  1311 }
  1486 }
  1312 
  1487 
  1313 /*!
  1488 /*!
  1314     Sets the current slider position.
  1489     Sets the current slider position.
  1315 
  1490 
  1369         d->grooveTouchArea =  qgraphicsitem_cast<QGraphicsItem*>( style( )->createPrimitive(
  1544         d->grooveTouchArea =  qgraphicsitem_cast<QGraphicsItem*>( style( )->createPrimitive(
  1370             HbStyle::P_SliderElement_touchgroove, this ) );
  1545             HbStyle::P_SliderElement_touchgroove, this ) );
  1371         if ( d->grooveTouchArea ) {
  1546         if ( d->grooveTouchArea ) {
  1372             HbStyle::setItemName( d->grooveTouchArea, "groovetoucharea" );
  1547             HbStyle::setItemName( d->grooveTouchArea, "groovetoucharea" );
  1373         }
  1548         }
  1374         if( scene()) {
  1549         if(QGraphicsObject *touchArea = d->grooveTouchArea->toGraphicsObject()) {
  1375             d->grooveTouchArea->installSceneEventFilter(this);
  1550 
  1376         }
  1551 #ifdef HB_GESTURE_FW
  1377 
  1552             ungrabGesture(Qt::TapGesture);
  1378     }
  1553             ungrabGesture(Qt::PanGesture);
  1379     else if ( d->grooveTouchArea ) {
  1554             touchArea->grabGesture(Qt::TapGesture);
  1380         d->grooveTouchArea->removeSceneEventFilter( this );
  1555             touchArea->grabGesture(Qt::PanGesture,Qt::ReceivePartialGestures);
  1381         delete d->grooveTouchArea;
  1556 #endif 
  1382         d->grooveTouchArea = NULL;
  1557         }
  1383     }
  1558     }
  1384     d->trackHandlingEnable = enable ;
  1559     d->trackHandlingEnable = enable ;
  1385 }
  1560 }
  1386 
  1561 
  1387 /*!
  1562 /*!
  1397 {
  1572 {
  1398     
  1573     
  1399     Q_D( HbSliderControl );
  1574     Q_D( HbSliderControl );
  1400     if ( d->enableProgressTrack != trackVisible ) {
  1575     if ( d->enableProgressTrack != trackVisible ) {
  1401         d->enableProgressTrack = trackVisible;
  1576         d->enableProgressTrack = trackVisible;
  1402         updatePrimitives();        
  1577         if ( d->enableProgressTrack ) {
       
  1578             if ( !d->progressGroove ) {
       
  1579                 d->progressGroove = d->createProgressGroove();  
       
  1580             }
       
  1581             if(d->progressGroove) {
       
  1582                 d->progressGroove->setVisible( true );
       
  1583                 HbStyle::setItemName( d->progressGroove, "progressgroove");
       
  1584             }
       
  1585                    
       
  1586         }else if ( d->progressGroove ) {
       
  1587             d->progressGroove->setVisible( false );
       
  1588             HbStyle::setItemName( d->progressGroove, QString());
       
  1589         }
  1403     }
  1590     }
  1404 
  1591 
  1405 }
  1592 }
  1406 
  1593 
  1407 
  1594