src/hbplugins/feedback/feedbackeffectplugin/hbfeedbackeffectengine.cpp
changeset 1 f7ac710697a9
parent 0 16d8024aca5e
child 2 06ff229162e9
equal deleted inserted replaced
0:16d8024aca5e 1:f7ac710697a9
    43 #include <hbnamespace_p.h>
    43 #include <hbnamespace_p.h>
    44 
    44 
    45 /*!
    45 /*!
    46     Constructor
    46     Constructor
    47 */
    47 */
    48 HbFeedbackEffectEngine::HbFeedbackEffectEngine() : previousCursorPosition(0)
    48 HbFeedbackEffectEngine::HbFeedbackEffectEngine() : activelyScrollingItemView(0), previousCursorPosition(0)
    49 {
    49 {
    50     // initialize
    50     // initialize
    51     HbFeedbackPlayer::instance();
    51     HbFeedbackPlayer::instance();
    52 }
    52 }
    53 
    53 
    64 
    64 
    65     continuousFeedbacks.clear();
    65     continuousFeedbacks.clear();
    66     boundaryWidgets.clear();
    66     boundaryWidgets.clear();
    67 }
    67 }
    68 
    68 
       
    69 QString HbFeedbackEffectEngine::effectOverrideProperty(Hb::InstantInteraction interaction)
       
    70 {
       
    71     QString propertyName;
       
    72     switch (interaction) {
       
    73     case Hb::InstantPressed:
       
    74         propertyName = "pressedFeedbackEffect";
       
    75         break;
       
    76     case Hb::InstantReleased:
       
    77         propertyName = "releasedFeedbackEffect";
       
    78         break;
       
    79     case Hb::InstantClicked:
       
    80         propertyName = "clickedFeedbackEffect";
       
    81         break;
       
    82     case Hb::InstantKeyRepeated:
       
    83         propertyName = "keyRepeatedFeedbackEffect";
       
    84         break;
       
    85     case Hb::InstantLongPressed:
       
    86         propertyName = "longPressedFeedbackEffect";
       
    87         break;
       
    88     case Hb::InstantDraggedOver:
       
    89         propertyName = "draggedOverFeedbackEffect";
       
    90         break;
       
    91     case Hb::InstantFlicked:
       
    92         propertyName = "flickedFeedbackEffect";
       
    93         break;
       
    94     case Hb::InstantPopupOpened:
       
    95         propertyName = "popupOpenedFeedbackEffect";
       
    96         break;
       
    97     case Hb::InstantPopupClosed:
       
    98         propertyName = "popupClosedFeedbackEffect";
       
    99         break;
       
   100     case Hb::InstantBoundaryReached:
       
   101         propertyName = "boundaryReachedFeedbackEffect";
       
   102         break;
       
   103     case Hb::InstantRotated90Degrees:
       
   104         propertyName = "rotated90DegreesFeedbackEffect";
       
   105         break;
       
   106     case Hb::InstantSelectionChanged:
       
   107         propertyName = "selectionChangedFeedbackEffect";
       
   108         break;
       
   109     case Hb::InstantMultitouchActivated:
       
   110         propertyName = "multitouchActivatedFeedbackEffect";
       
   111         break;
       
   112     default:
       
   113         propertyName = "defaultFeedbackEffect";
       
   114         break;
       
   115     }
       
   116     return propertyName;
       
   117 }
       
   118 
       
   119 QString HbFeedbackEffectEngine::effectOverrideProperty(Hb::ContinuousInteraction interaction)
       
   120 {
       
   121     QString propertyName;
       
   122     switch (interaction) {
       
   123     case Hb::ContinuousScrolled:
       
   124         propertyName = "scrolledFeedbackEffect";
       
   125         break;
       
   126     case Hb::ContinuousDragged:
       
   127         propertyName = "draggedFeedbackEffect";
       
   128         break;
       
   129     case Hb::ContinuousPinched:
       
   130         propertyName = "pinchedFeedbackEffect";
       
   131         break;
       
   132     case Hb::ContinuousRotated:
       
   133         propertyName = "rotatedFeedbackEffect";
       
   134         break;
       
   135     default:
       
   136         propertyName = "defaultFeedbackEffect";
       
   137         break;
       
   138     }
       
   139     return propertyName;
       
   140 }
       
   141 
       
   142 QString HbFeedbackEffectEngine::modalitiesOverrideProperty(Hb::InstantInteraction interaction)
       
   143 {
       
   144     QString propertyName;
       
   145     switch (interaction) {
       
   146     case Hb::InstantPressed:
       
   147         propertyName = "pressedFeedbackModalities";
       
   148         break;
       
   149     case Hb::InstantReleased:
       
   150         propertyName = "releasedFeedbackModalities";
       
   151         break;
       
   152     case Hb::InstantClicked:
       
   153         propertyName = "clickedFeedbackModalities";
       
   154         break;
       
   155     case Hb::InstantKeyRepeated:
       
   156         propertyName = "keyRepeatedFeedbackModalities";
       
   157         break;
       
   158     case Hb::InstantLongPressed:
       
   159         propertyName = "longPressedFeedbackModalities";
       
   160         break;
       
   161     case Hb::InstantDraggedOver:
       
   162         propertyName = "draggedOverFeedbackModalities";
       
   163         break;
       
   164     case Hb::InstantFlicked:
       
   165         propertyName = "flickedFeedbackModalities";
       
   166         break;
       
   167     case Hb::InstantPopupOpened:
       
   168         propertyName = "popupOpenedFeedbackModalities";
       
   169         break;
       
   170     case Hb::InstantPopupClosed:
       
   171         propertyName = "popupClosedFeedbackModalities";
       
   172         break;
       
   173     case Hb::InstantBoundaryReached:
       
   174         propertyName = "boundaryReachedFeedbackModalities";
       
   175         break;
       
   176     case Hb::InstantRotated90Degrees:
       
   177         propertyName = "rotated90DegreesFeedbackModalities";
       
   178         break;
       
   179     case Hb::InstantSelectionChanged:
       
   180         propertyName = "selectionChangedFeedbackModalities";
       
   181         break;
       
   182     case Hb::InstantMultitouchActivated:
       
   183         propertyName = "multitouchActivatedFeedbackModalities";
       
   184         break;
       
   185     default:
       
   186         propertyName = "defaultFeedbackModalities";
       
   187         break;
       
   188     }
       
   189     return propertyName;
       
   190 }
       
   191 
       
   192 QString HbFeedbackEffectEngine::modalitiesOverrideProperty(Hb::ContinuousInteraction interaction)
       
   193 {
       
   194     QString propertyName;
       
   195     switch (interaction) {
       
   196     case Hb::ContinuousScrolled:
       
   197         propertyName = "scrolledFeedbackModalities";
       
   198         break;
       
   199     case Hb::ContinuousDragged:
       
   200         propertyName = "draggedFeedbackModalities";
       
   201         break;
       
   202     case Hb::ContinuousPinched:
       
   203         propertyName = "pinchedFeedbackModalities";
       
   204         break;
       
   205     case Hb::ContinuousRotated:
       
   206         propertyName = "rotatedFeedbackModalities";
       
   207         break;
       
   208     default:
       
   209         propertyName = "defaultFeedbackModalities";
       
   210         break;
       
   211     }
       
   212     return propertyName;
       
   213 }
       
   214 
       
   215 
       
   216 bool HbFeedbackEffectEngine::widgetOverridesEffect(const HbWidget *widget, Hb::InstantInteraction interaction) {
       
   217     return (widget == overrider.widget && overrider.overridesEffect && overrider.instantInteraction == interaction);
       
   218 }
       
   219 
       
   220 bool HbFeedbackEffectEngine::widgetOverridesEffect(const HbWidget *widget, Hb::ContinuousInteraction interaction) {
       
   221     return (widget == overrider.widget && overrider.overridesEffect && overrider.continuousInteraction == interaction);
       
   222 }
       
   223 
       
   224 bool HbFeedbackEffectEngine::widgetOverridesModalities(const HbWidget *widget,Hb::InstantInteraction interaction) {
       
   225     return (widget == overrider.widget && overrider.overridesModalities && overrider.instantInteraction == interaction);
       
   226 }
       
   227 
       
   228 bool HbFeedbackEffectEngine::widgetOverridesModalities(const HbWidget *widget,Hb::ContinuousInteraction interaction) {
       
   229     return (widget == overrider.widget && overrider.overridesModalities && overrider.continuousInteraction == interaction);
       
   230 }
       
   231 
       
   232 
    69 /*!
   233 /*!
    70     Called by the feedback manager when an interaction is triggered.
   234     Called by the feedback manager when an interaction is triggered.
    71 */
   235 */
    72 void HbFeedbackEffectEngine::triggered(const HbWidget *widget, Hb::InstantInteraction interaction, Hb::InteractionModifiers modifiers)
   236 void HbFeedbackEffectEngine::triggered(const HbWidget *widget, Hb::InstantInteraction interaction, Hb::InteractionModifiers modifiers)
    73 {
   237 {
    74     HbFeedback::InstantEffect widgetOverride = widget->overrideFeedback(interaction);
   238     
    75     if (widgetOverride != HbFeedback::NoOverride ) {
   239     overrider.widget = widget;
    76         playInstantFeedback(widget, widgetOverride);
   240     overrider.instantInteraction = interaction;
    77     } else {
   241     overrider.overridesEffect = false;
    78         HbFeedbackEngine::triggered(widget, interaction, modifiers);
   242     overrider.overridesModalities = false;
       
   243 
       
   244     QString effectProperty = effectOverrideProperty(interaction);
       
   245     QVariant veffect = widget->property(effectProperty.toLatin1());
       
   246     if(veffect.isValid() && veffect.type() == QVariant::Int) {
       
   247         overrider.overridesEffect = true;
       
   248         overrider.newInstantEffect = HbFeedback::InstantEffect(veffect.toInt());
       
   249     }
       
   250     
       
   251     QString modalitiesProperty = modalitiesOverrideProperty(interaction);
       
   252     QVariant vmodalities = widget->property(modalitiesProperty.toLatin1());
       
   253     if(vmodalities.isValid() && vmodalities.type() == QVariant::Int) {
       
   254         overrider.overridesModalities = true;
       
   255         overrider.newModalities = HbFeedback::Modalities(vmodalities.toInt());
       
   256     }
       
   257 
       
   258     if(overrider.overridesEffect && overrider.overridesModalities) {
       
   259         // play specified effect via the specified modality
       
   260         playInstantFeedback(widget,overrider.newInstantEffect,overrider.newModalities);
       
   261 
       
   262     } else {
       
   263         // use default values for unspecified effect/modalities
       
   264         HbFeedbackEngine::triggered(widget,interaction,modifiers);
    79     }
   265     }
    80 }
   266 }
    81 
   267 
    82 /*!
   268 /*!
    83     Called by the feedback manager when a widget is pressed.
   269     Called by the feedback manager when a widget is pressed.
    84 */
   270 */
    85 void HbFeedbackEffectEngine::pressed(const HbWidget *widget)
   271 void HbFeedbackEffectEngine::pressed(const HbWidget *widget)
    86 {
   272 {
    87     HbFeedback::InstantEffect effect = HbFeedbackEffectUtils::instantOnPress(widget, modifiers());
   273     HbFeedback::InstantEffect effect = HbFeedback::None;
    88     playInstantFeedback(widget, effect);
   274     HbFeedback::Modalities modalities = 0;
       
   275     Hb::InstantInteraction interaction = Hb::InstantPressed;
       
   276 
       
   277     if(widgetOverridesEffect( widget, interaction)) {
       
   278         effect = overrider.newInstantEffect;
       
   279     } else {
       
   280         effect = HbFeedbackEffectUtils::instantOnPress(widget, modifiers());
       
   281     }
       
   282 
       
   283     if(widgetOverridesModalities(widget,interaction)) {
       
   284         modalities = overrider.newModalities ;
       
   285     } else  {
       
   286         modalities = HbFeedbackEffectUtils::modalities(widget, Hb::InstantPressed, modifiers());
       
   287     }
       
   288 
       
   289     playInstantFeedback(widget, effect, modalities);
    89 }
   290 }
    90 
   291 
    91 /*!
   292 /*!
    92     Called by the feedback manager when a widget is released.
   293     Called by the feedback manager when a widget is released.
    93 */
   294 */
    94 void HbFeedbackEffectEngine::released(const HbWidget *widget)
   295 void HbFeedbackEffectEngine::released(const HbWidget *widget)
    95 {
   296 {
       
   297     HbFeedback::InstantEffect effect = HbFeedback::None;
       
   298     HbFeedback::Modalities modalities = 0;
       
   299     Hb::InstantInteraction interaction = Hb::InstantReleased;
       
   300 
    96     if (continuousFeedbacks.contains(widget)) {
   301     if (continuousFeedbacks.contains(widget)) {
    97         cancelContinuousFeedback(widget);
   302         cancelContinuousFeedback(widget);
    98     }
   303     }
    99     // slider-like widgets are a bit special
   304 
   100     if (HbFeedbackEffectUtils::widgetFamily(widget) == HbFeedbackEffectUtils::Slider) {
   305     if(widgetOverridesEffect( widget, interaction)) {
   101         playInstantFeedback(widget, HbFeedbackEffectUtils::instantOnRelease(widget, modifiers()));
   306         effect = overrider.newInstantEffect;
   102     }
   307     } else {
   103     // lists in arrange mode react on release
   308         // use default effect
   104     else if (const HbListViewItem *listViewItem = qobject_cast<const HbListViewItem *>(widget)) {
   309         // slider-like widgets are a bit special
   105         const HbAbstractItemView* itemView = listViewItem->itemView();
   310         if (HbFeedbackEffectUtils::widgetFamily(widget) == HbFeedbackEffectUtils::Slider) {
   106         if (const HbListView * listView = qobject_cast<const HbListView *>(itemView)) {
   311             effect = HbFeedbackEffectUtils::instantOnRelease(widget, modifiers()) ;
   107             if( listView->arrangeMode() ) {
   312         }
   108                 playInstantFeedback(listViewItem,HbFeedbackEffectUtils::instantOnRelease(listViewItem, modifiers()));
   313         // lists in arrange mode react on release
   109             }
   314         else if (const HbListViewItem *listViewItem = qobject_cast<const HbListViewItem *>(widget)) {
   110         }
   315             const HbAbstractItemView* itemView = listViewItem->itemView();
   111     } else if (widget->type() == Hb::ItemType_VirtualTrackPoint) {
   316             if (const HbListView * listView = qobject_cast<const HbListView *>(itemView)) {
   112         playInstantFeedback(widget, HbFeedback::Editor);
   317                 if( listView->arrangeMode() ) {
   113     } else if (widget->type() == Hb::ItemType_WritingBox) {
   318                     effect = HbFeedbackEffectUtils::instantOnRelease(listViewItem, modifiers()) ;
   114         playInstantFeedback(widget, HbFeedback::Editor);
   319                 }
   115     }
   320             }
   116     else if (widget->type() == HbPrivate::ItemType_GroupBoxHeadingWidget || widget->type() == Hb::ItemType_ComboBox) {
   321         }
   117         playInstantFeedback(widget, HbFeedbackEffectUtils::instantOnRelease(widget, modifiers()));
   322         else if (HbFeedbackEffectUtils::widgetFamily(widget) == HbFeedbackEffectUtils::Editor) {
   118     }
   323             effect = HbFeedbackEffectUtils::instantOnRelease(widget, modifiers());
       
   324         } else if (widget->type() == HbPrivate::ItemType_GroupBoxHeadingWidget || widget->type() == Hb::ItemType_ComboBox) {
       
   325             effect = HbFeedbackEffectUtils::instantOnRelease(widget, modifiers()) ;
       
   326         }
       
   327         else if (widget->type() == HbPrivate::ItemType_GroupBoxHeadingWidget
       
   328                  || widget->type() == HbPrivate::ItemType_GroupBoxContentWidget
       
   329                  || widget->type() == HbPrivate::ItemType_DataGroupHeadingWidget
       
   330                  || widget->type() == Hb::ItemType_ComboBox) {
       
   331             effect = HbFeedbackEffectUtils::instantOnRelease(widget, modifiers());
       
   332         }
       
   333     }
       
   334 
       
   335     if(widgetOverridesModalities(widget,interaction)) {
       
   336         modalities = overrider.newModalities ;
       
   337     } else  {
       
   338         modalities = HbFeedbackEffectUtils::modalities(widget, Hb::InstantReleased, modifiers());
       
   339     }
       
   340 
       
   341     playInstantFeedback(widget,effect, modalities);
   119 
   342 
   120     // normally touch end feedback effect is initiated with a clicked signal
   343     // normally touch end feedback effect is initiated with a clicked signal
   121 }
   344 }
   122 
   345 
   123 /*!
   346 /*!
   124     Called by the feedback manager when a long press is detected for a widget.
   347     Called by the feedback manager when a long press is detected for a widget.
   125 */
   348 */
   126 void HbFeedbackEffectEngine::longPressed(const HbWidget *widget)
   349 void HbFeedbackEffectEngine::longPressed(const HbWidget *widget)
   127 {
   350 {
   128     if (widget->type() == Hb::ItemType_InputCharacterButton) {
   351     HbFeedback::InstantEffect effect = HbFeedback::None;
   129         playInstantFeedback(widget, HbFeedback::SensitiveKeypad);
   352     HbFeedback::Modalities modalities = 0;
   130     }
   353     Hb::InstantInteraction interaction = Hb::InstantLongPressed;
       
   354 
       
   355     if(widgetOverridesEffect(widget, interaction)) {
       
   356         effect = overrider.newInstantEffect;
       
   357     } else {
       
   358         effect = HbFeedback::None;
       
   359         if (widget->type() == Hb::ItemType_InputCharacterButton) {
       
   360             effect = HbFeedback::SensitiveKeypad;
       
   361         }
       
   362         else {
       
   363             effect = HbFeedback::LongPress;
       
   364         }
       
   365     }
       
   366 
       
   367     if(widgetOverridesModalities(widget,interaction)) {
       
   368         modalities = overrider.newModalities ;
       
   369     } else  {
       
   370         modalities = HbFeedbackEffectUtils::modalities(widget, interaction, modifiers());
       
   371     }
       
   372 
       
   373     playInstantFeedback(widget, effect, modalities);
       
   374 
   131 }
   375 }
   132 
   376 
   133 /*!
   377 /*!
   134     Called by the feedback manager when a widget is clicked.
   378     Called by the feedback manager when a widget is clicked.
   135 */
   379 */
   136 void HbFeedbackEffectEngine::clicked(const HbWidget *widget)
   380 void HbFeedbackEffectEngine::clicked(const HbWidget *widget)
   137 {
   381 {
       
   382     HbFeedback::InstantEffect effect = HbFeedback::None ;
       
   383     HbFeedback::Modalities modalities = 0 ;
       
   384     Hb::InstantInteraction interaction = Hb::InstantClicked;
       
   385 
   138     if (continuousFeedbacks.contains(widget)) {
   386     if (continuousFeedbacks.contains(widget)) {
   139         cancelContinuousFeedback(widget);
   387         cancelContinuousFeedback(widget);
   140     }
   388     }
   141     playInstantFeedback(widget, HbFeedbackEffectUtils::instantOnRelease(widget, modifiers()));
   389 
       
   390     if(widgetOverridesEffect( widget, interaction)) {
       
   391         effect = overrider.newInstantEffect;
       
   392     } else {
       
   393         effect = HbFeedbackEffectUtils::instantOnRelease(widget, modifiers());
       
   394     }
       
   395 
       
   396     if(widgetOverridesModalities(widget,interaction)) {
       
   397         modalities = overrider.newModalities ;
       
   398     } else  {
       
   399         modalities = HbFeedbackEffectUtils::modalities(widget, interaction, modifiers());
       
   400     }
       
   401 
       
   402     playInstantFeedback(widget, effect, modalities);
   142 }
   403 }
   143 
   404 
   144 /*!
   405 /*!
   145     Called by the feedback manager when keyrepeats are detected for a widget.
   406     Called by the feedback manager when keyrepeats are detected for a widget.
   146 */
   407 */
   147 void HbFeedbackEffectEngine::keyRepeated(const HbWidget *widget)
   408 void HbFeedbackEffectEngine::keyRepeated(const HbWidget *widget)
   148 {
   409 {
   149     playInstantFeedback(widget, HbFeedbackEffectUtils::instantOnKeyRepeat(widget));
   410     HbFeedback::InstantEffect effect = HbFeedback::None ;
       
   411     HbFeedback::Modalities modalities = 0 ;
       
   412     Hb::InstantInteraction interaction = Hb::InstantKeyRepeated;
       
   413 
       
   414     if(widgetOverridesEffect( widget, interaction)) {
       
   415         effect = overrider.newInstantEffect;
       
   416     } else {
       
   417         effect = HbFeedbackEffectUtils::instantOnKeyRepeat(widget);
       
   418     }
       
   419 
       
   420     if(widgetOverridesModalities(widget,interaction)) {
       
   421         modalities = overrider.newModalities ;
       
   422     } else  {
       
   423         modalities = HbFeedbackEffectUtils::modalities(widget, interaction, modifiers());
       
   424     }
       
   425 
       
   426     playInstantFeedback(widget, effect, modalities);
   150 }
   427 }
   151 
   428 
   152 /*!
   429 /*!
   153     Called by the feedback manager when a dragged over event is detected for a widget.
   430     Called by the feedback manager when a dragged over event is detected for a widget.
   154 */
   431 */
   155 void HbFeedbackEffectEngine::draggedOver(const HbWidget *widget)
   432 void HbFeedbackEffectEngine::draggedOver(const HbWidget *widget)
   156 {
   433 {
   157     // For editor highlighting
   434     HbFeedback::InstantEffect effect = HbFeedback::None ;
   158     if (const HbAbstractEdit *edit = qobject_cast<const HbAbstractEdit *>(widget)) {
   435     HbFeedback::Modalities modalities = 0 ;
   159         if (edit->cursorPosition() != previousCursorPosition) {
   436     Hb::InstantInteraction interaction = Hb::InstantDraggedOver;
   160             playInstantFeedback(widget, HbFeedbackEffectUtils::instantOnEditorHighlight(edit, previousCursorPosition));
   437 
   161             previousCursorPosition = edit->cursorPosition();
   438     if(widgetOverridesEffect( widget, interaction)) {
   162         }
   439         effect = overrider.newInstantEffect;
   163     }
   440     } else {
   164     else if (const HbInputVirtualRocker *trackPoint = qobject_cast<const HbInputVirtualRocker *>(widget)) {
   441         // For editor highlighting
   165         if (trackPoint && trackPoint->mainWindow() && trackPoint->mainWindow()->scene() &&
   442         if (const HbAbstractEdit *edit = qobject_cast<const HbAbstractEdit *>(widget)) {
   166             trackPoint->mainWindow()->scene()->focusItem()) {
   443             if (edit->cursorPosition() != previousCursorPosition) {
   167             
   444                 effect = HbFeedbackEffectUtils::instantOnEditorHighlight(edit, previousCursorPosition) ;
   168             QGraphicsItem* graphicsItem = trackPoint->mainWindow()->scene()->focusItem();
   445                 previousCursorPosition = edit->cursorPosition();
   169             
   446             }
   170             if (graphicsItem->isWidget() && 
   447         }
   171                 static_cast<QGraphicsWidget*>(graphicsItem)->inherits("HbAbstractEdit")) {
   448         else if (const HbInputVirtualRocker *trackPoint = qobject_cast<const HbInputVirtualRocker *>(widget)) {
   172              
   449             if (trackPoint && trackPoint->mainWindow() && trackPoint->mainWindow()->scene() &&
   173                 if (HbAbstractEdit* edit = static_cast<HbAbstractEdit*>(graphicsItem)) {
   450                 trackPoint->mainWindow()->scene()->focusItem()) {
   174                     if (edit->cursorPosition() != previousCursorPosition) {
   451 
   175                         playInstantFeedback(widget, HbFeedbackEffectUtils::instantOnEditorHighlight(edit, previousCursorPosition));
   452                 QGraphicsItem* graphicsItem = trackPoint->mainWindow()->scene()->focusItem();
   176                         previousCursorPosition = edit->cursorPosition();
   453 
       
   454                 if (graphicsItem->isWidget() &&
       
   455                     static_cast<QGraphicsWidget*>(graphicsItem)->inherits("HbAbstractEdit")) {
       
   456 
       
   457                     if (HbAbstractEdit* edit = static_cast<HbAbstractEdit*>(graphicsItem)) {
       
   458                         if (edit->cursorPosition() != previousCursorPosition) {
       
   459                             effect = HbFeedbackEffectUtils::instantOnEditorHighlight(edit, previousCursorPosition);
       
   460                             previousCursorPosition = edit->cursorPosition();
       
   461                         }
   177                     }
   462                     }
   178                 }
   463                 }
   179             }
   464             }
   180         }
   465         } else {
   181     }
   466             effect = HbFeedbackEffectUtils::instantOnDrag(widget, modifiers());
   182     else {
   467         }
   183         playInstantFeedback(widget, HbFeedbackEffectUtils::instantOnDrag(widget, modifiers()));
   468     }
   184     }
   469 
       
   470     if(widgetOverridesModalities(widget,interaction)) {
       
   471         modalities = overrider.newModalities ;
       
   472     } else  {
       
   473         modalities = HbFeedbackEffectUtils::modalities(widget, interaction, modifiers());
       
   474     }
       
   475 
       
   476     playInstantFeedback(widget, effect, modalities);
   185 }
   477 }
   186 
   478 
   187 /*!
   479 /*!
   188     Called by the feedback manager when a widget is flicked.
   480     Called by the feedback manager when a widget is flicked.
   189 */
   481 */
   190 void HbFeedbackEffectEngine::flicked(const HbWidget *widget)
   482 void HbFeedbackEffectEngine::flicked(const HbWidget *widget)
   191 {
   483 {
   192     playInstantFeedback(widget, HbFeedback::Flick);
   484     HbFeedback::InstantEffect effect = HbFeedback::None ;
       
   485     HbFeedback::Modalities modalities = 0 ;
       
   486     Hb::InstantInteraction interaction = Hb::InstantFlicked;
       
   487 
       
   488     if(widgetOverridesEffect( widget, interaction)) {
       
   489         effect = overrider.newInstantEffect;
       
   490     } else {
       
   491         effect = HbFeedback::Flick ;
       
   492     }
       
   493 
       
   494     if(widgetOverridesModalities(widget,interaction)) {
       
   495         modalities = overrider.newModalities ;
       
   496     } else  {
       
   497         modalities = HbFeedbackEffectUtils::modalities(widget, interaction, modifiers());
       
   498     }
       
   499 
       
   500     playInstantFeedback(widget, effect, modalities);
   193 }
   501 }
   194 
   502 
   195 /*!
   503 /*!
   196     Called by the feedback manager when a scroll area widget is flicked or dragged and the boundary reached.
   504     Called by the feedback manager when a scroll area widget is flicked or dragged and the boundary reached.
   197 */
   505 */
   203 /*!
   511 /*!
   204     Called by the feedback manager when a rotate gesture is recognized for a widget.
   512     Called by the feedback manager when a rotate gesture is recognized for a widget.
   205 */
   513 */
   206 void HbFeedbackEffectEngine::rotated90Degrees(const HbWidget *widget)
   514 void HbFeedbackEffectEngine::rotated90Degrees(const HbWidget *widget)
   207 {
   515 {
   208     playInstantFeedback(widget, HbFeedback::RotateStep);
   516     HbFeedback::InstantEffect effect = HbFeedback::None ;
       
   517     HbFeedback::Modalities modalities = 0 ;
       
   518     Hb::InstantInteraction interaction = Hb::InstantRotated90Degrees;
       
   519 
       
   520     if(widgetOverridesEffect( widget, interaction)) {
       
   521         effect = overrider.newInstantEffect;
       
   522     } else {
       
   523         effect = HbFeedback::RotateStep;
       
   524 
       
   525     }
       
   526 
       
   527     if(widgetOverridesModalities(widget,interaction)) {
       
   528         modalities = overrider.newModalities ;
       
   529     } else  {
       
   530         modalities = HbFeedbackEffectUtils::modalities(widget, interaction, modifiers());
       
   531     }
       
   532 
       
   533     playInstantFeedback(widget, effect, modalities);
   209 }
   534 }
   210 
   535 
   211 /*!
   536 /*!
   212     Called by the feedback manager when a popup opens.
   537     Called by the feedback manager when a popup opens.
   213 */
   538 */
   214 void HbFeedbackEffectEngine::popupOpened(const HbWidget *widget)
   539 void HbFeedbackEffectEngine::popupOpened(const HbWidget *widget)
   215 {
   540 {
   216     if (HbFeedbackEffectUtils::isFeedbackAllowedForPopup(widget)) {
   541     HbFeedback::Modalities modalities = 0 ;
   217         playInstantFeedback(widget, HbFeedback::PopupOpen);
   542     Hb::InstantInteraction interaction = Hb::InstantPopupOpened;
       
   543 
       
   544     if(widgetOverridesModalities(widget,interaction)) {
       
   545         modalities = overrider.newModalities ;
       
   546     } else  {
       
   547         modalities = HbFeedbackEffectUtils::modalities(widget, interaction, modifiers());
       
   548     }
       
   549 
       
   550     if(widgetOverridesEffect( widget, interaction)) {
       
   551         playInstantFeedback(widget, overrider.newInstantEffect, modalities);
       
   552     } else {
       
   553         if(HbFeedbackEffectUtils::isFeedbackAllowedForPopup(widget)) {
       
   554             playInstantFeedback(widget, HbFeedback::PopupOpen, modalities);
       
   555         }
   218     }
   556     }
   219 }
   557 }
   220 
   558 
   221 /*!
   559 /*!
   222     Called by the feedback manager when a popup closes.
   560     Called by the feedback manager when a popup closes.
   223 */
   561 */
   224 void HbFeedbackEffectEngine::popupClosed(const HbWidget *widget)
   562 void HbFeedbackEffectEngine::popupClosed(const HbWidget *widget)
   225 {
   563 {
   226     if (HbFeedbackEffectUtils::isFeedbackAllowedForPopup(widget)) {
   564     HbFeedback::Modalities modalities = 0 ;
   227         playInstantFeedback(widget, HbFeedback::PopupClose);
   565     Hb::InstantInteraction interaction = Hb::InstantPopupClosed;
       
   566 
       
   567     if(widgetOverridesModalities(widget,interaction)) {
       
   568         modalities = overrider.newModalities ;
       
   569     } else  {
       
   570         modalities = HbFeedbackEffectUtils::modalities(widget, interaction, modifiers());
       
   571     }
       
   572 
       
   573     if(widgetOverridesEffect( widget, interaction)) {
       
   574         playInstantFeedback(widget, overrider.newInstantEffect, modalities);
       
   575     } else {
       
   576         if(HbFeedbackEffectUtils::isFeedbackAllowedForPopup(widget)) {
       
   577             playInstantFeedback(widget, HbFeedback::PopupClose, modalities);
       
   578         }
   228     }
   579     }
   229 }
   580 }
   230 
   581 
   231 /*!
   582 /*!
   232     Called by the feedback manager when an item view selection has changed.
   583     Called by the feedback manager when an item view selection has changed.
   233 */
   584 */
   234 void HbFeedbackEffectEngine::selectionChanged(const HbWidget *widget)
   585 void HbFeedbackEffectEngine::selectionChanged(const HbWidget *widget)
   235 {
   586 {
   236     playInstantFeedback(widget, HbFeedbackEffectUtils::instantOnSelectionChanged(widget));
   587     HbFeedback::InstantEffect effect = HbFeedback::None ;
       
   588     HbFeedback::Modalities modalities = 0 ;
       
   589     Hb::InstantInteraction interaction = Hb::InstantSelectionChanged;
       
   590 
       
   591     if(widgetOverridesEffect( widget, interaction)) {
       
   592         effect = overrider.newInstantEffect;
       
   593     } else {
       
   594         effect = HbFeedbackEffectUtils::instantOnSelectionChanged(widget, modifiers());
       
   595     }
       
   596 
       
   597     if(widgetOverridesModalities(widget,interaction)) {
       
   598         modalities = overrider.newModalities ;
       
   599     } else  {
       
   600         modalities = HbFeedbackEffectUtils::modalities(widget, interaction, modifiers());
       
   601     }
       
   602 
       
   603     playInstantFeedback(widget, effect, modalities);
   237 }
   604 }
   238 
   605 
   239 /*!
   606 /*!
   240     Called by the feedback manager when multitouch is activated.
   607     Called by the feedback manager when multitouch is activated.
   241 */
   608 */
   242 void HbFeedbackEffectEngine::multitouchActivated(const HbWidget *widget)
   609 void HbFeedbackEffectEngine::multitouchActivated(const HbWidget *widget)
   243 {
   610 {
   244     playInstantFeedback(widget, HbFeedback::MultitouchActivate);
   611     HbFeedback::InstantEffect effect = HbFeedback::None ;
       
   612     HbFeedback::Modalities modalities = 0 ;
       
   613     Hb::InstantInteraction interaction = Hb::InstantMultitouchActivated;
       
   614 
       
   615     if(widgetOverridesEffect( widget, interaction)) {
       
   616         effect = overrider.newInstantEffect;
       
   617     } else {
       
   618         effect = HbFeedback::MultitouchActivate;
       
   619     }
       
   620 
       
   621     if(widgetOverridesModalities(widget,interaction)) {
       
   622         modalities = overrider.newModalities ;
       
   623     } else  {
       
   624         modalities = HbFeedbackEffectUtils::modalities(widget, interaction, modifiers());
       
   625     }
       
   626 
       
   627     playInstantFeedback(widget, effect, modalities);
   245 }
   628 }
   246 
   629 
   247 /*!
   630 /*!
   248     Called by the feedback manager when a continuous interaction is triggered.
   631     Called by the feedback manager when a continuous interaction is triggered.
   249 */
   632 */
   250 void HbFeedbackEffectEngine::continuousTriggered(const HbWidget *widget, Hb::ContinuousInteraction interaction, QPointF delta)
   633 void HbFeedbackEffectEngine::continuousTriggered(const HbWidget *widget, Hb::ContinuousInteraction interaction, QPointF delta)
   251 {
   634 {
   252     bool feedbackPlayed(false);
   635     HbFeedback::ContinuousEffect effect = HbFeedback::ContinuousNone ;
   253     switch(HbFeedbackEffectUtils::widgetFamily(widget))
   636     HbFeedback::Modalities modalities = 0 ;
   254     {
   637 
       
   638     overrider.widget = widget;
       
   639     overrider.continuousInteraction = interaction;
       
   640     overrider.overridesEffect = false;
       
   641     overrider.overridesModalities = false;
       
   642 
       
   643     QString effectProperty = effectOverrideProperty(interaction);
       
   644     QVariant veffect = widget->property(effectProperty.toLatin1());
       
   645     if(veffect.isValid() && veffect.type() == QVariant::Int) {
       
   646         overrider.overridesEffect = true;
       
   647         overrider.newContinuousEffect = HbFeedback::ContinuousEffect(veffect.toInt());
       
   648     }
       
   649 
       
   650     QString modalitiesProperty = modalitiesOverrideProperty(interaction);
       
   651     QVariant vmodalities = widget->property(modalitiesProperty.toLatin1());
       
   652     if(vmodalities.isValid() && vmodalities.type() == QVariant::Int) {
       
   653         overrider.overridesModalities = true;
       
   654         overrider.newModalities = HbFeedback::Modalities(vmodalities.toInt());
       
   655     }
       
   656 
       
   657     if(widgetOverridesModalities(widget,interaction)) {
       
   658         modalities = overrider.newModalities ;
       
   659     } else  {
       
   660         modalities = HbFeedbackEffectUtils::modalities(widget, interaction, modifiers());
       
   661     }
       
   662 
       
   663     if(widgetOverridesEffect( widget, interaction)) {
       
   664         // use overridden effect
       
   665         effect = overrider.newContinuousEffect;
       
   666         int intensity = HbFeedbackEffectUtils::intensity(widget, interaction, delta);
       
   667         playContinuousFeedback(widget, HbFeedback::ContinuousEffect(effect), intensity, modalities);
       
   668         
       
   669     } else {
       
   670         // use default effect
       
   671         bool feedbackPlayed(false);
       
   672 
       
   673         switch(HbFeedbackEffectUtils::widgetFamily(widget))
       
   674         {
   255         case HbFeedbackEffectUtils::Slider:
   675         case HbFeedbackEffectUtils::Slider:
   256         {
   676             {
   257             if (!HbFeedbackEffectUtils::isSliderMoveContinuous(widget)) {
   677                 if (!HbFeedbackEffectUtils::isSliderMoveContinuous(widget)) {
   258                 playInstantFeedback(widget, HbFeedback::SensitiveSlider);
   678                     if(!widgetOverridesModalities(widget,interaction)) {
   259                 feedbackPlayed = true;
   679                         modalities = HbFeedback::Audio | HbFeedback::Tactile;
   260             }
   680                     }
   261             break;
   681                     playInstantFeedback(widget, HbFeedback::SensitiveSlider, modalities);
   262         }
   682                     feedbackPlayed = true;
       
   683                 }
       
   684                 break;
       
   685             }
   263         case HbFeedbackEffectUtils::List:
   686         case HbFeedbackEffectUtils::List:
   264         case HbFeedbackEffectUtils::Grid:
   687         case HbFeedbackEffectUtils::Grid:
   265         {
   688             {
   266             if (interaction == Hb::ContinuousScrolled) {
   689                 if (interaction == Hb::ContinuousScrolled) {
   267                  if (const HbAbstractItemView * itemView = qobject_cast<const HbAbstractItemView *>(widget)) {
   690                     if (const HbAbstractItemView * itemView = qobject_cast<const HbAbstractItemView *>(widget)) {
   268                      feedbackPlayed = true;
   691                         feedbackPlayed = true;
   269                      QList<HbAbstractViewItem *> visibleItems = itemView->visibleItems();
   692                         QList<HbAbstractViewItem *> visibleItems = itemView->visibleItems();
   270                      bool newItemFound(false);
   693                         bool newItemFound(false);
   271                      int index(-1);
   694                         int index(-1);
   272                      QList<int> visibleIndexes;
   695                         QList<int> visibleIndexes;
   273                      if (widget == activelyScrollingItemView) {
   696                         if (widget == activelyScrollingItemView) {
   274                          foreach (HbAbstractViewItem * item, visibleItems) {
   697                             foreach (HbAbstractViewItem * item, visibleItems) {
   275                              index = item->modelIndex().row();
   698                                 index = item->modelIndex().row();
   276                              if (!oldVisibleIndexes.contains(index)) {
   699                                 if (!oldVisibleIndexes.contains(index)) {
   277                                  newItemFound = true;
   700                                     newItemFound = true;
   278                              }
   701                                 }
   279                              visibleIndexes.append(index);
   702                                 visibleIndexes.append(index);
   280                          }
   703                             }
   281                      }
   704                         }
   282                      if (widget != activelyScrollingItemView){
   705                         if (widget != activelyScrollingItemView){
   283                          activelyScrollingItemView = widget;
   706                             activelyScrollingItemView = widget;
   284                          newItemFound = false;
   707                             newItemFound = false;
   285                      }
   708                         }
   286                      oldVisibleIndexes.clear();
   709                         oldVisibleIndexes.clear();
   287                      oldVisibleIndexes = visibleIndexes;
   710                         oldVisibleIndexes = visibleIndexes;
   288 
   711                         
   289                     if (newItemFound) {
   712                         if (newItemFound) {
   290                         const HbListView* listView = qobject_cast<const HbListView*>(widget);
   713                             const HbListView* listView = qobject_cast<const HbListView*>(widget);
   291                         if (!(  listView &&
   714                             if (!(  listView &&
   292                                 listView->arrangeMode() &&
   715                                     listView->arrangeMode() &&
   293                                 listView->draggedItem())){
   716                                     listView->draggedItem())){
   294                             playInstantFeedback(widget, HbFeedback::ItemScroll);
   717                                 if(!widgetOverridesModalities(widget,interaction)) {
       
   718                                     modalities = HbFeedback::Audio | HbFeedback::Tactile;
       
   719                                 }
       
   720                                 playInstantFeedback(widget, HbFeedback::ItemScroll, modalities);
       
   721                             }
   295                         }
   722                         }
   296                     }
   723                     }
   297                  }
   724                 }
   298              }
   725                 break;
   299             break;
   726             }
   300         }
       
   301         default:
   727         default:
   302         {
   728             {
   303             break;
   729                 break;
   304         }
   730             }
   305     }
   731         }
   306 
   732         
   307     if (interaction == Hb::ContinuousScrolled) {
   733         if (interaction == Hb::ContinuousScrolled) {
   308         // menu widget does scroll feedback elsewhere
   734             // menu widget does scroll feedback elsewhere
   309         if (widget->type() == HbPrivate::ItemType_MenuListView) {
   735             if (widget->type() == HbPrivate::ItemType_MenuListView) {
   310             feedbackPlayed = true;
   736                 feedbackPlayed = true;
   311         }
   737             }
   312 
   738             
   313         // generic scroll areas don't emit continuous feedback
   739             // generic scroll areas don't emit continuous feedback
   314         if (const HbScrollArea* scrollArea = qobject_cast<const HbScrollArea *>(widget)) {
   740             if (const HbScrollArea* scrollArea = qobject_cast<const HbScrollArea *>(widget)) {
   315             Q_UNUSED(scrollArea)
   741                 Q_UNUSED(scrollArea)
   316             feedbackPlayed = true;
   742                 feedbackPlayed = true;
   317         }
   743             }
   318     }
   744         }
   319 
   745         if (!feedbackPlayed) {
   320     if (!feedbackPlayed) {
   746             int intensity = HbFeedbackEffectUtils::intensity(widget, interaction, delta);
   321         int intensity = HbFeedbackEffectUtils::intensity(widget, interaction, delta);
   747             playContinuousFeedback(widget, HbFeedbackEffectUtils::continuousEffect(widget, interaction), intensity, modalities);
   322 
       
   323         // Check if the widget has overriden feedback for this interaction
       
   324         HbFeedback::ContinuousEffect widgetOverride = widget->overrideContinuousFeedback(interaction, &intensity) ;
       
   325         if (widgetOverride != HbFeedback::NoContinuousOverride) {
       
   326             playContinuousFeedback(widget, widgetOverride, intensity);
       
   327         } else {
       
   328             playContinuousFeedback(widget, HbFeedbackEffectUtils::continuousEffect(widget, interaction), intensity);
       
   329 
   748 
   330         }
   749         }
   331     }
   750     }
   332 }
   751 }
   333 
   752 
   334 /*!
   753 /*!
   335     Called by the feedback manager when a continuous interaction is stopped.
   754     Called by the feedback manager when a continuous interaction is stopped.
   336 */
   755 */
   337 void HbFeedbackEffectEngine::continuousStopped(const HbWidget *widget, Hb::ContinuousInteraction interaction)
   756 void HbFeedbackEffectEngine::continuousStopped(const HbWidget *widget, Hb::ContinuousInteraction interaction)
   338 {
   757 {
   339     // determine if instant feedback should be played when a continuous interaction is stopped
       
   340     HbFeedback::InstantEffect effect = HbFeedback::None;
   758     HbFeedback::InstantEffect effect = HbFeedback::None;
   341     if (boundaryWidgets.contains(widget)) {
   759     HbFeedback::Modalities modalities = 0;
   342         if (interaction == Hb::ContinuousScrolled) {
   760 
   343             effect = HbFeedback::BounceEffect;
   761     if(widgetOverridesModalities(widget,interaction)) {
   344         }
   762         modalities = overrider.newModalities ;
   345         boundaryWidgets.removeAll(widget);
   763     } else  {
   346     }
   764         modalities = HbFeedback::Tactile;
   347 
   765     }
   348     // stop ongoing continuous and list scrolling feedback effects
   766 
   349     if (continuousFeedbacks.contains(widget)) {
   767     if(widgetOverridesEffect( widget, interaction)) {
   350        cancelContinuousFeedback(widget);
   768         effect = overrider.newInstantEffect;
   351     }
   769         playInstantFeedback(widget, overrider.newInstantEffect, modalities);
   352     if (activelyScrollingItemView == widget) {
   770     } else {
   353         activelyScrollingItemView = 0;
   771         // determine if instant feedback should be played when a continuous interaction is stopped
   354     }
   772         effect = HbFeedback::None;
   355     playInstantFeedback(widget, effect);
   773         if (boundaryWidgets.contains(widget)) {
       
   774             if (interaction == Hb::ContinuousScrolled) {
       
   775                 effect = HbFeedback::BounceEffect;
       
   776             }
       
   777             boundaryWidgets.removeAll(widget);
       
   778         }
       
   779 
       
   780         // stop ongoing continuous and list scrolling feedback effects
       
   781         if (continuousFeedbacks.contains(widget)) {
       
   782             cancelContinuousFeedback(widget);
       
   783         }
       
   784         if (activelyScrollingItemView == widget) {
       
   785             activelyScrollingItemView = 0;
       
   786         }
       
   787         playInstantFeedback(widget, effect, modalities);
       
   788     }
   356 }
   789 }
   357 
   790 
   358 /*!
   791 /*!
   359     Plays the instant feedback.
   792     Plays the instant feedback.
   360 */
   793 */
   361 void HbFeedbackEffectEngine::playInstantFeedback(const HbWidget* widget, HbFeedback::InstantEffect effect)
   794 void HbFeedbackEffectEngine::playInstantFeedback(const HbWidget* widget, HbFeedback::InstantEffect effect, HbFeedback::Modalities modalities)
   362 {
   795 {
   363     const QGraphicsView* view = widget->mainWindow();
   796     const QGraphicsView* view = widget->mainWindow();
   364     if (view && HbFeedbackEffectUtils::isFeedbackAllowed(widget)) {
   797     if (view && HbFeedbackEffectUtils::isFeedbackAllowed(widget)) {
   365         HbInstantFeedback feedback(effect);
   798         HbInstantFeedback feedback(effect);
   366         feedback.setRect(widget, view);
   799         feedback.setRect(widget, view);
   367         feedback.setOwningWindow(view);
   800         feedback.setOwningWindow(view);
       
   801         feedback.setModalities(modalities);
   368 
   802 
   369         if (hbFeedbackPlayer && feedback.isLocated()) {
   803         if (hbFeedbackPlayer && feedback.isLocated()) {
   370             hbFeedbackPlayer->playInstantFeedback(feedback);
   804             hbFeedbackPlayer->playInstantFeedback(feedback);
   371         }
   805         }
   372     }
   806     }
   373 }
   807 }
   374 
   808 
   375 /*!
   809 /*!
   376     Plays the continuous feedback.
   810     Plays the continuous feedback.
   377 */
   811 */
   378 void HbFeedbackEffectEngine::playContinuousFeedback(const HbWidget* widget, HbFeedback::ContinuousEffect effect, int intensity)
   812 void HbFeedbackEffectEngine::playContinuousFeedback(const HbWidget* widget, HbFeedback::ContinuousEffect effect, int intensity, HbFeedback::Modalities modalities)
   379 {
   813 {
   380     const QGraphicsView* view = widget->mainWindow();
   814     const QGraphicsView* view = widget->mainWindow();
   381     if (view && HbFeedbackEffectUtils::isFeedbackAllowed(widget)) {
   815     if (view && HbFeedbackEffectUtils::isFeedbackAllowed(widget)) {
   382         HbContinuousFeedback feedback(effect,view);
   816         HbContinuousFeedback feedback(effect,view);
   383         feedback.setRect(widget, view);
   817         feedback.setRect(widget, view);
   384         feedback.setIntensity(intensity);
   818         feedback.setIntensity(intensity);
       
   819         feedback.setModalities(modalities);
   385 
   820 
   386         if (hbFeedbackPlayer && feedback.isLocated()) {
   821         if (hbFeedbackPlayer && feedback.isLocated()) {
   387             // if continuous feedback is still active and not stopped by continuous feedback timeout
   822             // if continuous feedback is still active and not stopped by continuous feedback timeout
   388             if (continuousFeedbacks.contains(widget)
   823             if (continuousFeedbacks.contains(widget)
   389                 && hbFeedbackPlayer->continuousFeedbackOngoing(continuousFeedbacks.value(widget))) {
   824                 && hbFeedbackPlayer->continuousFeedbackOngoing(continuousFeedbacks.value(widget))) {