29 #include <hbtoolbutton.h> |
29 #include <hbtoolbutton.h> |
30 #include <hbabstractbutton.h> |
30 #include <hbabstractbutton.h> |
31 #include <hbabstractedit.h> |
31 #include <hbabstractedit.h> |
32 #include <hbtextedit.h> |
32 #include <hbtextedit.h> |
33 #include <hblineedit.h> |
33 #include <hblineedit.h> |
|
34 #include <hbinputvirtualrocker.h> |
34 #include <hbabstractslidercontrol.h> |
35 #include <hbabstractslidercontrol.h> |
35 #include <hbprogressslider.h> |
36 #include <hbprogressslider.h> |
36 #include <hbscrollbar.h> |
37 #include <hbscrollbar.h> |
37 #include <hbabstractviewitem.h> |
38 #include <hbabstractviewitem.h> |
38 #include <hbabstractitemview.h> |
39 #include <hbabstractitemview.h> |
251 } |
251 } |
252 else if (widget->type() == Hb::ItemType_InputFunctionButton) { |
252 else if (widget->type() == Hb::ItemType_InputFunctionButton) { |
253 effect = HbFeedback::BasicKeypad; |
253 effect = HbFeedback::BasicKeypad; |
254 } |
254 } |
255 else if (widget->type() == Hb::ItemType_CheckBox) { |
255 else if (widget->type() == Hb::ItemType_CheckBox) { |
256 effect = HbFeedback::None; // Checkbox deferred to release |
256 effect = HbFeedback::BasicButton; |
257 } |
257 } |
258 |
258 |
259 // title pane specific special case |
259 // title pane specific special case |
260 if (widget->type() == HbPrivate::ItemType_TitlePane) { |
260 if (widget->type() == HbPrivate::ItemType_TitlePane) { |
261 if (isOptionsMenuEmpty(widget)) { |
261 if (isOptionsMenuEmpty(widget)) { |
267 case HbFeedbackEffectUtils::List: |
267 case HbFeedbackEffectUtils::List: |
268 if (modifiers & (Hb::ModifierExpandedItem | Hb::ModifierCollapsedItem)) { |
268 if (modifiers & (Hb::ModifierExpandedItem | Hb::ModifierCollapsedItem)) { |
269 effect = HbFeedback::BasicItem; |
269 effect = HbFeedback::BasicItem; |
270 } |
270 } |
271 else { |
271 else { |
|
272 effect = HbFeedback::BasicItem; |
|
273 } |
|
274 if (widget->type() == Hb::ItemType_DataFormViewItem) { |
272 effect = HbFeedback::SensitiveItem; |
275 effect = HbFeedback::SensitiveItem; |
273 } |
276 } |
|
277 else if (widget->type() == HbPrivate::ItemType_DataGroup) { |
|
278 effect = HbFeedback::None; |
|
279 } |
|
280 |
274 break; |
281 break; |
275 |
282 |
276 case HbFeedbackEffectUtils::Grid: |
283 case HbFeedbackEffectUtils::Grid: |
277 effect = HbFeedback::SensitiveItem; |
284 effect = HbFeedback::BasicItem; |
278 break; |
285 break; |
279 |
286 |
280 case HbFeedbackEffectUtils::Slider: |
287 case HbFeedbackEffectUtils::Slider: |
281 |
288 |
282 // slider track default |
289 // slider track default |
283 effect = HbFeedback::SensitiveSlider; |
290 effect = HbFeedback::BasicSlider; |
284 |
291 |
285 // special cases |
292 // special cases |
286 if (const HbProgressSlider *progressSlider = qobject_cast<const HbProgressSlider *>(widget)) { |
293 if (const HbProgressSlider *progressSlider = qobject_cast<const HbProgressSlider *>(widget)) { |
287 Q_UNUSED(progressSlider) |
294 Q_UNUSED(progressSlider) |
288 effect = HbFeedback::BasicSlider; |
295 effect = HbFeedback::BasicSlider; |
322 |
329 |
323 // item view specific special cases |
330 // item view specific special cases |
324 if ( const HbAbstractViewItem * viewItem = qobject_cast<const HbAbstractViewItem *>(widget)) { |
331 if ( const HbAbstractViewItem * viewItem = qobject_cast<const HbAbstractViewItem *>(widget)) { |
325 const HbAbstractItemView* itemView = viewItem->itemView(); |
332 const HbAbstractItemView* itemView = viewItem->itemView(); |
326 if (itemView) { |
333 if (itemView) { |
327 // checkable item is checked with a press |
334 // Different press feedbacks for single and multiselection list items |
328 switch (itemView->selectionMode()) { |
335 switch (itemView->selectionMode()) { |
329 case HbAbstractItemView::SingleSelection: |
336 case HbAbstractItemView::SingleSelection: |
330 case HbAbstractItemView::MultiSelection: { |
337 case HbAbstractItemView::MultiSelection: { |
331 effect = HbFeedback::SensitiveItem; |
338 effect = HbFeedback::BasicButton; |
332 break; |
339 break; |
333 } |
340 } |
334 case HbAbstractItemView::NoSelection: |
341 case HbAbstractItemView::NoSelection: |
335 if (const HbListView * listView = qobject_cast<const HbListView *>(itemView)) { |
342 if (const HbListView * listView = qobject_cast<const HbListView *>(itemView)) { |
336 if (listView->arrangeMode() |
343 if (listView->arrangeMode() |
403 effect = HbFeedback::BasicButton; |
415 effect = HbFeedback::BasicButton; |
404 } |
416 } |
405 } |
417 } |
406 } |
418 } |
407 |
419 |
408 if (widget->type() == HbPrivate::ItemType_NavigationButton |
420 if (widget->type() == HbPrivate::ItemType_NavigationButton || |
409 // Commented out until use cases are clarified |
421 widget->type() == Hb::ItemType_ToolButton) { |
410 /*|| widget->type() == HbPrivate::ItemType_IndicatorButton*/) { |
|
411 effect = HbFeedback::BasicButton; |
422 effect = HbFeedback::BasicButton; |
412 } |
423 } |
413 |
424 |
414 // input widget special case |
425 // input widget special case |
415 if (widget->type() == Hb::ItemType_InputButtonGroup |
426 if (widget->type() == Hb::ItemType_InputButtonGroup |
416 || widget->type() == Hb::ItemType_InputFunctionButton) { |
427 || widget->type() == Hb::ItemType_InputFunctionButton) { |
417 effect = HbFeedback::SensitiveKeypad; |
428 effect = HbFeedback::SensitiveKeypad; |
418 } else if (widget->type() == Hb::ItemType_CheckBox) { |
429 } else if (widget->type() == Hb::ItemType_CheckBox) { |
419 effect = HbFeedback::Checkbox; // deferred from press |
430 effect = HbFeedback::Checkbox; |
420 } |
431 } |
421 |
432 |
422 // title pane specific special case |
433 // title pane specific special case |
423 if (widget->type() == HbPrivate::ItemType_TitlePane) { |
434 if (widget->type() == HbPrivate::ItemType_TitlePane) { |
424 if (isOptionsMenuEmpty(widget)) { |
435 effect = HbFeedback::None; |
425 effect = HbFeedback::None; |
|
426 } |
|
427 } |
436 } |
428 |
437 |
429 if (widget->type() == Hb::ItemType_ComboBox) { |
438 if (widget->type() == Hb::ItemType_ComboBox) { |
430 effect = HbFeedback::PopupOpen; |
439 effect = HbFeedback::PopupOpen; |
431 } |
440 } |
435 case HbFeedbackEffectUtils::List: |
444 case HbFeedbackEffectUtils::List: |
436 if (modifiers & (Hb::ModifierExpandedItem | Hb::ModifierCollapsedItem)) { |
445 if (modifiers & (Hb::ModifierExpandedItem | Hb::ModifierCollapsedItem)) { |
437 effect = HbFeedback::BasicItem; |
446 effect = HbFeedback::BasicItem; |
438 } |
447 } |
439 else { |
448 else { |
440 effect = HbFeedback::SensitiveItem; |
449 effect = HbFeedback::BasicItem; |
441 } |
450 } |
442 // menu items give popop closed feedback on release |
451 // menu items give popup close feedback on release |
443 if (widget->type() == Hb::ItemType_MenuItem) { |
452 if (widget->type() == Hb::ItemType_MenuItem) { |
444 effect = HbFeedback::None; |
453 effect = HbFeedback::None; |
445 } |
454 } |
|
455 else if (widget->type() == Hb::ItemType_DataFormViewItem) { |
|
456 effect = HbFeedback::None; |
|
457 } |
446 break; |
458 break; |
447 |
459 |
448 case HbFeedbackEffectUtils::Grid: |
460 case HbFeedbackEffectUtils::Grid: |
449 effect = HbFeedback::SensitiveItem; |
461 effect = HbFeedback::BasicItem; |
450 break; |
462 break; |
451 |
463 |
452 case HbFeedbackEffectUtils::Slider: |
464 case HbFeedbackEffectUtils::Slider: |
453 |
465 |
454 // slider track default |
466 // slider track default |
455 effect = HbFeedback::SensitiveSlider; |
467 effect = HbFeedback::BasicSlider; |
456 |
468 |
457 // slider handle |
469 // slider handle |
458 if (modifiers & Hb::ModifierSliderHandle) { |
470 if (modifiers & Hb::ModifierSliderHandle) { |
459 effect = HbFeedback::SensitiveSlider; |
471 effect = HbFeedback::BasicSlider; |
460 } |
472 } |
461 |
473 |
462 // slider elements |
474 // slider elements |
463 if (modifiers & Hb::ModifierSliderElement) { |
475 if (modifiers & Hb::ModifierSliderElement) { |
464 effect = HbFeedback::SensitiveButton; |
476 effect = HbFeedback::None; |
465 } |
477 } |
466 break; |
478 break; |
467 |
479 |
468 case HbFeedbackEffectUtils::Editor: |
480 case HbFeedbackEffectUtils::Editor: |
469 effect = HbFeedback::None; |
481 effect = HbFeedback::None; |
477 if ( const HbAbstractViewItem * viewItem = qobject_cast<const HbAbstractViewItem *>(widget)) { |
489 if ( const HbAbstractViewItem * viewItem = qobject_cast<const HbAbstractViewItem *>(widget)) { |
478 const HbAbstractItemView* itemView = viewItem->itemView(); |
490 const HbAbstractItemView* itemView = viewItem->itemView(); |
479 if (itemView) { |
491 if (itemView) { |
480 switch (itemView->selectionMode()) { |
492 switch (itemView->selectionMode()) { |
481 case HbAbstractItemView::SingleSelection: |
493 case HbAbstractItemView::SingleSelection: |
482 effect = HbFeedback::Checkbox; // deferred from press |
494 effect = HbFeedback::Checkbox; |
483 break; |
495 break; |
484 case HbAbstractItemView::MultiSelection: { |
496 case HbAbstractItemView::MultiSelection: { |
485 effect = HbFeedback::None; |
497 effect = HbFeedback::None; |
486 break; |
498 break; |
487 } |
499 } |
660 else { |
674 else { |
661 effect = HbFeedback::TextSelection; |
675 effect = HbFeedback::TextSelection; |
662 } |
676 } |
663 } |
677 } |
664 } |
678 } |
|
679 else if (const HbInputVirtualRocker *trackPoint = qobject_cast<const HbInputVirtualRocker *>(widget)) { |
|
680 |
|
681 QGraphicsItem* graphicsItem = trackPoint->mainWindow()->scene()->focusItem(); |
|
682 |
|
683 if (graphicsItem->isWidget() && (static_cast<QGraphicsWidget*>(graphicsItem)->inherits("QGraphicsWebView"))) { |
|
684 QVariant v; |
|
685 v = graphicsItem->scene()->inputMethodQuery( Qt::ImCursorPosition ); |
|
686 if ( v.isValid() && v.canConvert<int>()) { |
|
687 int index; |
|
688 index = v.toInt(); |
|
689 QVariant varSurrText; |
|
690 varSurrText = graphicsItem->scene()->inputMethodQuery( Qt::ImSurroundingText ); |
|
691 if ( varSurrText.isValid() ) { |
|
692 QString text = varSurrText.toString(); |
|
693 // Index (current cursor position) can be equal to the |
|
694 // length of the string (for e.g. when the cursor is at the end) |
|
695 // So we make sure we bring index within the bounds of the string |
|
696 if (!text.isEmpty() && index <= text.count()) { |
|
697 dist = abs(index - previousCursorPosition); |
|
698 |
|
699 if (previousCursorPosition < index || index == text.count()) { |
|
700 index--; |
|
701 } |
|
702 QChar character = text.at(index); |
|
703 emptyline = character.category() == QChar::Separator_Paragraph; |
|
704 |
|
705 if (emptyline) { |
|
706 effect = HbFeedback::EmptyLineSelection; |
|
707 } |
|
708 else if (dist > 1) { |
|
709 effect = HbFeedback::LineSelection; |
|
710 } |
|
711 else if (character.isSpace()) { |
|
712 effect = HbFeedback::BlankSelection; |
|
713 } |
|
714 else { |
|
715 effect = HbFeedback::TextSelection; |
|
716 } |
|
717 } |
|
718 } |
|
719 } |
|
720 } |
|
721 } |
665 return effect; |
722 return effect; |
666 } |
723 } |
667 |
724 |
668 /*! |
725 /*! |
669 Checks if feedback is allowed for certain types of popup widgets. |
726 Checks if feedback is allowed for certain types of popup widgets. |
670 */ |
727 */ |
671 bool HbFeedbackEffectUtils::isFeedbackAllowedForPopup(const HbWidget *widget) |
728 bool HbFeedbackEffectUtils::isFeedbackAllowedForPopup(const HbWidget *widget) |
672 { |
729 { |
673 bool feedbackAllowed(false); |
730 bool feedbackAllowed(false); |
|
731 |
674 if (widgetFamily(widget) == HbFeedbackEffectUtils::Popup) { |
732 if (widgetFamily(widget) == HbFeedbackEffectUtils::Popup) { |
675 feedbackAllowed = true; |
733 feedbackAllowed = true; |
676 if (widget->type() == HbPrivate::ItemType_ToolTipLabel |
734 if (widget->type() == HbPrivate::ItemType_ToolTipLabel |
677 || widget->type() == Hb::ItemType_InputCharPreviewPane |
735 || widget->type() == Hb::ItemType_InputCharPreviewPane) { |
678 || widget->type() == Hb::ItemType_InputVkbWidget) { |
|
679 feedbackAllowed = false; |
736 feedbackAllowed = false; |
680 } |
737 } |
681 else if (QString(widget->metaObject()->className()) == "HbSelectionControl") { |
738 else if (QString(widget->metaObject()->className()) == "HbSelectionControl") { |
682 feedbackAllowed = false; |
739 feedbackAllowed = false; |
683 } |
740 } |
684 } |
741 } |
685 else if (QString(widget->metaObject()->className()) == "HbComboDropDown") { |
742 else if (QString(widget->metaObject()->className()) == "HbComboDropDown") { |
686 feedbackAllowed = true; |
743 feedbackAllowed = true; |
687 } |
744 } |
|
745 |
688 return feedbackAllowed; |
746 return feedbackAllowed; |
|
747 } |
|
748 |
|
749 /*! |
|
750 Returns the instant feedback effect for popup open event. |
|
751 */ |
|
752 HbFeedback::InstantEffect HbFeedbackEffectUtils::instantOnPopupOpened(const HbWidget *widget) { |
|
753 |
|
754 HbFeedback::InstantEffect effect = HbFeedback::None; |
|
755 |
|
756 if (QString(widget->metaObject()->className()) == "HbDeviceNotificationDialogWidget") { |
|
757 effect = HbFeedback::PopUp; |
|
758 } |
|
759 else { |
|
760 effect = HbFeedback::PopupOpen; |
|
761 } |
|
762 return effect; |
|
763 } |
|
764 |
|
765 /*! |
|
766 Returns the instant feedback effect for popup close event. |
|
767 */ |
|
768 HbFeedback::InstantEffect HbFeedbackEffectUtils::instantOnPopupClosed(const HbWidget *widget) { |
|
769 |
|
770 HbFeedback::InstantEffect effect = HbFeedback::None; |
|
771 |
|
772 if (QString(widget->metaObject()->className()) == "HbDeviceNotificationDialogWidget") { |
|
773 effect = HbFeedback::None; |
|
774 } |
|
775 else { |
|
776 effect = HbFeedback::PopupClose; |
|
777 } |
|
778 |
|
779 return effect; |
689 } |
780 } |
690 |
781 |
691 /*! |
782 /*! |
692 Returns the instant feedback effect on key press interaction. |
783 Returns the instant feedback effect on key press interaction. |
693 */ |
784 */ |