src/hbplugins/feedback/feedbackeffectplugin/hbfeedbackeffectengine.cpp
changeset 1 f7ac710697a9
parent 0 16d8024aca5e
child 2 06ff229162e9
--- a/src/hbplugins/feedback/feedbackeffectplugin/hbfeedbackeffectengine.cpp	Mon Apr 19 14:02:13 2010 +0300
+++ b/src/hbplugins/feedback/feedbackeffectplugin/hbfeedbackeffectengine.cpp	Mon May 03 12:48:33 2010 +0300
@@ -45,7 +45,7 @@
 /*!
     Constructor
 */
-HbFeedbackEffectEngine::HbFeedbackEffectEngine() : previousCursorPosition(0)
+HbFeedbackEffectEngine::HbFeedbackEffectEngine() : activelyScrollingItemView(0), previousCursorPosition(0)
 {
     // initialize
     HbFeedbackPlayer::instance();
@@ -66,16 +66,202 @@
     boundaryWidgets.clear();
 }
 
+QString HbFeedbackEffectEngine::effectOverrideProperty(Hb::InstantInteraction interaction)
+{
+    QString propertyName;
+    switch (interaction) {
+    case Hb::InstantPressed:
+        propertyName = "pressedFeedbackEffect";
+        break;
+    case Hb::InstantReleased:
+        propertyName = "releasedFeedbackEffect";
+        break;
+    case Hb::InstantClicked:
+        propertyName = "clickedFeedbackEffect";
+        break;
+    case Hb::InstantKeyRepeated:
+        propertyName = "keyRepeatedFeedbackEffect";
+        break;
+    case Hb::InstantLongPressed:
+        propertyName = "longPressedFeedbackEffect";
+        break;
+    case Hb::InstantDraggedOver:
+        propertyName = "draggedOverFeedbackEffect";
+        break;
+    case Hb::InstantFlicked:
+        propertyName = "flickedFeedbackEffect";
+        break;
+    case Hb::InstantPopupOpened:
+        propertyName = "popupOpenedFeedbackEffect";
+        break;
+    case Hb::InstantPopupClosed:
+        propertyName = "popupClosedFeedbackEffect";
+        break;
+    case Hb::InstantBoundaryReached:
+        propertyName = "boundaryReachedFeedbackEffect";
+        break;
+    case Hb::InstantRotated90Degrees:
+        propertyName = "rotated90DegreesFeedbackEffect";
+        break;
+    case Hb::InstantSelectionChanged:
+        propertyName = "selectionChangedFeedbackEffect";
+        break;
+    case Hb::InstantMultitouchActivated:
+        propertyName = "multitouchActivatedFeedbackEffect";
+        break;
+    default:
+        propertyName = "defaultFeedbackEffect";
+        break;
+    }
+    return propertyName;
+}
+
+QString HbFeedbackEffectEngine::effectOverrideProperty(Hb::ContinuousInteraction interaction)
+{
+    QString propertyName;
+    switch (interaction) {
+    case Hb::ContinuousScrolled:
+        propertyName = "scrolledFeedbackEffect";
+        break;
+    case Hb::ContinuousDragged:
+        propertyName = "draggedFeedbackEffect";
+        break;
+    case Hb::ContinuousPinched:
+        propertyName = "pinchedFeedbackEffect";
+        break;
+    case Hb::ContinuousRotated:
+        propertyName = "rotatedFeedbackEffect";
+        break;
+    default:
+        propertyName = "defaultFeedbackEffect";
+        break;
+    }
+    return propertyName;
+}
+
+QString HbFeedbackEffectEngine::modalitiesOverrideProperty(Hb::InstantInteraction interaction)
+{
+    QString propertyName;
+    switch (interaction) {
+    case Hb::InstantPressed:
+        propertyName = "pressedFeedbackModalities";
+        break;
+    case Hb::InstantReleased:
+        propertyName = "releasedFeedbackModalities";
+        break;
+    case Hb::InstantClicked:
+        propertyName = "clickedFeedbackModalities";
+        break;
+    case Hb::InstantKeyRepeated:
+        propertyName = "keyRepeatedFeedbackModalities";
+        break;
+    case Hb::InstantLongPressed:
+        propertyName = "longPressedFeedbackModalities";
+        break;
+    case Hb::InstantDraggedOver:
+        propertyName = "draggedOverFeedbackModalities";
+        break;
+    case Hb::InstantFlicked:
+        propertyName = "flickedFeedbackModalities";
+        break;
+    case Hb::InstantPopupOpened:
+        propertyName = "popupOpenedFeedbackModalities";
+        break;
+    case Hb::InstantPopupClosed:
+        propertyName = "popupClosedFeedbackModalities";
+        break;
+    case Hb::InstantBoundaryReached:
+        propertyName = "boundaryReachedFeedbackModalities";
+        break;
+    case Hb::InstantRotated90Degrees:
+        propertyName = "rotated90DegreesFeedbackModalities";
+        break;
+    case Hb::InstantSelectionChanged:
+        propertyName = "selectionChangedFeedbackModalities";
+        break;
+    case Hb::InstantMultitouchActivated:
+        propertyName = "multitouchActivatedFeedbackModalities";
+        break;
+    default:
+        propertyName = "defaultFeedbackModalities";
+        break;
+    }
+    return propertyName;
+}
+
+QString HbFeedbackEffectEngine::modalitiesOverrideProperty(Hb::ContinuousInteraction interaction)
+{
+    QString propertyName;
+    switch (interaction) {
+    case Hb::ContinuousScrolled:
+        propertyName = "scrolledFeedbackModalities";
+        break;
+    case Hb::ContinuousDragged:
+        propertyName = "draggedFeedbackModalities";
+        break;
+    case Hb::ContinuousPinched:
+        propertyName = "pinchedFeedbackModalities";
+        break;
+    case Hb::ContinuousRotated:
+        propertyName = "rotatedFeedbackModalities";
+        break;
+    default:
+        propertyName = "defaultFeedbackModalities";
+        break;
+    }
+    return propertyName;
+}
+
+
+bool HbFeedbackEffectEngine::widgetOverridesEffect(const HbWidget *widget, Hb::InstantInteraction interaction) {
+    return (widget == overrider.widget && overrider.overridesEffect && overrider.instantInteraction == interaction);
+}
+
+bool HbFeedbackEffectEngine::widgetOverridesEffect(const HbWidget *widget, Hb::ContinuousInteraction interaction) {
+    return (widget == overrider.widget && overrider.overridesEffect && overrider.continuousInteraction == interaction);
+}
+
+bool HbFeedbackEffectEngine::widgetOverridesModalities(const HbWidget *widget,Hb::InstantInteraction interaction) {
+    return (widget == overrider.widget && overrider.overridesModalities && overrider.instantInteraction == interaction);
+}
+
+bool HbFeedbackEffectEngine::widgetOverridesModalities(const HbWidget *widget,Hb::ContinuousInteraction interaction) {
+    return (widget == overrider.widget && overrider.overridesModalities && overrider.continuousInteraction == interaction);
+}
+
+
 /*!
     Called by the feedback manager when an interaction is triggered.
 */
 void HbFeedbackEffectEngine::triggered(const HbWidget *widget, Hb::InstantInteraction interaction, Hb::InteractionModifiers modifiers)
 {
-    HbFeedback::InstantEffect widgetOverride = widget->overrideFeedback(interaction);
-    if (widgetOverride != HbFeedback::NoOverride ) {
-        playInstantFeedback(widget, widgetOverride);
+    
+    overrider.widget = widget;
+    overrider.instantInteraction = interaction;
+    overrider.overridesEffect = false;
+    overrider.overridesModalities = false;
+
+    QString effectProperty = effectOverrideProperty(interaction);
+    QVariant veffect = widget->property(effectProperty.toLatin1());
+    if(veffect.isValid() && veffect.type() == QVariant::Int) {
+        overrider.overridesEffect = true;
+        overrider.newInstantEffect = HbFeedback::InstantEffect(veffect.toInt());
+    }
+    
+    QString modalitiesProperty = modalitiesOverrideProperty(interaction);
+    QVariant vmodalities = widget->property(modalitiesProperty.toLatin1());
+    if(vmodalities.isValid() && vmodalities.type() == QVariant::Int) {
+        overrider.overridesModalities = true;
+        overrider.newModalities = HbFeedback::Modalities(vmodalities.toInt());
+    }
+
+    if(overrider.overridesEffect && overrider.overridesModalities) {
+        // play specified effect via the specified modality
+        playInstantFeedback(widget,overrider.newInstantEffect,overrider.newModalities);
+
     } else {
-        HbFeedbackEngine::triggered(widget, interaction, modifiers);
+        // use default values for unspecified effect/modalities
+        HbFeedbackEngine::triggered(widget,interaction,modifiers);
     }
 }
 
@@ -84,8 +270,23 @@
 */
 void HbFeedbackEffectEngine::pressed(const HbWidget *widget)
 {
-    HbFeedback::InstantEffect effect = HbFeedbackEffectUtils::instantOnPress(widget, modifiers());
-    playInstantFeedback(widget, effect);
+    HbFeedback::InstantEffect effect = HbFeedback::None;
+    HbFeedback::Modalities modalities = 0;
+    Hb::InstantInteraction interaction = Hb::InstantPressed;
+
+    if(widgetOverridesEffect( widget, interaction)) {
+        effect = overrider.newInstantEffect;
+    } else {
+        effect = HbFeedbackEffectUtils::instantOnPress(widget, modifiers());
+    }
+
+    if(widgetOverridesModalities(widget,interaction)) {
+        modalities = overrider.newModalities ;
+    } else  {
+        modalities = HbFeedbackEffectUtils::modalities(widget, Hb::InstantPressed, modifiers());
+    }
+
+    playInstantFeedback(widget, effect, modalities);
 }
 
 /*!
@@ -93,30 +294,52 @@
 */
 void HbFeedbackEffectEngine::released(const HbWidget *widget)
 {
+    HbFeedback::InstantEffect effect = HbFeedback::None;
+    HbFeedback::Modalities modalities = 0;
+    Hb::InstantInteraction interaction = Hb::InstantReleased;
+
     if (continuousFeedbacks.contains(widget)) {
         cancelContinuousFeedback(widget);
     }
-    // slider-like widgets are a bit special
-    if (HbFeedbackEffectUtils::widgetFamily(widget) == HbFeedbackEffectUtils::Slider) {
-        playInstantFeedback(widget, HbFeedbackEffectUtils::instantOnRelease(widget, modifiers()));
-    }
-    // lists in arrange mode react on release
-    else if (const HbListViewItem *listViewItem = qobject_cast<const HbListViewItem *>(widget)) {
-        const HbAbstractItemView* itemView = listViewItem->itemView();
-        if (const HbListView * listView = qobject_cast<const HbListView *>(itemView)) {
-            if( listView->arrangeMode() ) {
-                playInstantFeedback(listViewItem,HbFeedbackEffectUtils::instantOnRelease(listViewItem, modifiers()));
+
+    if(widgetOverridesEffect( widget, interaction)) {
+        effect = overrider.newInstantEffect;
+    } else {
+        // use default effect
+        // slider-like widgets are a bit special
+        if (HbFeedbackEffectUtils::widgetFamily(widget) == HbFeedbackEffectUtils::Slider) {
+            effect = HbFeedbackEffectUtils::instantOnRelease(widget, modifiers()) ;
+        }
+        // lists in arrange mode react on release
+        else if (const HbListViewItem *listViewItem = qobject_cast<const HbListViewItem *>(widget)) {
+            const HbAbstractItemView* itemView = listViewItem->itemView();
+            if (const HbListView * listView = qobject_cast<const HbListView *>(itemView)) {
+                if( listView->arrangeMode() ) {
+                    effect = HbFeedbackEffectUtils::instantOnRelease(listViewItem, modifiers()) ;
+                }
             }
         }
-    } else if (widget->type() == Hb::ItemType_VirtualTrackPoint) {
-        playInstantFeedback(widget, HbFeedback::Editor);
-    } else if (widget->type() == Hb::ItemType_WritingBox) {
-        playInstantFeedback(widget, HbFeedback::Editor);
+        else if (HbFeedbackEffectUtils::widgetFamily(widget) == HbFeedbackEffectUtils::Editor) {
+            effect = HbFeedbackEffectUtils::instantOnRelease(widget, modifiers());
+        } else if (widget->type() == HbPrivate::ItemType_GroupBoxHeadingWidget || widget->type() == Hb::ItemType_ComboBox) {
+            effect = HbFeedbackEffectUtils::instantOnRelease(widget, modifiers()) ;
+        }
+        else if (widget->type() == HbPrivate::ItemType_GroupBoxHeadingWidget
+                 || widget->type() == HbPrivate::ItemType_GroupBoxContentWidget
+                 || widget->type() == HbPrivate::ItemType_DataGroupHeadingWidget
+                 || widget->type() == Hb::ItemType_ComboBox) {
+            effect = HbFeedbackEffectUtils::instantOnRelease(widget, modifiers());
+        }
     }
-    else if (widget->type() == HbPrivate::ItemType_GroupBoxHeadingWidget || widget->type() == Hb::ItemType_ComboBox) {
-        playInstantFeedback(widget, HbFeedbackEffectUtils::instantOnRelease(widget, modifiers()));
+
+    if(widgetOverridesModalities(widget,interaction)) {
+        modalities = overrider.newModalities ;
+    } else  {
+        modalities = HbFeedbackEffectUtils::modalities(widget, Hb::InstantReleased, modifiers());
     }
 
+    playInstantFeedback(widget,effect, modalities);
+
     // normally touch end feedback effect is initiated with a clicked signal
 }
 
@@ -125,9 +348,30 @@
 */
 void HbFeedbackEffectEngine::longPressed(const HbWidget *widget)
 {
-    if (widget->type() == Hb::ItemType_InputCharacterButton) {
-        playInstantFeedback(widget, HbFeedback::SensitiveKeypad);
+    HbFeedback::InstantEffect effect = HbFeedback::None;
+    HbFeedback::Modalities modalities = 0;
+    Hb::InstantInteraction interaction = Hb::InstantLongPressed;
+
+    if(widgetOverridesEffect(widget, interaction)) {
+        effect = overrider.newInstantEffect;
+    } else {
+        effect = HbFeedback::None;
+        if (widget->type() == Hb::ItemType_InputCharacterButton) {
+            effect = HbFeedback::SensitiveKeypad;
+        }
+        else {
+            effect = HbFeedback::LongPress;
+        }
     }
+
+    if(widgetOverridesModalities(widget,interaction)) {
+        modalities = overrider.newModalities ;
+    } else  {
+        modalities = HbFeedbackEffectUtils::modalities(widget, interaction, modifiers());
+    }
+
+    playInstantFeedback(widget, effect, modalities);
+
 }
 
 /*!
@@ -135,10 +379,27 @@
 */
 void HbFeedbackEffectEngine::clicked(const HbWidget *widget)
 {
+    HbFeedback::InstantEffect effect = HbFeedback::None ;
+    HbFeedback::Modalities modalities = 0 ;
+    Hb::InstantInteraction interaction = Hb::InstantClicked;
+
     if (continuousFeedbacks.contains(widget)) {
         cancelContinuousFeedback(widget);
     }
-    playInstantFeedback(widget, HbFeedbackEffectUtils::instantOnRelease(widget, modifiers()));
+
+    if(widgetOverridesEffect( widget, interaction)) {
+        effect = overrider.newInstantEffect;
+    } else {
+        effect = HbFeedbackEffectUtils::instantOnRelease(widget, modifiers());
+    }
+
+    if(widgetOverridesModalities(widget,interaction)) {
+        modalities = overrider.newModalities ;
+    } else  {
+        modalities = HbFeedbackEffectUtils::modalities(widget, interaction, modifiers());
+    }
+
+    playInstantFeedback(widget, effect, modalities);
 }
 
 /*!
@@ -146,7 +407,23 @@
 */
 void HbFeedbackEffectEngine::keyRepeated(const HbWidget *widget)
 {
-    playInstantFeedback(widget, HbFeedbackEffectUtils::instantOnKeyRepeat(widget));
+    HbFeedback::InstantEffect effect = HbFeedback::None ;
+    HbFeedback::Modalities modalities = 0 ;
+    Hb::InstantInteraction interaction = Hb::InstantKeyRepeated;
+
+    if(widgetOverridesEffect( widget, interaction)) {
+        effect = overrider.newInstantEffect;
+    } else {
+        effect = HbFeedbackEffectUtils::instantOnKeyRepeat(widget);
+    }
+
+    if(widgetOverridesModalities(widget,interaction)) {
+        modalities = overrider.newModalities ;
+    } else  {
+        modalities = HbFeedbackEffectUtils::modalities(widget, interaction, modifiers());
+    }
+
+    playInstantFeedback(widget, effect, modalities);
 }
 
 /*!
@@ -154,34 +431,49 @@
 */
 void HbFeedbackEffectEngine::draggedOver(const HbWidget *widget)
 {
-    // For editor highlighting
-    if (const HbAbstractEdit *edit = qobject_cast<const HbAbstractEdit *>(widget)) {
-        if (edit->cursorPosition() != previousCursorPosition) {
-            playInstantFeedback(widget, HbFeedbackEffectUtils::instantOnEditorHighlight(edit, previousCursorPosition));
-            previousCursorPosition = edit->cursorPosition();
+    HbFeedback::InstantEffect effect = HbFeedback::None ;
+    HbFeedback::Modalities modalities = 0 ;
+    Hb::InstantInteraction interaction = Hb::InstantDraggedOver;
+
+    if(widgetOverridesEffect( widget, interaction)) {
+        effect = overrider.newInstantEffect;
+    } else {
+        // For editor highlighting
+        if (const HbAbstractEdit *edit = qobject_cast<const HbAbstractEdit *>(widget)) {
+            if (edit->cursorPosition() != previousCursorPosition) {
+                effect = HbFeedbackEffectUtils::instantOnEditorHighlight(edit, previousCursorPosition) ;
+                previousCursorPosition = edit->cursorPosition();
+            }
         }
-    }
-    else if (const HbInputVirtualRocker *trackPoint = qobject_cast<const HbInputVirtualRocker *>(widget)) {
-        if (trackPoint && trackPoint->mainWindow() && trackPoint->mainWindow()->scene() &&
-            trackPoint->mainWindow()->scene()->focusItem()) {
-            
-            QGraphicsItem* graphicsItem = trackPoint->mainWindow()->scene()->focusItem();
-            
-            if (graphicsItem->isWidget() && 
-                static_cast<QGraphicsWidget*>(graphicsItem)->inherits("HbAbstractEdit")) {
-             
-                if (HbAbstractEdit* edit = static_cast<HbAbstractEdit*>(graphicsItem)) {
-                    if (edit->cursorPosition() != previousCursorPosition) {
-                        playInstantFeedback(widget, HbFeedbackEffectUtils::instantOnEditorHighlight(edit, previousCursorPosition));
-                        previousCursorPosition = edit->cursorPosition();
+        else if (const HbInputVirtualRocker *trackPoint = qobject_cast<const HbInputVirtualRocker *>(widget)) {
+            if (trackPoint && trackPoint->mainWindow() && trackPoint->mainWindow()->scene() &&
+                trackPoint->mainWindow()->scene()->focusItem()) {
+
+                QGraphicsItem* graphicsItem = trackPoint->mainWindow()->scene()->focusItem();
+
+                if (graphicsItem->isWidget() &&
+                    static_cast<QGraphicsWidget*>(graphicsItem)->inherits("HbAbstractEdit")) {
+
+                    if (HbAbstractEdit* edit = static_cast<HbAbstractEdit*>(graphicsItem)) {
+                        if (edit->cursorPosition() != previousCursorPosition) {
+                            effect = HbFeedbackEffectUtils::instantOnEditorHighlight(edit, previousCursorPosition);
+                            previousCursorPosition = edit->cursorPosition();
+                        }
                     }
                 }
             }
+        } else {
+            effect = HbFeedbackEffectUtils::instantOnDrag(widget, modifiers());
         }
     }
-    else {
-        playInstantFeedback(widget, HbFeedbackEffectUtils::instantOnDrag(widget, modifiers()));
+
+    if(widgetOverridesModalities(widget,interaction)) {
+        modalities = overrider.newModalities ;
+    } else  {
+        modalities = HbFeedbackEffectUtils::modalities(widget, interaction, modifiers());
     }
+
+    playInstantFeedback(widget, effect, modalities);
 }
 
 /*!
@@ -189,7 +481,23 @@
 */
 void HbFeedbackEffectEngine::flicked(const HbWidget *widget)
 {
-    playInstantFeedback(widget, HbFeedback::Flick);
+    HbFeedback::InstantEffect effect = HbFeedback::None ;
+    HbFeedback::Modalities modalities = 0 ;
+    Hb::InstantInteraction interaction = Hb::InstantFlicked;
+
+    if(widgetOverridesEffect( widget, interaction)) {
+        effect = overrider.newInstantEffect;
+    } else {
+        effect = HbFeedback::Flick ;
+    }
+
+    if(widgetOverridesModalities(widget,interaction)) {
+        modalities = overrider.newModalities ;
+    } else  {
+        modalities = HbFeedbackEffectUtils::modalities(widget, interaction, modifiers());
+    }
+
+    playInstantFeedback(widget, effect, modalities);
 }
 
 /*!
@@ -205,7 +513,24 @@
 */
 void HbFeedbackEffectEngine::rotated90Degrees(const HbWidget *widget)
 {
-    playInstantFeedback(widget, HbFeedback::RotateStep);
+    HbFeedback::InstantEffect effect = HbFeedback::None ;
+    HbFeedback::Modalities modalities = 0 ;
+    Hb::InstantInteraction interaction = Hb::InstantRotated90Degrees;
+
+    if(widgetOverridesEffect( widget, interaction)) {
+        effect = overrider.newInstantEffect;
+    } else {
+        effect = HbFeedback::RotateStep;
+
+    }
+
+    if(widgetOverridesModalities(widget,interaction)) {
+        modalities = overrider.newModalities ;
+    } else  {
+        modalities = HbFeedbackEffectUtils::modalities(widget, interaction, modifiers());
+    }
+
+    playInstantFeedback(widget, effect, modalities);
 }
 
 /*!
@@ -213,8 +538,21 @@
 */
 void HbFeedbackEffectEngine::popupOpened(const HbWidget *widget)
 {
-    if (HbFeedbackEffectUtils::isFeedbackAllowedForPopup(widget)) {
-        playInstantFeedback(widget, HbFeedback::PopupOpen);
+    HbFeedback::Modalities modalities = 0 ;
+    Hb::InstantInteraction interaction = Hb::InstantPopupOpened;
+
+    if(widgetOverridesModalities(widget,interaction)) {
+        modalities = overrider.newModalities ;
+    } else  {
+        modalities = HbFeedbackEffectUtils::modalities(widget, interaction, modifiers());
+    }
+
+    if(widgetOverridesEffect( widget, interaction)) {
+        playInstantFeedback(widget, overrider.newInstantEffect, modalities);
+    } else {
+        if(HbFeedbackEffectUtils::isFeedbackAllowedForPopup(widget)) {
+            playInstantFeedback(widget, HbFeedback::PopupOpen, modalities);
+        }
     }
 }
 
@@ -223,8 +561,21 @@
 */
 void HbFeedbackEffectEngine::popupClosed(const HbWidget *widget)
 {
-    if (HbFeedbackEffectUtils::isFeedbackAllowedForPopup(widget)) {
-        playInstantFeedback(widget, HbFeedback::PopupClose);
+    HbFeedback::Modalities modalities = 0 ;
+    Hb::InstantInteraction interaction = Hb::InstantPopupClosed;
+
+    if(widgetOverridesModalities(widget,interaction)) {
+        modalities = overrider.newModalities ;
+    } else  {
+        modalities = HbFeedbackEffectUtils::modalities(widget, interaction, modifiers());
+    }
+
+    if(widgetOverridesEffect( widget, interaction)) {
+        playInstantFeedback(widget, overrider.newInstantEffect, modalities);
+    } else {
+        if(HbFeedbackEffectUtils::isFeedbackAllowedForPopup(widget)) {
+            playInstantFeedback(widget, HbFeedback::PopupClose, modalities);
+        }
     }
 }
 
@@ -233,7 +584,23 @@
 */
 void HbFeedbackEffectEngine::selectionChanged(const HbWidget *widget)
 {
-    playInstantFeedback(widget, HbFeedbackEffectUtils::instantOnSelectionChanged(widget));
+    HbFeedback::InstantEffect effect = HbFeedback::None ;
+    HbFeedback::Modalities modalities = 0 ;
+    Hb::InstantInteraction interaction = Hb::InstantSelectionChanged;
+
+    if(widgetOverridesEffect( widget, interaction)) {
+        effect = overrider.newInstantEffect;
+    } else {
+        effect = HbFeedbackEffectUtils::instantOnSelectionChanged(widget, modifiers());
+    }
+
+    if(widgetOverridesModalities(widget,interaction)) {
+        modalities = overrider.newModalities ;
+    } else  {
+        modalities = HbFeedbackEffectUtils::modalities(widget, interaction, modifiers());
+    }
+
+    playInstantFeedback(widget, effect, modalities);
 }
 
 /*!
@@ -241,7 +608,23 @@
 */
 void HbFeedbackEffectEngine::multitouchActivated(const HbWidget *widget)
 {
-    playInstantFeedback(widget, HbFeedback::MultitouchActivate);
+    HbFeedback::InstantEffect effect = HbFeedback::None ;
+    HbFeedback::Modalities modalities = 0 ;
+    Hb::InstantInteraction interaction = Hb::InstantMultitouchActivated;
+
+    if(widgetOverridesEffect( widget, interaction)) {
+        effect = overrider.newInstantEffect;
+    } else {
+        effect = HbFeedback::MultitouchActivate;
+    }
+
+    if(widgetOverridesModalities(widget,interaction)) {
+        modalities = overrider.newModalities ;
+    } else  {
+        modalities = HbFeedbackEffectUtils::modalities(widget, interaction, modifiers());
+    }
+
+    playInstantFeedback(widget, effect, modalities);
 }
 
 /*!
@@ -249,83 +632,119 @@
 */
 void HbFeedbackEffectEngine::continuousTriggered(const HbWidget *widget, Hb::ContinuousInteraction interaction, QPointF delta)
 {
-    bool feedbackPlayed(false);
-    switch(HbFeedbackEffectUtils::widgetFamily(widget))
-    {
-        case HbFeedbackEffectUtils::Slider:
+    HbFeedback::ContinuousEffect effect = HbFeedback::ContinuousNone ;
+    HbFeedback::Modalities modalities = 0 ;
+
+    overrider.widget = widget;
+    overrider.continuousInteraction = interaction;
+    overrider.overridesEffect = false;
+    overrider.overridesModalities = false;
+
+    QString effectProperty = effectOverrideProperty(interaction);
+    QVariant veffect = widget->property(effectProperty.toLatin1());
+    if(veffect.isValid() && veffect.type() == QVariant::Int) {
+        overrider.overridesEffect = true;
+        overrider.newContinuousEffect = HbFeedback::ContinuousEffect(veffect.toInt());
+    }
+
+    QString modalitiesProperty = modalitiesOverrideProperty(interaction);
+    QVariant vmodalities = widget->property(modalitiesProperty.toLatin1());
+    if(vmodalities.isValid() && vmodalities.type() == QVariant::Int) {
+        overrider.overridesModalities = true;
+        overrider.newModalities = HbFeedback::Modalities(vmodalities.toInt());
+    }
+
+    if(widgetOverridesModalities(widget,interaction)) {
+        modalities = overrider.newModalities ;
+    } else  {
+        modalities = HbFeedbackEffectUtils::modalities(widget, interaction, modifiers());
+    }
+
+    if(widgetOverridesEffect( widget, interaction)) {
+        // use overridden effect
+        effect = overrider.newContinuousEffect;
+        int intensity = HbFeedbackEffectUtils::intensity(widget, interaction, delta);
+        playContinuousFeedback(widget, HbFeedback::ContinuousEffect(effect), intensity, modalities);
+        
+    } else {
+        // use default effect
+        bool feedbackPlayed(false);
+
+        switch(HbFeedbackEffectUtils::widgetFamily(widget))
         {
-            if (!HbFeedbackEffectUtils::isSliderMoveContinuous(widget)) {
-                playInstantFeedback(widget, HbFeedback::SensitiveSlider);
-                feedbackPlayed = true;
+        case HbFeedbackEffectUtils::Slider:
+            {
+                if (!HbFeedbackEffectUtils::isSliderMoveContinuous(widget)) {
+                    if(!widgetOverridesModalities(widget,interaction)) {
+                        modalities = HbFeedback::Audio | HbFeedback::Tactile;
+                    }
+                    playInstantFeedback(widget, HbFeedback::SensitiveSlider, modalities);
+                    feedbackPlayed = true;
+                }
+                break;
             }
-            break;
-        }
         case HbFeedbackEffectUtils::List:
         case HbFeedbackEffectUtils::Grid:
-        {
-            if (interaction == Hb::ContinuousScrolled) {
-                 if (const HbAbstractItemView * itemView = qobject_cast<const HbAbstractItemView *>(widget)) {
-                     feedbackPlayed = true;
-                     QList<HbAbstractViewItem *> visibleItems = itemView->visibleItems();
-                     bool newItemFound(false);
-                     int index(-1);
-                     QList<int> visibleIndexes;
-                     if (widget == activelyScrollingItemView) {
-                         foreach (HbAbstractViewItem * item, visibleItems) {
-                             index = item->modelIndex().row();
-                             if (!oldVisibleIndexes.contains(index)) {
-                                 newItemFound = true;
-                             }
-                             visibleIndexes.append(index);
-                         }
-                     }
-                     if (widget != activelyScrollingItemView){
-                         activelyScrollingItemView = widget;
-                         newItemFound = false;
-                     }
-                     oldVisibleIndexes.clear();
-                     oldVisibleIndexes = visibleIndexes;
-
-                    if (newItemFound) {
-                        const HbListView* listView = qobject_cast<const HbListView*>(widget);
-                        if (!(  listView &&
-                                listView->arrangeMode() &&
-                                listView->draggedItem())){
-                            playInstantFeedback(widget, HbFeedback::ItemScroll);
+            {
+                if (interaction == Hb::ContinuousScrolled) {
+                    if (const HbAbstractItemView * itemView = qobject_cast<const HbAbstractItemView *>(widget)) {
+                        feedbackPlayed = true;
+                        QList<HbAbstractViewItem *> visibleItems = itemView->visibleItems();
+                        bool newItemFound(false);
+                        int index(-1);
+                        QList<int> visibleIndexes;
+                        if (widget == activelyScrollingItemView) {
+                            foreach (HbAbstractViewItem * item, visibleItems) {
+                                index = item->modelIndex().row();
+                                if (!oldVisibleIndexes.contains(index)) {
+                                    newItemFound = true;
+                                }
+                                visibleIndexes.append(index);
+                            }
+                        }
+                        if (widget != activelyScrollingItemView){
+                            activelyScrollingItemView = widget;
+                            newItemFound = false;
+                        }
+                        oldVisibleIndexes.clear();
+                        oldVisibleIndexes = visibleIndexes;
+                        
+                        if (newItemFound) {
+                            const HbListView* listView = qobject_cast<const HbListView*>(widget);
+                            if (!(  listView &&
+                                    listView->arrangeMode() &&
+                                    listView->draggedItem())){
+                                if(!widgetOverridesModalities(widget,interaction)) {
+                                    modalities = HbFeedback::Audio | HbFeedback::Tactile;
+                                }
+                                playInstantFeedback(widget, HbFeedback::ItemScroll, modalities);
+                            }
                         }
                     }
-                 }
-             }
-            break;
-        }
+                }
+                break;
+            }
         default:
-        {
-            break;
-        }
-    }
-
-    if (interaction == Hb::ContinuousScrolled) {
-        // menu widget does scroll feedback elsewhere
-        if (widget->type() == HbPrivate::ItemType_MenuListView) {
-            feedbackPlayed = true;
+            {
+                break;
+            }
         }
-
-        // generic scroll areas don't emit continuous feedback
-        if (const HbScrollArea* scrollArea = qobject_cast<const HbScrollArea *>(widget)) {
-            Q_UNUSED(scrollArea)
-            feedbackPlayed = true;
+        
+        if (interaction == Hb::ContinuousScrolled) {
+            // menu widget does scroll feedback elsewhere
+            if (widget->type() == HbPrivate::ItemType_MenuListView) {
+                feedbackPlayed = true;
+            }
+            
+            // generic scroll areas don't emit continuous feedback
+            if (const HbScrollArea* scrollArea = qobject_cast<const HbScrollArea *>(widget)) {
+                Q_UNUSED(scrollArea)
+                feedbackPlayed = true;
+            }
         }
-    }
-
-    if (!feedbackPlayed) {
-        int intensity = HbFeedbackEffectUtils::intensity(widget, interaction, delta);
-
-        // Check if the widget has overriden feedback for this interaction
-        HbFeedback::ContinuousEffect widgetOverride = widget->overrideContinuousFeedback(interaction, &intensity) ;
-        if (widgetOverride != HbFeedback::NoContinuousOverride) {
-            playContinuousFeedback(widget, widgetOverride, intensity);
-        } else {
-            playContinuousFeedback(widget, HbFeedbackEffectUtils::continuousEffect(widget, interaction), intensity);
+        if (!feedbackPlayed) {
+            int intensity = HbFeedbackEffectUtils::intensity(widget, interaction, delta);
+            playContinuousFeedback(widget, HbFeedbackEffectUtils::continuousEffect(widget, interaction), intensity, modalities);
 
         }
     }
@@ -336,35 +755,50 @@
 */
 void HbFeedbackEffectEngine::continuousStopped(const HbWidget *widget, Hb::ContinuousInteraction interaction)
 {
-    // determine if instant feedback should be played when a continuous interaction is stopped
     HbFeedback::InstantEffect effect = HbFeedback::None;
-    if (boundaryWidgets.contains(widget)) {
-        if (interaction == Hb::ContinuousScrolled) {
-            effect = HbFeedback::BounceEffect;
-        }
-        boundaryWidgets.removeAll(widget);
+    HbFeedback::Modalities modalities = 0;
+
+    if(widgetOverridesModalities(widget,interaction)) {
+        modalities = overrider.newModalities ;
+    } else  {
+        modalities = HbFeedback::Tactile;
     }
 
-    // stop ongoing continuous and list scrolling feedback effects
-    if (continuousFeedbacks.contains(widget)) {
-       cancelContinuousFeedback(widget);
+    if(widgetOverridesEffect( widget, interaction)) {
+        effect = overrider.newInstantEffect;
+        playInstantFeedback(widget, overrider.newInstantEffect, modalities);
+    } else {
+        // determine if instant feedback should be played when a continuous interaction is stopped
+        effect = HbFeedback::None;
+        if (boundaryWidgets.contains(widget)) {
+            if (interaction == Hb::ContinuousScrolled) {
+                effect = HbFeedback::BounceEffect;
+            }
+            boundaryWidgets.removeAll(widget);
+        }
+
+        // stop ongoing continuous and list scrolling feedback effects
+        if (continuousFeedbacks.contains(widget)) {
+            cancelContinuousFeedback(widget);
+        }
+        if (activelyScrollingItemView == widget) {
+            activelyScrollingItemView = 0;
+        }
+        playInstantFeedback(widget, effect, modalities);
     }
-    if (activelyScrollingItemView == widget) {
-        activelyScrollingItemView = 0;
-    }
-    playInstantFeedback(widget, effect);
 }
 
 /*!
     Plays the instant feedback.
 */
-void HbFeedbackEffectEngine::playInstantFeedback(const HbWidget* widget, HbFeedback::InstantEffect effect)
+void HbFeedbackEffectEngine::playInstantFeedback(const HbWidget* widget, HbFeedback::InstantEffect effect, HbFeedback::Modalities modalities)
 {
     const QGraphicsView* view = widget->mainWindow();
     if (view && HbFeedbackEffectUtils::isFeedbackAllowed(widget)) {
         HbInstantFeedback feedback(effect);
         feedback.setRect(widget, view);
         feedback.setOwningWindow(view);
+        feedback.setModalities(modalities);
 
         if (hbFeedbackPlayer && feedback.isLocated()) {
             hbFeedbackPlayer->playInstantFeedback(feedback);
@@ -375,13 +809,14 @@
 /*!
     Plays the continuous feedback.
 */
-void HbFeedbackEffectEngine::playContinuousFeedback(const HbWidget* widget, HbFeedback::ContinuousEffect effect, int intensity)
+void HbFeedbackEffectEngine::playContinuousFeedback(const HbWidget* widget, HbFeedback::ContinuousEffect effect, int intensity, HbFeedback::Modalities modalities)
 {
     const QGraphicsView* view = widget->mainWindow();
     if (view && HbFeedbackEffectUtils::isFeedbackAllowed(widget)) {
         HbContinuousFeedback feedback(effect,view);
         feedback.setRect(widget, view);
         feedback.setIntensity(intensity);
+        feedback.setModalities(modalities);
 
         if (hbFeedbackPlayer && feedback.isLocated()) {
             // if continuous feedback is still active and not stopped by continuous feedback timeout