src/hbplugins/feedback/feedbackeffectplugin/hbfeedbackeffectengine.cpp
changeset 34 ed14f46c0e55
parent 7 923ff622b8b9
--- 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 <hbmainwindow.h>
 #include <hbabstractedit.h>
 #include "hbmenucontainer_p.h"
-#include "hbinputvirtualrocker.h"
 #include <hbnamespace_p.h>
+#include <hbglobal_p.h> // remove with HB_DEPRECATED
+#include <hbratingslider.h>
 
 /*
     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<const HbListViewItem *>(widget)) {
+        const HbAbstractItemView* itemView = listViewItem->itemView();
+        if (const HbListView * listView = qobject_cast<const HbListView *>(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<const HbInputVirtualRocker *>(widget)) {
-            if (trackPoint && trackPoint->mainWindow() && trackPoint->mainWindow()->scene() &&
-                trackPoint->mainWindow()->scene()->focusItem()) {
-
-                QGraphicsItem* graphicsItem = trackPoint->mainWindow()->scene()->focusItem();
-
-                if (graphicsItem->isWidget()) {
-                    if (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 if (static_cast<QGraphicsWidget*>(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>()) {
-                            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<const HbRatingSlider *>(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<const HbAbstractItemView *>(widget)) {
                     feedbackPlayed = true;