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=d0daa9f8c0be0aab658a729ee7d4a52481016400;hp=df8d73aba52e26aa2b50154c88b1f20d843d4d5b;hb=7027b808143d4f086636c21597336d37678ccb2b;hpb=454a504d9a22ca1271d0065c42dfedc927897807 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 df8d73a..d0daa9f 100644 --- a/dali-toolkit/internal/focus-manager/keyboard-focus-manager-impl.cpp +++ b/dali-toolkit/internal/focus-manager/keyboard-focus-manager-impl.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -145,7 +146,8 @@ void KeyboardFocusManager::OnAdaptorInit() { (*iter).KeyEventSignal().Connect(mSlotDelegate, &KeyboardFocusManager::OnKeyEvent); (*iter).TouchedSignal().Connect(mSlotDelegate, &KeyboardFocusManager::OnTouch); - (*iter).WheelEventGeneratedSignal().Connect(mSlotDelegate, &KeyboardFocusManager::OnWheelEvent); + (*iter).WheelEventGeneratedSignal().Connect(mSlotDelegate, &KeyboardFocusManager::OnCustomWheelEvent); + (*iter).WheelEventSignal().Connect(mSlotDelegate, &KeyboardFocusManager::OnWheelEvent); Dali::Window window = DevelWindow::DownCast(*iter); if(window) { @@ -162,7 +164,8 @@ void KeyboardFocusManager::OnSceneHolderCreated(Dali::Integration::SceneHolder& { sceneHolder.KeyEventSignal().Connect(mSlotDelegate, &KeyboardFocusManager::OnKeyEvent); sceneHolder.TouchedSignal().Connect(mSlotDelegate, &KeyboardFocusManager::OnTouch); - sceneHolder.WheelEventGeneratedSignal().Connect(mSlotDelegate, &KeyboardFocusManager::OnWheelEvent); + sceneHolder.WheelEventGeneratedSignal().Connect(mSlotDelegate, &KeyboardFocusManager::OnCustomWheelEvent); + sceneHolder.WheelEventSignal().Connect(mSlotDelegate, &KeyboardFocusManager::OnWheelEvent); Dali::Window window = DevelWindow::DownCast(sceneHolder); if(window) { @@ -202,58 +205,44 @@ bool KeyboardFocusManager::DoSetCurrentFocusActor(Actor actor) { bool success = false; - // If the parent's KEYBOARD_FOCUSABLE_CHILDREN is false, it cannot have focus. - if(actor) + // Check whether the actor is in the stage and is keyboard focusable. + if(actor && + actor.GetProperty(Actor::Property::KEYBOARD_FOCUSABLE) && + actor.GetProperty(DevelActor::Property::USER_INTERACTION_ENABLED) && + actor.GetProperty(Actor::Property::CONNECTED_TO_SCENE) && + actor.GetProperty(Actor::Property::VISIBLE)) { + // If the parent's KEYBOARD_FOCUSABLE_CHILDREN is false or VISIBLE is false, it cannot have focus. Actor parent = actor.GetParent(); while(parent) { - if(!parent.GetProperty(DevelActor::Property::KEYBOARD_FOCUSABLE_CHILDREN)) + if(!parent.GetProperty(DevelActor::Property::KEYBOARD_FOCUSABLE_CHILDREN) || !parent.GetProperty(Actor::Property::VISIBLE)) { - DALI_LOG_INFO(gLogFilter, Debug::General, "[%s:%d] Parent Actor has KEYBOARD_FOCUSABLE_CHILDREN false,\n", __FUNCTION__, __LINE__); + DALI_LOG_INFO(gLogFilter, Debug::General, "[%s:%d] Parent Actor has KEYBOARD_FOCUSABLE_CHILDREN false or VISIBLE false,\n", __FUNCTION__, __LINE__); return false; } parent = parent.GetParent(); } - } - if(actor && actor.GetProperty(Actor::Property::KEYBOARD_FOCUSABLE) && actor.GetProperty(Actor::Property::CONNECTED_TO_SCENE)) - { - Integration::SceneHolder currentWindow = Integration::SceneHolder::Get(actor); + // If developer set focus on same actor, doing nothing + Actor currentFocusedActor = GetCurrentFocusActor(); + if(actor == currentFocusedActor) + { + return true; + } + Integration::SceneHolder currentWindow = Integration::SceneHolder::Get(actor); if(currentWindow.GetRootLayer() != mCurrentFocusedWindow.GetHandle()) { Layer rootLayer = currentWindow.GetRootLayer(); mCurrentFocusedWindow = rootLayer; } - } - - Actor currentFocusedActor = GetCurrentFocusActor(); - // If developer set focus on same actor, doing nothing - if(actor == currentFocusedActor) - { - if(!actor) - { - return false; - } - return true; - } - - // Check whether the actor is in the stage and is keyboard focusable. - if(actor && actor.GetProperty(Actor::Property::KEYBOARD_FOCUSABLE) && actor.GetProperty(Actor::Property::CONNECTED_TO_SCENE)) - { if((mIsFocusIndicatorShown == SHOW) && (mEnableFocusIndicator == ENABLE)) { actor.Add(GetFocusIndicatorActor()); } - // Send notification for the change of focus actor - if(!mFocusChangedSignal.Empty()) - { - mFocusChangedSignal.Emit(currentFocusedActor, actor); - } - Toolkit::Control currentlyFocusedControl = Toolkit::Control::DownCast(currentFocusedActor); if(currentlyFocusedControl) { @@ -262,8 +251,6 @@ bool KeyboardFocusManager::DoSetCurrentFocusActor(Actor actor) currentlyFocusedControl.ClearKeyInputFocus(); } - DALI_LOG_INFO(gLogFilter, Debug::General, "[%s:%d] Focus Changed\n", __FUNCTION__, __LINE__); - // Save the current focused actor mCurrentFocusActor = actor; @@ -300,6 +287,11 @@ bool KeyboardFocusManager::DoSetCurrentFocusActor(Actor actor) mFocusHistory.erase(beginPos); } + // Send notification for the change of focus actor + if(!mFocusChangedSignal.Empty()) + { + mFocusChangedSignal.Emit(currentFocusedActor, actor); + } DALI_LOG_INFO(gLogFilter, Debug::General, "[%s:%d] SUCCEED\n", __FUNCTION__, __LINE__); success = true; } @@ -470,6 +462,16 @@ bool KeyboardFocusManager::MoveFocus(Toolkit::Control::KeyboardFocus::Direction index = Toolkit::DevelControl::Property::DOWN_FOCUSABLE_ACTOR_ID; break; } + case Toolkit::Control::KeyboardFocus::CLOCKWISE: + { + index = Toolkit::DevelControl::Property::CLOCKWISE_FOCUSABLE_ACTOR_ID; + break; + } + case Toolkit::Control::KeyboardFocus::COUNTER_CLOCKWISE: + { + index = Toolkit::DevelControl::Property::COUNTER_CLOCKWISE_FOCUSABLE_ACTOR_ID; + break; + } default: break; } @@ -516,18 +518,32 @@ bool KeyboardFocusManager::MoveFocus(Toolkit::Control::KeyboardFocus::Direction nextFocusableActor = mPreFocusChangeSignal.Emit(currentFocusActor, Actor(), direction); mIsWaitingKeyboardFocusChangeCommit = false; } - else if(mEnableDefaultAlgorithm && currentFocusActor) + else if (mEnableDefaultAlgorithm) { - // We should find it among the actors nearby. - Integration::SceneHolder window = Integration::SceneHolder::Get(currentFocusActor); - if(window) + Layer rootLayer; + if (currentFocusActor) + { + // Find the window of the focused actor. + Integration::SceneHolder window = Integration::SceneHolder::Get(currentFocusActor); + if (window) + { + rootLayer = window.GetRootLayer(); + } + } + else + { + // Searches from the currently focused window. + rootLayer = mCurrentFocusedWindow.GetHandle(); + } + if (rootLayer) { - nextFocusableActor = Toolkit::FocusFinder::GetNearestFocusableActor(window.GetRootLayer(), currentFocusActor, direction); + // We should find it among the actors nearby. + nextFocusableActor = Toolkit::FocusFinder::GetNearestFocusableActor(rootLayer, currentFocusActor, direction); } } } - if(nextFocusableActor && nextFocusableActor.GetProperty(Actor::Property::KEYBOARD_FOCUSABLE)) + if(nextFocusableActor && nextFocusableActor.GetProperty(Actor::Property::KEYBOARD_FOCUSABLE) && nextFocusableActor.GetProperty(DevelActor::Property::USER_INTERACTION_ENABLED)) { // Whether the next focusable actor is a layout control if(IsLayoutControl(nextFocusableActor)) @@ -553,7 +569,7 @@ bool KeyboardFocusManager::DoMoveFocusWithinLayoutControl(Toolkit::Control contr Actor nextFocusableActor = GetImplementation(control).GetNextKeyboardFocusableActor(actor, direction, mFocusGroupLoopEnabled); if(nextFocusableActor) { - if(!nextFocusableActor.GetProperty(Actor::Property::KEYBOARD_FOCUSABLE)) + if(!(nextFocusableActor.GetProperty(Actor::Property::KEYBOARD_FOCUSABLE) || nextFocusableActor.GetProperty(DevelActor::Property::USER_INTERACTION_ENABLED))) { // If the actor is not focusable, ask the same layout control for the next actor to focus return DoMoveFocusWithinLayoutControl(control, nextFocusableActor, direction); @@ -572,7 +588,7 @@ bool KeyboardFocusManager::DoMoveFocusWithinLayoutControl(Toolkit::Control contr mIsWaitingKeyboardFocusChangeCommit = false; } - if(committedFocusActor && committedFocusActor.GetProperty(Actor::Property::KEYBOARD_FOCUSABLE)) + if(committedFocusActor && committedFocusActor.GetProperty(Actor::Property::KEYBOARD_FOCUSABLE) && committedFocusActor.GetProperty(DevelActor::Property::USER_INTERACTION_ENABLED)) { // Whether the commited focusable actor is a layout control if(IsLayoutControl(committedFocusActor)) @@ -654,14 +670,10 @@ void KeyboardFocusManager::DoKeyboardEnter(Actor actor) void KeyboardFocusManager::ClearFocus() { + ClearFocusIndicator(); Actor actor = GetCurrentFocusActor(); if(actor) { - if(mFocusIndicatorActor) - { - actor.Remove(mFocusIndicatorActor); - } - // Send notification for the change of focus actor if(!mFocusChangedSignal.Empty()) { @@ -675,8 +687,19 @@ void KeyboardFocusManager::ClearFocus() currentlyFocusedControl.ClearKeyInputFocus(); } } - mCurrentFocusActor.Reset(); +} + +void KeyboardFocusManager::ClearFocusIndicator() +{ + Actor actor = GetCurrentFocusActor(); + if(actor) + { + if(mFocusIndicatorActor) + { + actor.Remove(mFocusIndicatorActor); + } + } mIsFocusIndicatorShown = (mAlwaysShowIndicator == ALWAYS_SHOW) ? SHOW : HIDE; } @@ -978,34 +1001,56 @@ void KeyboardFocusManager::OnTouch(const TouchEvent& touch) // We only do this on a Down event, otherwise the clear action may override a manually focused actor. if(((touch.GetPointCount() < 1) || (touch.GetState(0) == PointState::DOWN))) { - // If mClearFocusOnTouch is false, do not clear the focus even if user touch the screen. - if(mClearFocusOnTouch) + // If you touch the currently focused actor again, you don't need to do SetCurrentFocusActor again. + Actor hitActor = touch.GetHitActor(0); + if(hitActor && hitActor == GetCurrentFocusActor()) { - ClearFocus(); + return; } - // If KEYBOARD_FOCUSABLE and TOUCH_FOCUSABLE is true, set focus actor - Actor hitActor = touch.GetHitActor(0); if(hitActor && hitActor.GetProperty(Actor::Property::KEYBOARD_FOCUSABLE) && hitActor.GetProperty(DevelActor::Property::TOUCH_FOCUSABLE)) { + // If mClearFocusOnTouch is false, do not clear the focus + if(mClearFocusOnTouch) + { + ClearFocus(); + } SetCurrentFocusActor(hitActor); } + else + { + // If mClearFocusOnTouch is false, do not clear the focus indicator even if user touch the screen. + if(mClearFocusOnTouch) + { + ClearFocusIndicator(); + } + } + } +} + +void KeyboardFocusManager::OnWheelEvent(const WheelEvent& event) +{ + if(event.GetType() == Dali::WheelEvent::CUSTOM_WHEEL) + { + Toolkit::Control::KeyboardFocus::Direction direction = (event.GetDelta() > 0) ? Toolkit::Control::KeyboardFocus::CLOCKWISE : Toolkit::Control::KeyboardFocus::COUNTER_CLOCKWISE; + // Move the focus + MoveFocus(direction); } } -bool KeyboardFocusManager::OnWheelEvent(const WheelEvent& event) +bool KeyboardFocusManager::OnCustomWheelEvent(const WheelEvent& event) { bool consumed = false; Actor actor = GetCurrentFocusActor(); if(actor) { // Notify the actor about the wheel event - consumed = EmitWheelSignals(actor, event); + consumed = EmitCustomWheelSignals(actor, event); } return consumed; } -bool KeyboardFocusManager::EmitWheelSignals(Actor actor, const WheelEvent& event) +bool KeyboardFocusManager::EmitCustomWheelSignals(Actor actor, const WheelEvent& event) { bool consumed = false; @@ -1028,7 +1073,7 @@ bool KeyboardFocusManager::EmitWheelSignals(Actor actor, const WheelEvent& event if(parent && (parent == oldParent)) { - consumed = EmitWheelSignals(parent, event); + consumed = EmitCustomWheelSignals(parent, event); } } }