/*
- * Copyright (c) 2018 Samsung Electronics Co., Ltd.
+ * 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.
#include <dali/public-api/object/type-registry.h>
#include <dali/internal/event/actors/layer-list.h>
#include <dali/internal/event/common/property-helper.h>
-#include <dali/internal/event/common/stage-impl.h>
+#include <dali/internal/event/common/scene-impl.h>
+#include <dali/internal/event/common/event-thread-services.h>
using Dali::Internal::SceneGraph::UpdateManager;
typedef Layer::Behavior Behavior;
DALI_ENUM_TO_STRING_TABLE_BEGIN( BEHAVIOR )
-DALI_ENUM_TO_STRING_WITH_SCOPE( Layer, LAYER_2D )
+DALI_ENUM_TO_STRING_WITH_SCOPE( Layer, LAYER_UI )
DALI_ENUM_TO_STRING_WITH_SCOPE( Layer, LAYER_3D )
DALI_ENUM_TO_STRING_TABLE_END( BEHAVIOR )
DALI_PROPERTY_TABLE_BEGIN
DALI_PROPERTY( "clippingEnable", BOOLEAN, true, false, true, Dali::Layer::Property::CLIPPING_ENABLE )
DALI_PROPERTY( "clippingBox", RECTANGLE, true, false, true, Dali::Layer::Property::CLIPPING_BOX )
-DALI_PROPERTY( "behavior", STRING, true, false, false, Dali::Layer::Property::BEHAVIOR )
+DALI_PROPERTY( "behavior", INTEGER, true, false, false, Dali::Layer::Property::BEHAVIOR )
+DALI_PROPERTY( "depth", INTEGER, false, false, false, Dali::Layer::Property::DEPTH )
+DALI_PROPERTY( "depthTest", BOOLEAN, true, false, false, Dali::Layer::Property::DEPTH_TEST )
+DALI_PROPERTY( "consumesTouch", BOOLEAN, true, false, false, Dali::Layer::Property::CONSUMES_TOUCH )
+DALI_PROPERTY( "consumesHover", BOOLEAN, true, false, false, Dali::Layer::Property::CONSUMES_HOVER )
DALI_PROPERTY_TABLE_END( DEFAULT_DERIVED_ACTOR_PROPERTY_START_INDEX, LayerDefaultProperties )
// Actions
-const char* const ACTION_RAISE = "raise";
-const char* const ACTION_LOWER = "lower";
-const char* const ACTION_RAISE_TO_TOP = "raiseToTop";
-const char* const ACTION_LOWER_TO_BOTTOM = "lowerToBottom";
+static constexpr std::string_view ACTION_RAISE = "raise";
+static constexpr std::string_view ACTION_LOWER = "lower";
+static constexpr std::string_view ACTION_RAISE_TO_TOP = "raiseToTop";
+static constexpr std::string_view ACTION_LOWER_TO_BOTTOM = "lowerToBottom";
BaseHandle Create()
{
TypeRegistration mType( typeid( Dali::Layer ), typeid( Dali::Actor ), Create, LayerDefaultProperties );
-TypeAction a1( mType, ACTION_RAISE, &Layer::DoAction );
-TypeAction a2( mType, ACTION_LOWER, &Layer::DoAction );
-TypeAction a3( mType, ACTION_RAISE_TO_TOP, &Layer::DoAction );
-TypeAction a4( mType, ACTION_LOWER_TO_BOTTOM, &Layer::DoAction );
+TypeAction a1(mType, std::string(ACTION_RAISE), &Layer::DoAction);
+TypeAction a2(mType, std::string(ACTION_LOWER), &Layer::DoAction);
+TypeAction a3(mType, std::string(ACTION_RAISE_TO_TOP), &Layer::DoAction);
+TypeAction a4(mType, std::string(ACTION_LOWER_TO_BOTTOM), &Layer::DoAction);
} // unnamed namespace
LayerPtr Layer::New()
{
- LayerPtr layer( new Layer( Actor::LAYER ) );
+ // create node, nodes are owned by UpdateManager
+ SceneGraph::Layer* layerNode = SceneGraph::Layer::New();
+ OwnerPointer< SceneGraph::Node > transferOwnership( layerNode );
+ AddNodeMessage( EventThreadServices::Get().GetUpdateManager(), transferOwnership );
+ LayerPtr layer( new Layer( Actor::LAYER, *layerNode ) );
// Second-phase construction
layer->Initialize();
return layer;
}
-LayerPtr Layer::NewRoot( LayerList& layerList, UpdateManager& manager )
+LayerPtr Layer::NewRoot( LayerList& layerList )
{
- LayerPtr root( new Layer( Actor::ROOT_LAYER ) );
-
- // Second-phase construction, keep a raw pointer to the layer node.
- SceneGraph::Layer* rootLayer = static_cast<SceneGraph::Layer*>( root->CreateNode() );
- root->mNode = rootLayer;
+ // create node, nodes are owned by UpdateManager
+ SceneGraph::Layer* rootLayer = SceneGraph::Layer::New();
OwnerPointer< SceneGraph::Layer > transferOwnership( rootLayer );
- InstallRootMessage( manager, transferOwnership );
+ InstallRootMessage( EventThreadServices::Get().GetUpdateManager(), transferOwnership );
+
+ LayerPtr root( new Layer( Actor::ROOT_LAYER, *rootLayer ) );
// root actor is immediately considered to be on-stage
- root->mIsOnStage = true;
+ root->mIsOnScene = true;
// The root actor will not emit a stage connection signal so set the signalled flag here as well
- root->mOnStageSignalled = true;
+ root->mOnSceneSignalled = true;
// layer-list must be set for the root layer
root->mLayerList = &layerList;
return root;
}
-Layer::Layer( Actor::DerivedType type )
-: Actor( type ),
- mLayerList( NULL ),
+Layer::Layer( Actor::DerivedType type, const SceneGraph::Layer& layer )
+: Actor( type, layer ),
+ mLayerList( nullptr ),
mClippingBox( 0, 0, 0, 0 ),
mSortFunction( Layer::ZValue ),
- mBehavior( Dali::Layer::LAYER_2D ),
+ mBehavior( Dali::Layer::LAYER_UI ),
mIsClipping( false ),
mDepthTestDisabled( true ),
mTouchConsumed( false ),
Layer::~Layer()
{
+ if ( mIsRoot )
+ {
+ // Guard to allow handle destruction after Core has been destroyed
+ if( EventThreadServices::IsCoreRunning() )
+ {
+ UninstallRootMessage( GetEventThreadServices().GetUpdateManager(), &GetSceneGraphLayer() );
+
+ GetEventThreadServices().UnregisterObject( this );
+ }
+ }
}
unsigned int Layer::GetDepth() const
void Layer::RaiseAbove( const Internal::Layer& target )
{
- // cannot raise above ourself, both have to be on stage
- if( ( this != &target ) && OnStage() && target.OnStage() )
+ // cannot raise above ourself, both have to be on the scene
+ if( ( this != &target ) && OnScene() && target.OnScene() )
{
// get parameters depth
const uint32_t targetDepth = target.GetDepth();
void Layer::LowerBelow( const Internal::Layer& target )
{
- // cannot lower below ourself, both have to be on stage
- if( ( this != &target ) && OnStage() && target.OnStage() )
+ // cannot lower below ourself, both have to be on the scene
+ if( ( this != &target ) && OnScene() && target.OnScene() )
{
// get parameters depth
const uint32_t targetDepth = target.GetDepth();
void Layer::MoveAbove( const Internal::Layer& target )
{
- // cannot raise above ourself, both have to be on stage
- if( ( this != &target ) && mLayerList && target.OnStage() )
+ // cannot raise above ourself, both have to be on the scene
+ if( ( this != &target ) && mLayerList && target.OnScene() )
{
mLayerList->MoveLayerAbove(*this, target );
}
void Layer::MoveBelow( const Internal::Layer& target )
{
- // cannot lower below ourself, both have to be on stage
- if( ( this != &target ) && mLayerList && target.OnStage() )
+ // cannot lower below ourself, both have to be on the scene
+ if( ( this != &target ) && mLayerList && target.OnScene() )
{
mLayerList->MoveLayerBelow(*this, target );
}
mBehavior = behavior;
// Notify update side object.
- SetBehaviorMessage( GetEventThreadServices(), GetSceneLayerOnStage(), behavior );
- // By default, disable depth test for LAYER_2D, and enable for LAYER_3D.
- SetDepthTestDisabled( mBehavior == Dali::Layer::LAYER_2D );
+ SetBehaviorMessage( GetEventThreadServices(), GetSceneGraphLayer(), behavior );
+ // By default, disable depth test for LAYER_UI, and enable for LAYER_3D.
+ SetDepthTestDisabled( mBehavior == Dali::Layer::LAYER_UI );
}
void Layer::SetClipping(bool enabled)
mIsClipping = enabled;
// layerNode is being used in a separate thread; queue a message to set the value
- SetClippingMessage( GetEventThreadServices(), GetSceneLayerOnStage(), mIsClipping );
+ SetClippingMessage( GetEventThreadServices(), GetSceneGraphLayer(), mIsClipping );
}
}
// Convert mClippingBox to GL based coordinates (from bottom-left)
ClippingBox clippingBox( mClippingBox );
- StagePtr stage = Stage::GetCurrent();
- if( stage )
+ if( mScene )
{
- clippingBox.y = static_cast<int32_t>( stage->GetSize().height ) - clippingBox.y - clippingBox.height;
+ clippingBox.y = static_cast<int32_t>( mScene->GetSize().height ) - clippingBox.y - clippingBox.height;
// layerNode is being used in a separate thread; queue a message to set the value
- SetClippingBoxMessage( GetEventThreadServices(), GetSceneLayerOnStage(), clippingBox );
+ SetClippingBoxMessage( GetEventThreadServices(), GetSceneGraphLayer(), clippingBox );
}
}
}
// Send message.
// layerNode is being used in a separate thread; queue a message to set the value
- SetDepthTestDisabledMessage( GetEventThreadServices(), GetSceneLayerOnStage(), mDepthTestDisabled );
+ SetDepthTestDisabledMessage( GetEventThreadServices(), GetSceneGraphLayer(), mDepthTestDisabled );
}
}
mSortFunction = function;
// layerNode is being used in a separate thread; queue a message to set the value
- SetSortFunctionMessage( GetEventThreadServices(), GetSceneLayerOnStage(), mSortFunction );
+ SetSortFunctionMessage( GetEventThreadServices(), GetSceneGraphLayer(), mSortFunction );
}
}
return mHoverConsumed;
}
-SceneGraph::Node* Layer::CreateNode() const
-{
- return SceneGraph::Layer::New( mId );
-}
-
-void Layer::OnStageConnectionInternal()
+void Layer::OnSceneConnectionInternal()
{
if ( !mIsRoot )
{
DALI_ASSERT_DEBUG( NULL == mLayerList );
// Find the ordered layer-list
- // This is different for Layers added via Integration::GetSystemOverlay()
- for ( Actor* parent = mParent; parent != NULL; parent = parent->GetParent() )
+ for ( Actor* parent = mParent; parent != nullptr; parent = parent->GetParent() )
{
if( parent->IsLayer() )
{
mLayerList->RegisterLayer( *this );
}
-void Layer::OnStageDisconnectionInternal()
+void Layer::OnSceneDisconnectionInternal()
{
mLayerList->UnregisterLayer(*this);
// mLayerList is only valid when on-stage
- mLayerList = NULL;
+ mLayerList = nullptr;
}
-const SceneGraph::Layer& Layer::GetSceneLayerOnStage() const
+const SceneGraph::Layer& Layer::GetSceneGraphLayer() const
{
- DALI_ASSERT_DEBUG( mNode != NULL );
- return dynamic_cast< const SceneGraph::Layer& >( *mNode );
+ return static_cast< const SceneGraph::Layer& >( GetNode() ); // we know our node is a layer node
}
void Layer::SetDefaultProperty( Property::Index index, const Property::Value& propertyValue )
}
case Dali::Layer::Property::BEHAVIOR:
{
- Behavior behavior(Dali::Layer::LAYER_2D);
- if( Scripting::GetEnumeration< Behavior >( propertyValue.Get< std::string >().c_str(), BEHAVIOR_TABLE, BEHAVIOR_TABLE_COUNT, behavior ) )
+ Behavior behavior = mBehavior;
+
+ Property::Type type = propertyValue.GetType();
+ if( type == Property::STRING )
{
- SetBehavior( behavior );
+ if( Scripting::GetEnumeration< Behavior >( propertyValue.Get< std::string >().c_str(), BEHAVIOR_TABLE, BEHAVIOR_TABLE_COUNT, behavior ) )
+ {
+ SetBehavior( behavior );
+ }
+ }
+ else if ( type == Property::INTEGER )
+ {
+ SetBehavior( propertyValue.Get< Dali::Layer::Behavior >() );
}
break;
}
+ case Dali::Layer::Property::DEPTH_TEST:
+ {
+ SetDepthTestDisabled( !propertyValue.Get<bool>() );
+ break;
+ }
+ case Dali::Layer::Property::CONSUMES_TOUCH:
+ {
+ SetTouchConsumed( propertyValue.Get<bool>() );
+ break;
+ }
+ case Dali::Layer::Property::CONSUMES_HOVER:
+ {
+ SetHoverConsumed( propertyValue.Get<bool>() );
+ break;
+ }
default:
{
DALI_LOG_WARNING( "Unknown property (%d)\n", index );
}
case Dali::Layer::Property::BEHAVIOR:
{
- ret = Scripting::GetLinearEnumerationName< Behavior >( GetBehavior(), BEHAVIOR_TABLE, BEHAVIOR_TABLE_COUNT );
+ ret = mBehavior;
+ break;
+ }
+ case Dali::Layer::Property::DEPTH:
+ {
+ ret = static_cast<int>( GetDepth() );
+ break;
+ }
+ case Dali::Layer::Property::DEPTH_TEST:
+ {
+ ret = !mDepthTestDisabled;
+ break;
+ }
+ case Dali::Layer::Property::CONSUMES_TOUCH:
+ {
+ ret = mTouchConsumed;
+ break;
+ }
+ case Dali::Layer::Property::CONSUMES_HOVER:
+ {
+ ret = mHoverConsumed;
break;
}
default:
if( layer )
{
- if( 0 == actionName.compare( ACTION_RAISE ) )
+ std::string_view name(actionName);
+
+ if(name == ACTION_RAISE)
{
layer->Raise();
done = true;
}
- else if( 0 == actionName.compare( ACTION_LOWER ) )
+ else if(name == ACTION_LOWER)
{
layer->Lower();
done = true;
}
- else if( 0 == actionName.compare( ACTION_RAISE_TO_TOP ) )
+ else if(name == ACTION_RAISE_TO_TOP)
{
layer->RaiseToTop();
done = true;
}
- else if( 0 == actionName.compare( ACTION_LOWER_TO_BOTTOM ) )
+ else if(name == ACTION_LOWER_TO_BOTTOM)
{
layer->LowerToBottom();
done = true;