const char* FOCUS_BORDER_IMAGE_PATH = DALI_IMAGE_DIR "B16-8_TTS_focus.png";
const Vector4 FOCUS_BORDER_IMAGE_BORDER = Vector4(7.0f, 7.0f, 7.0f, 7.0f);
+const char* FOCUS_SOUND_FILE = DALI_SOUND_DIR "Focus.ogg";
+const char* FOCUS_CHAIN_END_SOUND_FILE = DALI_SOUND_DIR "End_of_List.ogg";
+
/**
* The function to be used in the hit-test algorithm to check whether the actor is hittable.
*/
FocusManager::FocusManager()
: mIsWrapped(false),
mIsFocusWithinGroup(false),
+ mIsEndcapFeedbackEnabled(true),
+ mIsEndcapFeedbackPlayed(false),
mCurrentFocusActor(FocusIDPair(0, 0)),
mFocusIndicatorActor(Actor()),
mRecursiveFocusMoveCounter(0),
if(mIsAccessibilityTtsEnabled)
{
+ Dali::SoundPlayer soundPlayer = Dali::SoundPlayer::Get();
+ soundPlayer.PlaySound(FOCUS_SOUND_FILE);
+
// Play the accessibility attributes with the TTS player.
Dali::TtsPlayer player = Dali::TtsPlayer::Get(Dali::TtsPlayer::SCREEN_READER);
return mIsWrapped;
}
+void FocusManager::SetEndCapFeedbackEnabled(bool enabled)
+{
+ mIsEndcapFeedbackEnabled = enabled;
+}
+
+bool FocusManager::GetEndCapFeedbackEnabled() const
+{
+ return mIsEndcapFeedbackEnabled;
+}
+
void FocusManager::SetFocusIndicatorActor(Actor indicator)
{
mFocusIndicatorActor = indicator;
{
if(wrapped)
{
+ if(mIsEndcapFeedbackEnabled)
+ {
+ if(mIsEndcapFeedbackPlayed == false)
+ {
+ // play sound & skip to move once
+ Dali::SoundPlayer soundPlayer = Dali::SoundPlayer::Get();
+ soundPlayer.PlaySound(FOCUS_CHAIN_END_SOUND_FILE);
+
+ mIsEndcapFeedbackPlayed = true;
+ return true;
+ }
+ mIsEndcapFeedbackPlayed = false;
+ }
+
if(forward)
{
focusIDIter = mFocusIDContainer.begin();
}
else
{
+ if(mIsEndcapFeedbackEnabled)
+ {
+ Dali::SoundPlayer soundPlayer = Dali::SoundPlayer::Get();
+ soundPlayer.PlaySound(FOCUS_CHAIN_END_SOUND_FILE);
+ }
+
DALI_LOG_INFO( gLogFilter, Debug::General, "[%s:%d] Overshot\n", __FUNCTION__, __LINE__);
// Send notification for handling overshooted situation
mFocusOvershotSignalV2.Emit(GetCurrentFocusActor(), forward ? Toolkit::FocusManager::OVERSHOT_NEXT : Toolkit::FocusManager::OVERSHOT_PREVIOUS);
{
bool handled = false;
- Actor currentGesturedActor = GetCurrentFocusActor();
+ if( panEvent.state == Gesture::Started )
+ {
+ // Find the focusable actor at the event position
+ Dali::HitTestAlgorithm::Results results;
+ AccessibilityManager manager = AccessibilityManager::Get();
+
+ Dali::HitTestAlgorithm::HitTest( Stage::GetCurrent(), panEvent.currentPosition, results, IsActorFocusableFunction );
+ mCurrentGesturedActor = results.actor;
+
+ if(!mCurrentGesturedActor)
+ {
+ DALI_LOG_ERROR("Gesture detected, but no hit actor");
+ }
+ }
+
+ // Gesture::Finished (Up) events are delivered with previous (Motion) event position
+ // Use the real previous position; otherwise we may incorrectly get a ZERO velocity
+ if ( Gesture::Finished != panEvent.state )
+ {
+ // Store the previous position for next Gesture::Finished iteration.
+ mPreviousPosition = panEvent.previousPosition;
+ }
+
Actor rootActor = Stage::GetCurrent().GetRootLayer();
Dali::PanGesture pan(panEvent.state);
pan.time = panEvent.time;
pan.numberOfTouches = panEvent.numberOfTouches;
pan.screenPosition = panEvent.currentPosition;
- pan.screenDisplacement = panEvent.previousPosition - panEvent.currentPosition;
+ pan.screenDisplacement = mPreviousPosition - panEvent.currentPosition;
pan.screenVelocity.x = pan.screenDisplacement.x / panEvent.timeDelta;
pan.screenVelocity.y = pan.screenDisplacement.y / panEvent.timeDelta;
// Only handle the pan gesture when the current focused actor is scrollable or within a scrollable actor
- while(currentGesturedActor && currentGesturedActor != rootActor && !handled)
+ while(mCurrentGesturedActor && mCurrentGesturedActor != rootActor && !handled)
{
- Dali::Toolkit::Control control = Dali::Toolkit::Control::DownCast(currentGesturedActor);
+ Dali::Toolkit::Control control = Dali::Toolkit::Control::DownCast(mCurrentGesturedActor);
if(control)
{
Vector2 localCurrent;
pan.position = localCurrent;
Vector2 localPrevious;
- control.ScreenToLocal( localPrevious.x, localPrevious.y, panEvent.previousPosition.x, panEvent.previousPosition.y );
+ control.ScreenToLocal( localPrevious.x, localPrevious.y, mPreviousPosition.x, mPreviousPosition.y );
pan.displacement = localCurrent - localPrevious;
pan.velocity.x = pan.displacement.x / panEvent.timeDelta;
// If the gesture is not handled by the control, check its parent
if(!handled)
{
- currentGesturedActor = currentGesturedActor.GetParent();
+ mCurrentGesturedActor = mCurrentGesturedActor.GetParent();
+
+ if(!mCurrentGesturedActor)
+ {
+ DALI_LOG_ERROR("no more gestured actor");
+ }
}
else
{