X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ffocus-manager%2Fkeyboard-focus-manager-impl.cpp;h=e6ed69168a0d0e16477516dd6574f03d8ad8ac3a;hp=d6ff3ab2976f66ade810d534984937d0aa1a86aa;hb=9cb232d3175473cbdcb4729432678bd2e0160007;hpb=d525dc67ca3cd8ef9a36464b8ea13e7f975d2f80 diff --git a/dali-toolkit/internal/focus-manager/keyboard-focus-manager-impl.cpp b/dali-toolkit/internal/focus-manager/keyboard-focus-manager-impl.cpp index d6ff3ab..e6ed691 100644 --- a/dali-toolkit/internal/focus-manager/keyboard-focus-manager-impl.cpp +++ b/dali-toolkit/internal/focus-manager/keyboard-focus-manager-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * Copyright (c) 2016 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,8 +26,9 @@ #include #include #include +#include #include -#include +#include #include #include @@ -78,9 +79,9 @@ BaseHandle Create() DALI_TYPE_REGISTRATION_BEGIN_CREATE( Toolkit::KeyboardFocusManager, Dali::BaseHandle, Create, true ) -DALI_SIGNAL_REGISTRATION( Toolkit, KeyboardFocusManager, "keyboardPreFocusChange", SIGNAL_PRE_FOCUS_CHANGE ) -DALI_SIGNAL_REGISTRATION( Toolkit, KeyboardFocusManager, "keyboardFocusChanged", SIGNAL_FOCUS_CHANGED ) -DALI_SIGNAL_REGISTRATION( Toolkit, KeyboardFocusManager, "keyboardFocusGroupChanged", SIGNAL_FOCUS_GROUP_CHANGED ) +DALI_SIGNAL_REGISTRATION( Toolkit, KeyboardFocusManager, "keyboardPreFocusChange", SIGNAL_PRE_FOCUS_CHANGE ) +DALI_SIGNAL_REGISTRATION( Toolkit, KeyboardFocusManager, "keyboardFocusChanged", SIGNAL_FOCUS_CHANGED ) +DALI_SIGNAL_REGISTRATION( Toolkit, KeyboardFocusManager, "keyboardFocusGroupChanged", SIGNAL_FOCUS_GROUP_CHANGED ) DALI_SIGNAL_REGISTRATION( Toolkit, KeyboardFocusManager, "keyboardFocusedActorEnterKey", SIGNAL_FOCUSED_ACTOR_ENTER_KEY ) DALI_TYPE_REGISTRATION_END() @@ -108,19 +109,17 @@ Toolkit::KeyboardFocusManager KeyboardFocusManager::Get() KeyboardFocusManager::KeyboardFocusManager() : mCurrentFocusActor(0), - mFocusIndicatorActor(Actor()), + mFocusIndicatorActor(), mFocusGroupLoopEnabled(false), mIsKeyboardFocusEnabled(false), mIsFocusIndicatorEnabled(false), mIsWaitingKeyboardFocusChangeCommit(false), mSlotDelegate(this) { - CreateDefaultFocusIndicatorActor(); - OnPhysicalKeyboardStatusChanged(PhysicalKeyboard::Get()); Toolkit::KeyInputFocusManager::Get().UnhandledKeyEventSignal().Connect(mSlotDelegate, &KeyboardFocusManager::OnKeyEvent); - Stage::GetCurrent().TouchedSignal().Connect(mSlotDelegate, &KeyboardFocusManager::OnTouched); + Stage::GetCurrent().TouchSignal().Connect( mSlotDelegate, &KeyboardFocusManager::OnTouch ); PhysicalKeyboard::Get().StatusChangedSignal().Connect(mSlotDelegate, &KeyboardFocusManager::OnPhysicalKeyboardStatusChanged); } @@ -128,7 +127,7 @@ KeyboardFocusManager::~KeyboardFocusManager() { } -bool KeyboardFocusManager::SetCurrentFocusActor(Actor actor) +bool KeyboardFocusManager::SetCurrentFocusActor( Actor actor ) { DALI_ASSERT_DEBUG( !mIsWaitingKeyboardFocusChangeCommit && "Calling this function in the PreFocusChangeSignal callback?" ); @@ -140,41 +139,41 @@ bool KeyboardFocusManager::SetCurrentFocusActor(Actor actor) return false; } -bool KeyboardFocusManager::DoSetCurrentFocusActor(const unsigned int actorID) +bool KeyboardFocusManager::DoSetCurrentFocusActor( const unsigned int actorID ) { Actor rootActor = Stage::GetCurrent().GetRootLayer(); - Actor actor = rootActor.FindChildById(actorID); + Actor actor = rootActor.FindChildById( actorID ); + bool success = false; - // Check whether the actor is in the stage - if(actor) + // Check whether the actor is in the stage and is keyboard focusable. + if( actor && actor.IsKeyboardFocusable() ) { - // Set the focus only when the actor is keyboard focusable - if(actor.IsKeyboardFocusable()) + mIsFocusIndicatorEnabled = true; + // Draw the focus indicator upon the focused actor when PhysicalKeyboard is attached + if( mIsKeyboardFocusEnabled ) { - // Draw the focus indicator upon the focused actor - if(mIsFocusIndicatorEnabled && mFocusIndicatorActor) - { - actor.Add(mFocusIndicatorActor); - } - - // Send notification for the change of focus actor - if( !mFocusChangedSignal.Empty() ) - { - mFocusChangedSignal.Emit(GetCurrentFocusActor(), actor); - } + actor.Add( GetFocusIndicatorActor() ); + } + // Send notification for the change of focus actor + if( !mFocusChangedSignal.Empty() ) + { + mFocusChangedSignal.Emit(GetCurrentFocusActor(), actor); + } - DALI_LOG_INFO( gLogFilter, Debug::General, "[%s:%d] Focus Changed\n", __FUNCTION__, __LINE__); + DALI_LOG_INFO( gLogFilter, Debug::General, "[%s:%d] Focus Changed\n", __FUNCTION__, __LINE__); - // Save the current focused actor - mCurrentFocusActor = actorID; + // Save the current focused actor + mCurrentFocusActor = actorID; - DALI_LOG_INFO( gLogFilter, Debug::General, "[%s:%d] SUCCEED\n", __FUNCTION__, __LINE__); - return true; - } + DALI_LOG_INFO( gLogFilter, Debug::General, "[%s:%d] SUCCEED\n", __FUNCTION__, __LINE__); + success = true; + } + else + { + DALI_LOG_WARNING("[%s:%d] FAILED\n", __FUNCTION__, __LINE__); } - DALI_LOG_WARNING("[%s:%d] FAILED\n", __FUNCTION__, __LINE__); - return false; + return success; } Actor KeyboardFocusManager::GetCurrentFocusActor() @@ -451,19 +450,17 @@ void KeyboardFocusManager::SetFocusIndicatorActor(Actor indicator) Actor KeyboardFocusManager::GetFocusIndicatorActor() { - return mFocusIndicatorActor; -} - -void KeyboardFocusManager::CreateDefaultFocusIndicatorActor() -{ - // Create a focus indicator actor shared by all the keyboard focusable actors - Toolkit::ImageView focusIndicator = Toolkit::ImageView::New(FOCUS_BORDER_IMAGE_PATH); - focusIndicator.SetPositionInheritanceMode( Dali::USE_PARENT_POSITION ); + if( ! mFocusIndicatorActor ) + { + // Create the default if it hasn't been set and one that's shared by all the keyboard focusable actors + mFocusIndicatorActor = Toolkit::ImageView::New( FOCUS_BORDER_IMAGE_PATH ); + mFocusIndicatorActor.SetParentOrigin( ParentOrigin::CENTER ); - // Apply size constraint to the focus indicator - focusIndicator.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS ); + // Apply size constraint to the focus indicator + mFocusIndicatorActor.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS ); + } - SetFocusIndicatorActor(focusIndicator); + return mFocusIndicatorActor; } void KeyboardFocusManager::OnPhysicalKeyboardStatusChanged(PhysicalKeyboard keyboard) @@ -476,10 +473,7 @@ void KeyboardFocusManager::OnPhysicalKeyboardStatusChanged(PhysicalKeyboard keyb Actor actor = GetCurrentFocusActor(); if(actor) { - if(mFocusIndicatorActor) - { - actor.Add(mFocusIndicatorActor); - } + actor.Add( GetFocusIndicatorActor() ); } mIsFocusIndicatorEnabled = true; } @@ -487,9 +481,9 @@ void KeyboardFocusManager::OnPhysicalKeyboardStatusChanged(PhysicalKeyboard keyb { // Hide indicator when keyboard focus turned off Actor actor = GetCurrentFocusActor(); - if(actor) + if( actor && mFocusIndicatorActor ) { - actor.Remove(mFocusIndicatorActor); + actor.Remove( mFocusIndicatorActor ); } mIsFocusIndicatorEnabled = false; } @@ -666,25 +660,25 @@ void KeyboardFocusManager::OnKeyEvent(const KeyEvent& event) if(isFocusStartableKey && mIsFocusIndicatorEnabled && !isAccessibilityEnabled) { Actor actor = GetCurrentFocusActor(); - if( !actor ) + if( actor ) + { + // Make sure the focused actor is highlighted + actor.Add( GetFocusIndicatorActor() ); + } + else { // No actor is focused but keyboard focus is activated by the key press // Let's try to move the initial focus MoveFocus(Toolkit::Control::KeyboardFocus::RIGHT); } - else if(mFocusIndicatorActor) - { - // Make sure the focused actor is highlighted - actor.Add(mFocusIndicatorActor); - } } } -void KeyboardFocusManager::OnTouched(const TouchEvent& touchEvent) +void KeyboardFocusManager::OnTouch(const TouchData& touch) { // Clear the focus when user touch the screen. // We only do this on a Down event, otherwise the clear action may override a manually focused actor. - if( ( touchEvent.GetPointCount() < 1 ) || ( touchEvent.GetPoint( 0 ).state == TouchPoint::Down ) ) + if( ( touch.GetPointCount() < 1 ) || ( touch.GetState( 0 ) == PointState::DOWN ) ) { ClearFocus(); } @@ -715,17 +709,17 @@ bool KeyboardFocusManager::DoConnectSignal( BaseObject* object, ConnectionTracke Dali::BaseHandle handle( object ); bool connected( true ); - KeyboardFocusManager* manager = dynamic_cast( object ); + KeyboardFocusManager* manager = static_cast< KeyboardFocusManager* >( object ); // TypeRegistry guarantees that this is the correct type. if( 0 == strcmp( signalName.c_str(), SIGNAL_PRE_FOCUS_CHANGE ) ) { manager->PreFocusChangeSignal().Connect( tracker, functor ); } - if( 0 == strcmp( signalName.c_str(), SIGNAL_FOCUS_CHANGED ) ) + else if( 0 == strcmp( signalName.c_str(), SIGNAL_FOCUS_CHANGED ) ) { manager->FocusChangedSignal().Connect( tracker, functor ); } - if( 0 == strcmp( signalName.c_str(), SIGNAL_FOCUS_GROUP_CHANGED ) ) + else if( 0 == strcmp( signalName.c_str(), SIGNAL_FOCUS_GROUP_CHANGED ) ) { manager->FocusGroupChangedSignal().Connect( tracker, functor ); }