diff -r f7ac710697a9 -r 06ff229162e9 src/hbplugins/feedback/feedbackeffectplugin/hbfeedbackeffectengine.cpp --- a/src/hbplugins/feedback/feedbackeffectplugin/hbfeedbackeffectengine.cpp Mon May 03 12:48:33 2010 +0300 +++ b/src/hbplugins/feedback/feedbackeffectplugin/hbfeedbackeffectengine.cpp Fri May 14 16:09:54 2010 +0300 @@ -26,7 +26,6 @@ #include "hbfeedbackeffectengine.h" #include "hbfeedbackeffectutils.h" -#include #include #include @@ -42,24 +41,24 @@ #include "hbinputvirtualrocker.h" #include -/*! +/* Constructor */ HbFeedbackEffectEngine::HbFeedbackEffectEngine() : activelyScrollingItemView(0), previousCursorPosition(0) { - // initialize - HbFeedbackPlayer::instance(); + instantFeedback = new HbInstantFeedback(HbFeedback::None); } -/*! +/* Destructor */ HbFeedbackEffectEngine::~HbFeedbackEffectEngine() { - if (hbFeedbackPlayer) { - foreach(int identifier, continuousFeedbacks) { - hbFeedbackPlayer->cancelContinuousFeedback(identifier); - } + if(instantFeedback) + delete instantFeedback; + foreach(HbContinuousFeedback *feedback, continuousFeedbacks) { + feedback->stop(); + delete feedback; } continuousFeedbacks.clear(); @@ -230,7 +229,7 @@ } -/*! +/* Called by the feedback manager when an interaction is triggered. */ void HbFeedbackEffectEngine::triggered(const HbWidget *widget, Hb::InstantInteraction interaction, Hb::InteractionModifiers modifiers) @@ -265,7 +264,7 @@ } } -/*! +/* Called by the feedback manager when a widget is pressed. */ void HbFeedbackEffectEngine::pressed(const HbWidget *widget) @@ -289,7 +288,7 @@ playInstantFeedback(widget, effect, modalities); } -/*! +/* Called by the feedback manager when a widget is released. */ void HbFeedbackEffectEngine::released(const HbWidget *widget) @@ -343,7 +342,7 @@ // normally touch end feedback effect is initiated with a clicked signal } -/*! +/* Called by the feedback manager when a long press is detected for a widget. */ void HbFeedbackEffectEngine::longPressed(const HbWidget *widget) @@ -356,7 +355,7 @@ effect = overrider.newInstantEffect; } else { effect = HbFeedback::None; - if (widget->type() == Hb::ItemType_InputCharacterButton) { + if (widget->type() == Hb::ItemType_InputButtonGroup) { effect = HbFeedback::SensitiveKeypad; } else { @@ -374,7 +373,7 @@ } -/*! +/* Called by the feedback manager when a widget is clicked. */ void HbFeedbackEffectEngine::clicked(const HbWidget *widget) @@ -402,7 +401,7 @@ playInstantFeedback(widget, effect, modalities); } -/*! +/* Called by the feedback manager when keyrepeats are detected for a widget. */ void HbFeedbackEffectEngine::keyRepeated(const HbWidget *widget) @@ -426,7 +425,7 @@ playInstantFeedback(widget, effect, modalities); } -/*! +/* Called by the feedback manager when a dragged over event is detected for a widget. */ void HbFeedbackEffectEngine::draggedOver(const HbWidget *widget) @@ -476,7 +475,7 @@ playInstantFeedback(widget, effect, modalities); } -/*! +/* Called by the feedback manager when a widget is flicked. */ void HbFeedbackEffectEngine::flicked(const HbWidget *widget) @@ -500,7 +499,7 @@ playInstantFeedback(widget, effect, modalities); } -/*! +/* Called by the feedback manager when a scroll area widget is flicked or dragged and the boundary reached. */ void HbFeedbackEffectEngine::boundaryReached(const HbWidget *widget) @@ -508,7 +507,7 @@ boundaryWidgets.append(widget); } -/*! +/* Called by the feedback manager when a rotate gesture is recognized for a widget. */ void HbFeedbackEffectEngine::rotated90Degrees(const HbWidget *widget) @@ -533,7 +532,7 @@ playInstantFeedback(widget, effect, modalities); } -/*! +/* Called by the feedback manager when a popup opens. */ void HbFeedbackEffectEngine::popupOpened(const HbWidget *widget) @@ -556,7 +555,7 @@ } } -/*! +/* Called by the feedback manager when a popup closes. */ void HbFeedbackEffectEngine::popupClosed(const HbWidget *widget) @@ -579,7 +578,7 @@ } } -/*! +/* Called by the feedback manager when an item view selection has changed. */ void HbFeedbackEffectEngine::selectionChanged(const HbWidget *widget) @@ -603,7 +602,7 @@ playInstantFeedback(widget, effect, modalities); } -/*! +/* Called by the feedback manager when multitouch is activated. */ void HbFeedbackEffectEngine::multitouchActivated(const HbWidget *widget) @@ -627,7 +626,7 @@ playInstantFeedback(widget, effect, modalities); } -/*! +/* Called by the feedback manager when a continuous interaction is triggered. */ void HbFeedbackEffectEngine::continuousTriggered(const HbWidget *widget, Hb::ContinuousInteraction interaction, QPointF delta) @@ -706,6 +705,10 @@ activelyScrollingItemView = widget; newItemFound = false; } + // To prevent the uninitialized list to cause false new item detections + if (oldVisibleIndexes.empty()) { + newItemFound = false; + } oldVisibleIndexes.clear(); oldVisibleIndexes = visibleIndexes; @@ -750,7 +753,7 @@ } } -/*! +/* Called by the feedback manager when a continuous interaction is stopped. */ void HbFeedbackEffectEngine::continuousStopped(const HbWidget *widget, Hb::ContinuousInteraction interaction) @@ -788,60 +791,71 @@ } } -/*! +/* Plays the instant feedback. */ void HbFeedbackEffectEngine::playInstantFeedback(const HbWidget* widget, HbFeedback::InstantEffect effect, HbFeedback::Modalities modalities) { const QGraphicsView* view = widget->mainWindow(); - if (view && HbFeedbackEffectUtils::isFeedbackAllowed(widget)) { - HbInstantFeedback feedback(effect); - feedback.setRect(widget, view); - feedback.setOwningWindow(view); - feedback.setModalities(modalities); - - if (hbFeedbackPlayer && feedback.isLocated()) { - hbFeedbackPlayer->playInstantFeedback(feedback); + if (view && HbFeedbackEffectUtils::isFeedbackAllowed(widget) && instantFeedback) { + instantFeedback->setInstantEffect(effect); + instantFeedback->setRect(widget, view); + instantFeedback->setOwningWindow(view); + instantFeedback->setModalities(modalities); + + if (instantFeedback->isLocated()) { + instantFeedback->play(); } } } -/*! +/* Plays the continuous feedback. */ void HbFeedbackEffectEngine::playContinuousFeedback(const HbWidget* widget, HbFeedback::ContinuousEffect effect, int intensity, HbFeedback::Modalities modalities) { const QGraphicsView* view = widget->mainWindow(); + + // if feedback can be played if (view && HbFeedbackEffectUtils::isFeedbackAllowed(widget)) { - HbContinuousFeedback feedback(effect,view); - feedback.setRect(widget, view); - feedback.setIntensity(intensity); - feedback.setModalities(modalities); + + // if this widget has been playing + if (continuousFeedbacks.contains(widget)) { + HbContinuousFeedback* feedback = continuousFeedbacks.value(widget); - if (hbFeedbackPlayer && feedback.isLocated()) { - // if continuous feedback is still active and not stopped by continuous feedback timeout - if (continuousFeedbacks.contains(widget) - && hbFeedbackPlayer->continuousFeedbackOngoing(continuousFeedbacks.value(widget))) { - hbFeedbackPlayer->updateContinuousFeedback(continuousFeedbacks.value(widget), feedback); - } else { - // if timeout has happened remove the item from the map storing continuous feedback identifiers - if (continuousFeedbacks.contains(widget)) { - continuousFeedbacks.remove(widget); - } - // create a new continuous feedback - continuousFeedbacks.insert(widget, hbFeedbackPlayer->startContinuousFeedback(feedback)); + // if this feedback is already playing then only its effect and intensity are updated + feedback->setModalities(modalities); + feedback->setOwningWindow(view); + feedback->setRect(widget, view); + feedback->setContinuousEffect(effect); + feedback->setIntensity(intensity); + // if this feedback is not being played, play it + if (!feedback->isPlaying()) { + feedback->play(); } + } else { + // this widget has not played anything before + HbContinuousFeedback *feedback = new HbContinuousFeedback(); + feedback->setModalities(modalities); + feedback->setOwningWindow(view); + feedback->setRect(widget, view); + feedback->setContinuousEffect(effect); + feedback->setIntensity(intensity); + continuousFeedbacks.insert(widget, feedback); + feedback->play(); } } } -/*! +/* Cancels the playing of a continuous feedback. */ void HbFeedbackEffectEngine::cancelContinuousFeedback(const HbWidget* widget) { - if (hbFeedbackPlayer && continuousFeedbacks.contains(widget)) { - hbFeedbackPlayer->cancelContinuousFeedback(continuousFeedbacks.take(widget)); + if (continuousFeedbacks.contains(widget)) { + HbContinuousFeedback *feedback = continuousFeedbacks.take(widget); + feedback->stop(); + delete feedback; } }