X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ffocus-manager%2Fkeyboard-focus-manager-impl.cpp;h=4afb39a01a6ade2f8d0d90798c9e59b1e54066b6;hb=7562b511d06c8a8157883e35308aaa65e4e10810;hp=c03b7dd4df6ea7b337233b174d06cd887da74323;hpb=2d59f0b716ea7f7c06de0732d3e4e78aea127de6;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git 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 c03b7dd..4afb39a 100644 --- a/dali-toolkit/internal/focus-manager/keyboard-focus-manager-impl.cpp +++ b/dali-toolkit/internal/focus-manager/keyboard-focus-manager-impl.cpp @@ -127,7 +127,8 @@ KeyboardFocusManager::KeyboardFocusManager() mAlwaysShowIndicator(ALWAYS_SHOW), mFocusGroupLoopEnabled(false), mIsWaitingKeyboardFocusChangeCommit(false), - mClearFocusOnTouch(true) + mClearFocusOnTouch(true), + mEnableDefaultAlgorithm(false) { // TODO: Get FocusIndicatorEnable constant from stylesheet to set mIsFocusIndicatorShown. @@ -144,6 +145,7 @@ void KeyboardFocusManager::OnAdaptorInit() { (*iter).KeyEventSignal().Connect(mSlotDelegate, &KeyboardFocusManager::OnKeyEvent); (*iter).TouchedSignal().Connect(mSlotDelegate, &KeyboardFocusManager::OnTouch); + (*iter).WheelEventGeneratedSignal().Connect(mSlotDelegate, &KeyboardFocusManager::OnWheelEvent); Dali::Window window = DevelWindow::DownCast(*iter); if(window) { @@ -160,6 +162,7 @@ void KeyboardFocusManager::OnSceneHolderCreated(Dali::Integration::SceneHolder& { sceneHolder.KeyEventSignal().Connect(mSlotDelegate, &KeyboardFocusManager::OnKeyEvent); sceneHolder.TouchedSignal().Connect(mSlotDelegate, &KeyboardFocusManager::OnTouch); + sceneHolder.WheelEventGeneratedSignal().Connect(mSlotDelegate, &KeyboardFocusManager::OnWheelEvent); Dali::Window window = DevelWindow::DownCast(sceneHolder); if(window) { @@ -198,6 +201,22 @@ bool KeyboardFocusManager::SetCurrentFocusActor(Actor actor) bool KeyboardFocusManager::DoSetCurrentFocusActor(Actor actor) { bool success = false; + + // If the parent's KEYBOARD_FOCUSABLE_CHILDREN is false, it cannot have focus. + if(actor) + { + Actor parent = actor.GetParent(); + while(parent) + { + if(!parent.GetProperty(DevelActor::Property::KEYBOARD_FOCUSABLE_CHILDREN)) + { + DALI_LOG_INFO(gLogFilter, Debug::General, "[%s:%d] Parent Actor has KEYBOARD_FOCUSABLE_CHILDREN 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); @@ -497,10 +516,14 @@ bool KeyboardFocusManager::MoveFocus(Toolkit::Control::KeyboardFocus::Direction nextFocusableActor = mPreFocusChangeSignal.Emit(currentFocusActor, Actor(), direction); mIsWaitingKeyboardFocusChangeCommit = false; } - else + else if(mEnableDefaultAlgorithm && currentFocusActor) { // We should find it among the actors nearby. - nextFocusableActor = Toolkit::FocusFinder::GetNearestFocusableActor(currentFocusActor, direction); + Integration::SceneHolder window = Integration::SceneHolder::Get(currentFocusActor); + if(window) + { + nextFocusableActor = Toolkit::FocusFinder::GetNearestFocusableActor(window.GetRootLayer(), currentFocusActor, direction); + } } } @@ -880,12 +903,8 @@ void KeyboardFocusManager::OnKeyEvent(const KeyEvent& event) // "Shift-Tab" key changes it in the backward direction. if(!DoMoveFocusToNextFocusGroup(!event.IsShiftModifier())) { - // If the focus group is not changed, Move the focus towards right, "Shift-Tap" key moves the focus towards left. - if(!MoveFocus(event.IsShiftModifier() ? Toolkit::Control::KeyboardFocus::LEFT : Toolkit::Control::KeyboardFocus::RIGHT)) - { - // If the focus is not moved, Move the focus towards down, "Shift-Tap" key moves the focus towards up. - MoveFocus(event.IsShiftModifier() ? Toolkit::Control::KeyboardFocus::UP : Toolkit::Control::KeyboardFocus::DOWN); - } + // If the focus group is not changed, Move the focus towards forward, "Shift-Tap" key moves the focus towards backward. + MoveFocus(event.IsShiftModifier() ? Toolkit::Control::KeyboardFocus::BACKWARD : Toolkit::Control::KeyboardFocus::FORWARD); } } @@ -991,6 +1010,49 @@ void KeyboardFocusManager::OnTouch(const TouchEvent& touch) } } +bool KeyboardFocusManager::OnWheelEvent(const WheelEvent& event) +{ + bool consumed = false; + Actor actor = GetCurrentFocusActor(); + if(actor) + { + // Notify the actor about the wheel event + consumed = EmitWheelSignals(actor, event); + } + return consumed; +} + +bool KeyboardFocusManager::EmitWheelSignals(Actor actor, const WheelEvent& event) +{ + bool consumed = false; + + if(actor) + { + Dali::Actor oldParent(actor.GetParent()); + + // Only do the conversion and emit the signal if the actor's wheel signal has connections. + if(!actor.WheelEventSignal().Empty()) + { + // Emit the signal to the parent + consumed = actor.WheelEventSignal().Emit(actor, event); + } + // if actor doesn't consume WheelEvent, give WheelEvent to its parent. + if(!consumed) + { + // The actor may have been removed/reparented during the signal callbacks. + Dali::Actor parent = actor.GetParent(); + + if(parent && + (parent == oldParent)) + { + consumed = EmitWheelSignals(parent, event); + } + } + } + + return consumed; +} + void KeyboardFocusManager::OnWindowFocusChanged(Window window, bool focusIn) { if(focusIn && mCurrentFocusedWindow.GetHandle() != window.GetRootLayer()) @@ -1084,6 +1146,16 @@ bool KeyboardFocusManager::IsFocusIndicatorEnabled() const return (mEnableFocusIndicator == ENABLE); } +void KeyboardFocusManager::EnableDefaultAlgorithm(bool enable) +{ + mEnableDefaultAlgorithm = enable; +} + +bool KeyboardFocusManager::IsDefaultAlgorithmEnabled() const +{ + return mEnableDefaultAlgorithm; +} + } // namespace Internal } // namespace Toolkit