/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2019 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.
#include <dali/public-api/actors/layer.h>
#include <dali/devel-api/adaptor-framework/accessibility-adaptor.h>
#include <dali/devel-api/adaptor-framework/singleton-service.h>
+#include <dali/devel-api/adaptor-framework/window-devel.h>
+#include <dali/devel-api/adaptor-framework/lifecycle-controller.h>
#include <dali/public-api/animation/constraints.h>
#include <dali/public-api/common/stage.h>
#include <dali/public-api/events/key-event.h>
#include <dali/public-api/object/type-registry-helper.h>
#include <dali/public-api/object/property-map.h>
#include <dali/public-api/images/resource-image.h>
+#include <dali/integration-api/adaptors/adaptor.h>
#include <dali/integration-api/debug.h>
// INTERNAL INCLUDES
mFocusedActorEnterKeySignal(),
mCurrentFocusActor(),
mFocusIndicatorActor(),
- mIsFocusIndicatorEnabled( -1 ),
+ mIsFocusIndicatorShown( -1 ),
mFocusGroupLoopEnabled( false ),
mIsWaitingKeyboardFocusChangeCommit( false ),
mClearFocusOnTouch( true ),
+ mEnableFocusIndicator( true ),
+ mAlwaysShowIndicator( true ),
mFocusHistory(),
mSlotDelegate( this ),
mCustomAlgorithmInterface(NULL)
{
- // TODO: Get FocusIndicatorEnable constant from stylesheet to set mIsFocusIndicatorEnabled.
- Stage::GetCurrent().KeyEventSignal().Connect( mSlotDelegate, &KeyboardFocusManager::OnKeyEvent);
- Stage::GetCurrent().TouchSignal().Connect( mSlotDelegate, &KeyboardFocusManager::OnTouch );
+ // TODO: Get FocusIndicatorEnable constant from stylesheet to set mIsFocusIndicatorShown.
+
+ LifecycleController::Get().InitSignal().Connect( mSlotDelegate, &KeyboardFocusManager::OnAdaptorInit );
+}
+
+void KeyboardFocusManager::OnAdaptorInit()
+{
+ if( Adaptor::IsAvailable() )
+ {
+ // Retrieve all the existing widnows
+ Dali::WindowContainer windows = Adaptor::Get().GetWindows();
+ for ( auto iter = windows.begin(); iter != windows.end(); ++iter )
+ {
+ DevelWindow::KeyEventSignal( *iter ).Connect( mSlotDelegate, &KeyboardFocusManager::OnKeyEvent);
+ DevelWindow::TouchSignal( *iter ).Connect( mSlotDelegate, &KeyboardFocusManager::OnTouch);
+ }
+
+ // Get notified when any new window is created afterwards
+ Adaptor::Get().WindowCreatedSignal().Connect( mSlotDelegate, &KeyboardFocusManager::OnWindowCreated);
+ }
+}
+
+void KeyboardFocusManager::OnWindowCreated( Dali::Window& window )
+{
+ DevelWindow::KeyEventSignal( window ).Connect( mSlotDelegate, &KeyboardFocusManager::OnKeyEvent);
+ DevelWindow::TouchSignal( window ).Connect( mSlotDelegate, &KeyboardFocusManager::OnTouch);
}
KeyboardFocusManager::~KeyboardFocusManager()
if( styleManager )
{
Property::Map config = Toolkit::DevelStyleManager::GetConfigurations( styleManager );
- mIsFocusIndicatorEnabled = static_cast<int>(config["alwaysShowFocus"].Get<bool>());
- mClearFocusOnTouch = mIsFocusIndicatorEnabled ? false : true;
+ mAlwaysShowIndicator = config["alwaysShowFocus"].Get<bool>();
+ mIsFocusIndicatorShown = static_cast<int>(mAlwaysShowIndicator);
+ mClearFocusOnTouch = mIsFocusIndicatorShown ? false : true;
}
}
{
DALI_ASSERT_DEBUG( !mIsWaitingKeyboardFocusChangeCommit && "Calling this function in the PreFocusChangeSignal callback?" );
- if( mIsFocusIndicatorEnabled == -1 )
+ if( mIsFocusIndicatorShown == -1 )
{
GetConfigurationFromStyleManger();
}
// Check whether the actor is in the stage and is keyboard focusable.
if( actor && actor.IsKeyboardFocusable() && actor.OnStage() )
{
- if( mIsFocusIndicatorEnabled )
+ if( mIsFocusIndicatorShown && mEnableFocusIndicator )
{
actor.Add( GetFocusIndicatorActor() );
}
Toolkit::Control KeyboardFocusManager::GetParentLayoutControl(Actor actor) const
{
// Get the actor's parent layout control that supports two dimensional keyboard navigation
- Actor rootActor = Stage::GetCurrent().GetRootLayer();
+ Actor rootActor;
Actor parent;
if(actor)
{
+ rootActor = DevelWindow::Get( actor ).GetRootLayer();
parent = actor.GetParent();
}
if( !nextFocusableActor )
{
- nextFocusableActor = Stage::GetCurrent().GetRootLayer().FindChildById( actorId );
+ nextFocusableActor = DevelWindow::Get( currentFocusActor ).GetRootLayer().FindChildById( actorId );
}
}
}
}
mCurrentFocusActor.Reset();
- mIsFocusIndicatorEnabled = 0;
+ mIsFocusIndicatorShown = static_cast<int>(mAlwaysShowIndicator);
}
void KeyboardFocusManager::SetFocusGroupLoop(bool enabled)
std::string keyName = event.keyPressedName;
- if( mIsFocusIndicatorEnabled == -1 )
+ if( mIsFocusIndicatorShown == -1 )
{
GetConfigurationFromStyleManger();
}
{
if(!isAccessibilityEnabled)
{
- if(!mIsFocusIndicatorEnabled)
+ if(!mIsFocusIndicatorShown)
{
// Show focus indicator
- mIsFocusIndicatorEnabled = 1;
+ mIsFocusIndicatorShown = 1;
}
else
{
{
if(!isAccessibilityEnabled)
{
- if(!mIsFocusIndicatorEnabled)
+ if(!mIsFocusIndicatorShown)
{
// Show focus indicator
- mIsFocusIndicatorEnabled = 1;
+ mIsFocusIndicatorShown = 1;
}
else
{
}
else if (keyName == "Up" && !isAccessibilityEnabled)
{
- if(!mIsFocusIndicatorEnabled)
+ if(!mIsFocusIndicatorShown)
{
// Show focus indicator
- mIsFocusIndicatorEnabled = 1;
+ mIsFocusIndicatorShown = 1;
}
else
{
}
else if (keyName == "Down" && !isAccessibilityEnabled)
{
- if(!mIsFocusIndicatorEnabled)
+ if(!mIsFocusIndicatorShown)
{
// Show focus indicator
- mIsFocusIndicatorEnabled = 1;
+ mIsFocusIndicatorShown = 1;
}
else
{
}
else if (keyName == "Prior" && !isAccessibilityEnabled)
{
- if(!mIsFocusIndicatorEnabled)
+ if(!mIsFocusIndicatorShown)
{
// Show focus indicator
- mIsFocusIndicatorEnabled = 1;
+ mIsFocusIndicatorShown = 1;
}
else
{
}
else if (keyName == "Next" && !isAccessibilityEnabled)
{
- if(!mIsFocusIndicatorEnabled)
+ if(!mIsFocusIndicatorShown)
{
// Show focus indicator
- mIsFocusIndicatorEnabled = 1;
+ mIsFocusIndicatorShown = 1;
}
else
{
}
else if (keyName == "Tab" && !isAccessibilityEnabled)
{
- if(!mIsFocusIndicatorEnabled)
+ if(!mIsFocusIndicatorShown)
{
// Show focus indicator
- mIsFocusIndicatorEnabled = 1;
+ mIsFocusIndicatorShown = 1;
}
else
{
}
else if (keyName == "space" && !isAccessibilityEnabled)
{
- if(!mIsFocusIndicatorEnabled)
+ if(!mIsFocusIndicatorShown)
{
// Show focus indicator
- mIsFocusIndicatorEnabled = 1;
+ mIsFocusIndicatorShown = 1;
}
isFocusStartableKey = true;
else if (keyName == "" && !isAccessibilityEnabled)
{
// Check the fake key event for evas-plugin case
- if(!mIsFocusIndicatorEnabled)
+ if(!mIsFocusIndicatorShown)
{
// Show focus indicator
- mIsFocusIndicatorEnabled = 1;
+ mIsFocusIndicatorShown = 1;
}
isFocusStartableKey = true;
{
if (keyName == "Return")
{
- if(!mIsFocusIndicatorEnabled && !isAccessibilityEnabled)
+ if(!mIsFocusIndicatorShown && !isAccessibilityEnabled)
{
// Show focus indicator
- mIsFocusIndicatorEnabled = 1;
+ mIsFocusIndicatorShown = 1;
}
else
{
}
}
- if(isFocusStartableKey && mIsFocusIndicatorEnabled && !isAccessibilityEnabled)
+ if(isFocusStartableKey && mIsFocusIndicatorShown && !isAccessibilityEnabled)
{
Actor actor = GetCurrentFocusActor();
if( actor )
{
- // Make sure the focused actor is highlighted
- actor.Add( GetFocusIndicatorActor() );
+ if( mEnableFocusIndicator )
+ {
+ // Make sure the focused actor is highlighted
+ actor.Add( GetFocusIndicatorActor() );
+ }
}
else
{
void KeyboardFocusManager::OnTouch(const TouchData& touch)
{
- // if mIsFocusIndicatorEnabled is -1, it means Configuration is not loaded.
+ // if mIsFocusIndicatorShown is -1, it means Configuration is not loaded.
// Try to load configuration.
- if( mIsFocusIndicatorEnabled == -1 )
+ if( mIsFocusIndicatorShown == -1 )
{
GetConfigurationFromStyleManger();
}
mCustomAlgorithmInterface = &interface;
}
+void KeyboardFocusManager::EnableFocusIndicator(bool enable)
+{
+ if( !enable && mFocusIndicatorActor )
+ {
+ mFocusIndicatorActor.Unparent();
+ }
+
+ mEnableFocusIndicator = enable;
+}
+
+bool KeyboardFocusManager::IsFocusIndicatorEnabled() const
+{
+ return mEnableFocusIndicator;
+}
+
} // namespace Internal
} // namespace Toolkit