diff -r 7516d6d86cf5 -r ed14f46c0e55 src/hbplugins/feedback/feedbackeffectplugin/hbfeedbackeffectengine.cpp --- a/src/hbplugins/feedback/feedbackeffectplugin/hbfeedbackeffectengine.cpp Mon Oct 04 17:49:30 2010 +0300 +++ b/src/hbplugins/feedback/feedbackeffectplugin/hbfeedbackeffectengine.cpp Mon Oct 18 18:23:13 2010 +0300 @@ -38,8 +38,9 @@ #include #include #include "hbmenucontainer_p.h" -#include "hbinputvirtualrocker.h" #include +#include // remove with HB_DEPRECATED +#include /* Constructor @@ -57,7 +58,9 @@ if(instantFeedback) delete instantFeedback; foreach(HbContinuousFeedback *feedback, continuousFeedbacks) { - feedback->stop(); + // This implementation expects the platform to stop the feedback on application exit. + // At this point the winId might not point to an active window, so cancelling + // the ongoing continuous feedbacks could lead to application crash. delete feedback; } @@ -105,8 +108,8 @@ case Hb::InstantSelectionChanged: propertyName = "selectionChangedFeedbackEffect"; break; - case Hb::InstantMultitouchActivated: - propertyName = "multitouchActivatedFeedbackEffect"; + case Hb::InstantAdvancedGestureActivated: + propertyName = "advancedGestureActivatedFeedbackEffect"; break; default: propertyName = "defaultFeedbackEffect"; @@ -178,8 +181,8 @@ case Hb::InstantSelectionChanged: propertyName = "selectionChangedFeedbackModalities"; break; - case Hb::InstantMultitouchActivated: - propertyName = "multitouchActivatedFeedbackModalities"; + case Hb::InstantAdvancedGestureActivated: + propertyName = "advancedGestureActivatedFeedbackModalities"; break; default: propertyName = "defaultFeedbackModalities"; @@ -388,12 +391,26 @@ cancelContinuousFeedback(widget); } - if(widgetOverridesEffect( widget, interaction)) { + if(widgetOverridesEffect(widget, interaction)) { effect = overrider.newInstantEffect; - } else { + } + else { effect = HbFeedbackEffectUtils::instantOnRelease(widget, modifiers()); } + // Lists in arrange mode do not react on click + if (const HbListViewItem *listViewItem = qobject_cast(widget)) { + const HbAbstractItemView* itemView = listViewItem->itemView(); + if (const HbListView * listView = qobject_cast(itemView)) { + if(listView->arrangeMode()) { + effect = HbFeedback::None; + } + } + } + else if (widget->type() == HbPrivate::ItemType_IndicatorButton) { + effect = HbFeedback::None; + } + if(widgetOverridesModalities(widget,interaction)) { modalities = overrider.newModalities ; } else { @@ -445,37 +462,6 @@ effect = HbFeedbackEffectUtils::instantOnEditorHighlight(edit, previousCursorPosition) ; previousCursorPosition = edit->cursorPosition(); } - } - else if (const HbInputVirtualRocker *trackPoint = qobject_cast(widget)) { - if (trackPoint && trackPoint->mainWindow() && trackPoint->mainWindow()->scene() && - trackPoint->mainWindow()->scene()->focusItem()) { - - QGraphicsItem* graphicsItem = trackPoint->mainWindow()->scene()->focusItem(); - - if (graphicsItem->isWidget()) { - if (static_cast(graphicsItem)->inherits("HbAbstractEdit")) { - if (HbAbstractEdit* edit = static_cast(graphicsItem)) { - if (edit->cursorPosition() != previousCursorPosition) { - effect = HbFeedbackEffectUtils::instantOnEditorHighlight(edit, previousCursorPosition); - previousCursorPosition = edit->cursorPosition(); - } - } - } - else if (static_cast(graphicsItem)->inherits("QGraphicsWebView") ) - { - // This takes care of the case when the track point is used on a QGraphicsWebView (for e.g. cWRT) - QVariant v; - v = graphicsItem->scene()->inputMethodQuery( Qt::ImCursorPosition ); - if ( v.isValid() && v.canConvert()) { - int currentCursorPosition = v.toInt(); - if (currentCursorPosition != previousCursorPosition) { - effect = HbFeedbackEffectUtils::instantOnEditorHighlight(trackPoint, previousCursorPosition); - previousCursorPosition = currentCursorPosition; - } - } - } - } - } } else { effect = HbFeedbackEffectUtils::instantOnDrag(widget, modifiers()); } @@ -621,18 +607,18 @@ } /* - Called by the feedback manager when multitouch is activated. + Called by the feedback manager when a touch gesture with more than one finger is detected. */ -void HbFeedbackEffectEngine::multitouchActivated(const HbWidget *widget) +void HbFeedbackEffectEngine::advancedGestureActivated(const HbWidget *widget) { HbFeedback::InstantEffect effect = HbFeedback::None ; HbFeedback::Modalities modalities = 0 ; - Hb::InstantInteraction interaction = Hb::InstantMultitouchActivated; + Hb::InstantInteraction interaction = Hb::InstantAdvancedGestureActivated; if(widgetOverridesEffect( widget, interaction)) { effect = overrider.newInstantEffect; } else { - effect = HbFeedback::MultitouchActivate; + effect = HbFeedback::AdvancedGestureActivate; } if(widgetOverridesModalities(widget,interaction)) { @@ -691,10 +677,19 @@ { case HbFeedbackEffectUtils::Slider: { - if (!HbFeedbackEffectUtils::isSliderMoveContinuous(widget)) { - if(!widgetOverridesModalities(widget,interaction)) { - modalities = HbFeedback::Audio | HbFeedback::Tactile; + if(!widgetOverridesModalities(widget,interaction)) { + modalities = HbFeedback::Audio | HbFeedback::Tactile; + } + + if (const HbRatingSlider *ratingSlider = qobject_cast(widget)) { + int sliderValue = ratingSlider->currentRating(); + if (sliderValue != previousSliderValue) { + playInstantFeedback(widget, HbFeedback::SensitiveSlider, modalities); } + previousSliderValue = sliderValue; + feedbackPlayed = true; + } + else if (!HbFeedbackEffectUtils::isSliderMoveContinuous(widget)) { playInstantFeedback(widget, HbFeedback::SensitiveSlider, modalities); feedbackPlayed = true; } @@ -711,7 +706,10 @@ if (widget->type() == HbPrivate::ItemType_MenuListView) { feedbackPlayed = true; } - if(widget->type() == Hb::ItemType_TumbleView) + if(widget->type() == Hb::ItemType_TumbleView + // The condition below should be a temporary fix until the date picker widget returns a + // more specific item type that the current ItemType_HbWidget + || QString(widget->metaObject()->className()) == "HbDatePickerView") { if (const HbAbstractItemView * itemView = qobject_cast(widget)) { feedbackPlayed = true;