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))) { |