changeset 1 | f7ac710697a9 |
parent 0 | 16d8024aca5e |
child 2 | 06ff229162e9 |
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 |