X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ffocus-manager%2Fkeyboard-focus-manager-impl.h;h=4ab0ea35a81b081e785d1c30de06c6a54dfaed36;hb=ca99959003c0445d5afb437e2be26361dff51623;hp=a30b56206434c67ca8e52ed3d18ba33780d22eca;hpb=e2eda444afbe82e9591fe198eef339227f90a616;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-toolkit/internal/focus-manager/keyboard-focus-manager-impl.h b/dali-toolkit/internal/focus-manager/keyboard-focus-manager-impl.h index a30b562..4ab0ea3 100644 --- a/dali-toolkit/internal/focus-manager/keyboard-focus-manager-impl.h +++ b/dali-toolkit/internal/focus-manager/keyboard-focus-manager-impl.h @@ -1,32 +1,43 @@ -#ifndef __DALI_TOOLKIT_INTERNAL_KEYBOARD_FOCUS_MANAGER_H__ -#define __DALI_TOOLKIT_INTERNAL_KEYBOARD_FOCUS_MANAGER_H__ - -// -// Copyright (c) 2014 Samsung Electronics Co., Ltd. -// -// Licensed under the Flora License, Version 1.0 (the License); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://floralicense.org/license/ -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an AS IS BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// +#ifndef DALI_TOOLKIT_INTERNAL_KEYBOARD_FOCUS_MANAGER_H +#define DALI_TOOLKIT_INTERNAL_KEYBOARD_FOCUS_MANAGER_H + +/* + * Copyright (c) 2020 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ // EXTERNAL INCLUDES -#include +#include +#include +#include // INTERNAL INCLUDES -#include #include +#include +#include namespace Dali { +namespace Integration +{ + +class SceneHolder; + +} // namespace Integration + namespace Toolkit { @@ -36,10 +47,31 @@ namespace Internal /** * @copydoc Toolkit::KeyboardFocusManager */ -class KeyboardFocusManager : public Dali::BaseObject +class KeyboardFocusManager : public Dali::BaseObject, public ConnectionTracker { public: + typedef Toolkit::DevelKeyboardFocusManager::CustomAlgorithmInterface CustomAlgorithmInterface; + + enum FocusIndicatorState + { + UNKNOWN = -1, ///< Unknown state + HIDE = 0, ///< FocusIndicator is hidden + SHOW = 1, ///< FocusIndicator is shown + }; + + enum EnableFocusedIndicatorState + { + DISABLE = 0, ///< FocusIndicator is disable + ENABLE = 1, ///< FocusIndicator is enable + }; + + enum FocusedIndicatorModeState + { + NONE = 0, ///< Set nothing + ALWAYS_SHOW = 1, ///< FocusIndicator is always shown + }; + /** * @copydoc Toolkit::KeyboardFocusManager::Get */ @@ -63,7 +95,7 @@ public: /** * @copydoc Toolkit::KeyboardFocusManager::MoveFocus */ - bool MoveFocus(Toolkit::Control::KeyboardFocusNavigationDirection direction); + bool MoveFocus(Toolkit::Control::KeyboardFocus::Direction direction); /** * @copydoc Toolkit::KeyboardFocusManager::ClearFocus @@ -105,27 +137,47 @@ public: */ Actor GetFocusIndicatorActor(); + /** + * Move current focus to backward + */ + void MoveFocusBackward(); + + /** + * @copydoc Toolkit::DevelKeyboardFocusManager::SetCustomAlgorithm + */ + void SetCustomAlgorithm(CustomAlgorithmInterface& interface); + + /** + * @copydoc Toolkit::DevelKeyboardFocusManager::UseFocusIndicator + */ + void EnableFocusIndicator(bool enable); + + /** + * @copydoc Toolkit::DevelKeyboardFocusManager::UseFocusIndicator + */ + bool IsFocusIndicatorEnabled() const; + public: /** * @copydoc Toolkit::KeyboardFocusManager::PreFocusChangeSignal() */ - Toolkit::KeyboardFocusManager::PreFocusChangeSignalV2& PreFocusChangeSignal(); + Toolkit::KeyboardFocusManager::PreFocusChangeSignalType& PreFocusChangeSignal(); /** * @copydoc Toolkit::KeyboardFocusManager::FocusChangedSignal() */ - Toolkit::KeyboardFocusManager::FocusChangedSignalV2& FocusChangedSignal(); + Toolkit::KeyboardFocusManager::FocusChangedSignalType& FocusChangedSignal(); /** * @copydoc Toolkit::KeyboardFocusManager::FocusGroupChangedSignal() */ - Toolkit::KeyboardFocusManager::FocusGroupChangedSignalV2& FocusGroupChangedSignal(); + Toolkit::KeyboardFocusManager::FocusGroupChangedSignalType& FocusGroupChangedSignal(); /** - * @copydoc Toolkit::KeyboardFocusManager::FocusedActorActivatedSignal() + * @copydoc Toolkit::KeyboardFocusManager::FocusedActorEnterKeySignal() */ - Toolkit::KeyboardFocusManager::FocusedActorActivatedSignalV2& FocusedActorActivatedSignal(); + Toolkit::KeyboardFocusManager::FocusedActorEnterKeySignalType& FocusedActorEnterKeySignal(); /** * Connects a callback function with the object's signals. @@ -147,6 +199,25 @@ protected: private: + typedef std::vector< WeakHandle< Actor > > FocusStack; ///< Define Dali::Vector< Dali::BaseObject* > as FocusStack to contain focus history + typedef FocusStack::iterator FocusStackIterator; ///< Define FocusStack::Iterator as FocusStackIterator to navigate FocusStack + + /** + * This will be called when the adaptor is initialized + */ + void OnAdaptorInit(); + + /** + * This will be called when a new scene holder is created + * @param sceneHolder The new scene holder + */ + void OnSceneHolderCreated( Dali::Integration::SceneHolder& sceneHolder ); + + /** + * Get configuration from StyleManager. + */ + void GetConfigurationFromStyleManger(); + /** * Get the focus group of current focused actor. * @pre The FocusManager has been initialized. @@ -157,10 +228,10 @@ private: /** * Move the focus to the specified actor and send notification for the focus change. - * @param actorID The ID of the actor to be queried + * @param actor The actor to be queried * @return Whether the focus is successful or not */ - bool DoSetCurrentFocusActor(const unsigned int actorID); + bool DoSetCurrentFocusActor(Actor actor); /** * Move the focus to the next actor towards the specified direction within the layout control @@ -169,7 +240,7 @@ private: * @param direction The direction of focus movement * @return Whether the focus is successful or not */ - bool DoMoveFocusWithinLayoutControl(Toolkit::Control control, Actor actor, Toolkit::Control::KeyboardFocusNavigationDirection direction); + bool DoMoveFocusWithinLayoutControl(Toolkit::Control control, Actor actor, Toolkit::Control::KeyboardFocus::Direction direction); /** * Move the focus to the first focusable actor in the next focus group in the forward @@ -181,16 +252,11 @@ private: bool DoMoveFocusToNextFocusGroup(bool forward); /** - * Activate the actor. If the actor is control, call OnActivated virtual function. - * This function will emit FocusedActorActivatedSignal. - * @param actor The actor to activate - */ - void DoActivate(Actor actor); - - /** - * Create the default indicator actor to highlight the focused actor. + * Enter has been pressed on the actor. If the actor is control, call the OnKeybaordEnter virtual function. + * This function will emit FocusedActorEnterKeySignal. + * @param actor The actor to notify */ - void CreateDefaultFocusIndicatorActor(); + void DoKeyboardEnter( Actor actor ); /** * Check whether the actor is a layout control that supports two dimensional keyboard navigation. @@ -214,20 +280,26 @@ private: * Callback for the key event when no actor in the stage has gained the key input focus * @param[in] event The KeyEvent event. */ - void OnKeyEvent(const KeyEvent& event); + void OnKeyEvent( const KeyEvent& event ); /** * Callback for the touch event when the screen is touched and when the touch ends * (i.e. the down & up touch events only). - * @param[in] touchEvent The touch event + * @param[in] touch The touch information + */ + void OnTouch( const TouchEvent& touch ); + + /** + * Called when the window focus is changed. + * @param[in] window The window whose focus is changed + * @param[in] focusIn Whether the focus is in/out */ - void OnTouched(const TouchEvent& touchEvent); + void OnWindowFocusChanged( Window window, bool focusIn ); /** - * Change the keyboard focus status when keyboard focus feature turned on or off. - * @return Whether the status is changed or not. + * Get the focus Actor from current window */ - void OnPhysicalKeyboardStatusChanged(PhysicalKeyboard keyboard); + Actor GetFocusActorFromCurrentWindow(); private: @@ -238,24 +310,38 @@ private: private: - Toolkit::KeyboardFocusManager::PreFocusChangeSignalV2 mPreFocusChangeSignalV2; ///< The signal to notify the focus will be changed - Toolkit::KeyboardFocusManager::FocusChangedSignalV2 mFocusChangedSignalV2; ///< The signal to notify the focus change - Toolkit::KeyboardFocusManager::FocusGroupChangedSignalV2 mFocusGroupChangedSignalV2; ///< The signal to notify the focus group change - Toolkit::KeyboardFocusManager::FocusedActorActivatedSignalV2 mFocusedActorActivatedSignalV2; ///< The signal to notify the activation of focused actor + Toolkit::KeyboardFocusManager::PreFocusChangeSignalType mPreFocusChangeSignal; ///< The signal to notify the focus will be changed + Toolkit::KeyboardFocusManager::FocusChangedSignalType mFocusChangedSignal; ///< The signal to notify the focus change + Toolkit::KeyboardFocusManager::FocusGroupChangedSignalType mFocusGroupChangedSignal; ///< The signal to notify the focus group change + Toolkit::KeyboardFocusManager::FocusedActorEnterKeySignalType mFocusedActorEnterKeySignal; ///< The signal to notify that enter has been pressed on the focused actor - unsigned int mCurrentFocusActor; ///< The actor ID of current focused actor + WeakHandle< Actor > mCurrentFocusActor; ///< A weak handle to the current focused actor Actor mFocusIndicatorActor; ///< The focus indicator actor shared by all the keyboard focusable actors for highlight - bool mFocusGroupLoopEnabled:1; ///< Whether the focus movement is looped within the same focus group + FocusStack mFocusHistory; ///< Stack to contain pre-focused actor's BaseObject* + + SlotDelegate< KeyboardFocusManager > mSlotDelegate; + + CustomAlgorithmInterface* mCustomAlgorithmInterface; ///< The user's (application / toolkit) implementation of CustomAlgorithmInterface + + typedef std::vector< std::pair< WeakHandle< Layer >, WeakHandle< Actor > > > FocusActorContainer; - bool mIsKeyboardFocusEnabled:1; ///< Whether keyboard focus feature turned on/off + FocusActorContainer mCurrentFocusActors; ///< A container of focused actors - bool mIsFocusIndicatorEnabled:1; ///< Whether indicator should be shown / hidden. It could be enabled when keyboard focus feature enabled and navigation keys or 'Tab' key pressed. + WeakHandle< Layer > mCurrentFocusedWindow; ///< A weak handle to the current focused window's root layer + + FocusIndicatorState mIsFocusIndicatorShown; ///< Whether indicator should be shown / hidden when getting focus. It could be enabled when keyboard focus feature is enabled and navigation keys or 'Tab' key are pressed. + + EnableFocusedIndicatorState mEnableFocusIndicator; ///< Whether use focus indicator + + FocusedIndicatorModeState mAlwaysShowIndicator; ///< Whether always show indicator. If true, the indicator would be directly shown when focused + + bool mFocusGroupLoopEnabled:1; ///< Whether the focus movement is looped within the same focus group bool mIsWaitingKeyboardFocusChangeCommit:1; /// A flag to indicate PreFocusChangeSignal emitted but the proposed focus actor is not commited by the application yet. - SlotDelegate< KeyboardFocusManager > mSlotDelegate; + bool mClearFocusOnTouch:1; ///< Whether clear focus on touch. }; } // namespace Internal @@ -282,4 +368,4 @@ inline const Internal::KeyboardFocusManager& GetImpl(const Dali::Toolkit::Keyboa } // namespace Dali -#endif // __DALI_TOOLKIT_INTERNAL_KEYBOARD_FOCUS_MANAGER_H__ +#endif // DALI_TOOLKIT_INTERNAL_KEYBOARD_FOCUS_MANAGER_H