X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fevent%2Factors%2Factor-impl.cpp;h=7b1975745046e15efd8419f79a8433377b4a7aaa;hb=449cde6cfe99f1e9297bec8cdb5cedff37502afb;hp=475702e33afa83e476673f1a1034dba766894def;hpb=4131947a503fe176a840926b2df8db6469673577;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/dali/internal/event/actors/actor-impl.cpp b/dali/internal/event/actors/actor-impl.cpp index 475702e..7b19757 100644 --- a/dali/internal/event/actors/actor-impl.cpp +++ b/dali/internal/event/actors/actor-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Samsung Electronics Co., Ltd. + * Copyright (c) 2016 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. @@ -27,10 +27,12 @@ #include #include +#include #include #include #include #include + #include #include @@ -41,7 +43,6 @@ #include #include #include -#include #include #include #include @@ -59,37 +60,6 @@ using Dali::Internal::SceneGraph::PropertyBase; namespace Dali { -namespace ResizePolicy -{ - -namespace -{ -DALI_ENUM_TO_STRING_TABLE_BEGIN( Type ) -DALI_ENUM_TO_STRING( FIXED ) -DALI_ENUM_TO_STRING( USE_NATURAL_SIZE ) -DALI_ENUM_TO_STRING( FILL_TO_PARENT ) -DALI_ENUM_TO_STRING( SIZE_RELATIVE_TO_PARENT ) -DALI_ENUM_TO_STRING( SIZE_FIXED_OFFSET_FROM_PARENT ) -DALI_ENUM_TO_STRING( FIT_TO_CHILDREN ) -DALI_ENUM_TO_STRING( DIMENSION_DEPENDENCY ) -DALI_ENUM_TO_STRING( USE_ASSIGNED_SIZE ) -DALI_ENUM_TO_STRING_TABLE_END( Type ) - -} // unnamed namespace -} // ResizePolicy - -namespace SizeScalePolicy -{ -namespace -{ -// Enumeration to / from string conversion tables -DALI_ENUM_TO_STRING_TABLE_BEGIN( Type ) -DALI_ENUM_TO_STRING( USE_SIZE_SET ) -DALI_ENUM_TO_STRING( FIT_WITH_ASPECT_RATIO ) -DALI_ENUM_TO_STRING( FILL_WITH_ASPECT_RATIO ) -DALI_ENUM_TO_STRING_TABLE_END( Type ) -} // unnamed namespace -} // SizeScalePolicy namespace Internal { @@ -229,6 +199,8 @@ DALI_PROPERTY( "heightForWidth", BOOLEAN, true, false, false, Dali::Actor:: DALI_PROPERTY( "padding", VECTOR4, true, false, false, Dali::Actor::Property::PADDING ) DALI_PROPERTY( "minimumSize", VECTOR2, true, false, false, Dali::Actor::Property::MINIMUM_SIZE ) DALI_PROPERTY( "maximumSize", VECTOR2, true, false, false, Dali::Actor::Property::MAXIMUM_SIZE ) +DALI_PROPERTY( "inheritPosition", BOOLEAN, true, false, false, Dali::Actor::Property::INHERIT_POSITION ) +DALI_PROPERTY( "batchParent", BOOLEAN, true, false, false, Dali::Actor::Property::BATCH_PARENT ) DALI_PROPERTY_TABLE_END( DEFAULT_ACTOR_PROPERTY_START_INDEX ) // Signals @@ -238,6 +210,8 @@ const char* const SIGNAL_HOVERED = "hovered"; const char* const SIGNAL_WHEEL_EVENT = "wheelEvent"; const char* const SIGNAL_ON_STAGE = "onStage"; const char* const SIGNAL_OFF_STAGE = "offStage"; +const char* const SIGNAL_ON_RELAYOUT = "onRelayout"; +const char* const SIGNAL_TOUCH = "touch"; // Actions @@ -253,12 +227,90 @@ TypeRegistration mType( typeid(Dali::Actor), typeid(Dali::Handle), CreateActor ) SignalConnectorType signalConnector1( mType, SIGNAL_TOUCHED, &Actor::DoConnectSignal ); SignalConnectorType signalConnector2( mType, SIGNAL_HOVERED, &Actor::DoConnectSignal ); -SignalConnectorType signalConnector3( mType, SIGNAL_ON_STAGE, &Actor::DoConnectSignal ); -SignalConnectorType signalConnector4( mType, SIGNAL_OFF_STAGE, &Actor::DoConnectSignal ); +SignalConnectorType signalConnector3( mType, SIGNAL_WHEEL_EVENT, &Actor::DoConnectSignal ); +SignalConnectorType signalConnector4( mType, SIGNAL_ON_STAGE, &Actor::DoConnectSignal ); +SignalConnectorType signalConnector5( mType, SIGNAL_OFF_STAGE, &Actor::DoConnectSignal ); +SignalConnectorType signalConnector6( mType, SIGNAL_ON_RELAYOUT, &Actor::DoConnectSignal ); +SignalConnectorType signalConnector7( mType, SIGNAL_TOUCH, &Actor::DoConnectSignal ); TypeAction a1( mType, ACTION_SHOW, &Actor::DoAction ); TypeAction a2( mType, ACTION_HIDE, &Actor::DoAction ); +struct AnchorValue +{ + const char* name; + const Vector3& value; +}; + +DALI_ENUM_TO_STRING_TABLE_BEGIN_WITH_TYPE( AnchorValue, ANCHOR_CONSTANT ) +DALI_ENUM_TO_STRING_WITH_SCOPE( AnchorPoint, TOP_LEFT ) +DALI_ENUM_TO_STRING_WITH_SCOPE( AnchorPoint, TOP_CENTER ) +DALI_ENUM_TO_STRING_WITH_SCOPE( AnchorPoint, TOP_RIGHT ) +DALI_ENUM_TO_STRING_WITH_SCOPE( AnchorPoint, CENTER_LEFT ) +DALI_ENUM_TO_STRING_WITH_SCOPE( AnchorPoint, CENTER ) +DALI_ENUM_TO_STRING_WITH_SCOPE( AnchorPoint, CENTER_RIGHT ) +DALI_ENUM_TO_STRING_WITH_SCOPE( AnchorPoint, BOTTOM_LEFT ) +DALI_ENUM_TO_STRING_WITH_SCOPE( AnchorPoint, BOTTOM_CENTER ) +DALI_ENUM_TO_STRING_WITH_SCOPE( AnchorPoint, BOTTOM_RIGHT ) +DALI_ENUM_TO_STRING_TABLE_END( ANCHOR_CONSTANT ) + +DALI_ENUM_TO_STRING_TABLE_BEGIN( COLOR_MODE ) +DALI_ENUM_TO_STRING( USE_OWN_COLOR ) +DALI_ENUM_TO_STRING( USE_PARENT_COLOR ) +DALI_ENUM_TO_STRING( USE_OWN_MULTIPLY_PARENT_COLOR ) +DALI_ENUM_TO_STRING( USE_OWN_MULTIPLY_PARENT_ALPHA ) +DALI_ENUM_TO_STRING_TABLE_END( COLOR_MODE ) + +DALI_ENUM_TO_STRING_TABLE_BEGIN( POSITION_INHERITANCE_MODE ) +DALI_ENUM_TO_STRING( INHERIT_PARENT_POSITION ) +DALI_ENUM_TO_STRING( USE_PARENT_POSITION ) +DALI_ENUM_TO_STRING( USE_PARENT_POSITION_PLUS_LOCAL_POSITION ) +DALI_ENUM_TO_STRING( DONT_INHERIT_POSITION ) +DALI_ENUM_TO_STRING_TABLE_END( POSITION_INHERITANCE_MODE ) + +DALI_ENUM_TO_STRING_TABLE_BEGIN( DRAW_MODE ) +DALI_ENUM_TO_STRING_WITH_SCOPE( DrawMode, NORMAL ) +DALI_ENUM_TO_STRING_WITH_SCOPE( DrawMode, OVERLAY_2D ) +DALI_ENUM_TO_STRING_WITH_SCOPE( DrawMode, STENCIL ) +DALI_ENUM_TO_STRING_TABLE_END( DRAW_MODE ) + +DALI_ENUM_TO_STRING_TABLE_BEGIN( RESIZE_POLICY ) +DALI_ENUM_TO_STRING_WITH_SCOPE( ResizePolicy, FIXED ) +DALI_ENUM_TO_STRING_WITH_SCOPE( ResizePolicy, USE_NATURAL_SIZE ) +DALI_ENUM_TO_STRING_WITH_SCOPE( ResizePolicy, FILL_TO_PARENT ) +DALI_ENUM_TO_STRING_WITH_SCOPE( ResizePolicy, SIZE_RELATIVE_TO_PARENT ) +DALI_ENUM_TO_STRING_WITH_SCOPE( ResizePolicy, SIZE_FIXED_OFFSET_FROM_PARENT ) +DALI_ENUM_TO_STRING_WITH_SCOPE( ResizePolicy, FIT_TO_CHILDREN ) +DALI_ENUM_TO_STRING_WITH_SCOPE( ResizePolicy, DIMENSION_DEPENDENCY ) +DALI_ENUM_TO_STRING_WITH_SCOPE( ResizePolicy, USE_ASSIGNED_SIZE ) +DALI_ENUM_TO_STRING_TABLE_END( RESIZE_POLICY ) + +DALI_ENUM_TO_STRING_TABLE_BEGIN( SIZE_SCALE_POLICY ) +DALI_ENUM_TO_STRING_WITH_SCOPE( SizeScalePolicy, USE_SIZE_SET ) +DALI_ENUM_TO_STRING_WITH_SCOPE( SizeScalePolicy, FIT_WITH_ASPECT_RATIO ) +DALI_ENUM_TO_STRING_WITH_SCOPE( SizeScalePolicy, FILL_WITH_ASPECT_RATIO ) +DALI_ENUM_TO_STRING_TABLE_END( SIZE_SCALE_POLICY ) + +bool GetAnchorPointConstant( const std::string& value, Vector3& anchor ) +{ + for( unsigned int i = 0; i < ANCHOR_CONSTANT_TABLE_COUNT; ++i ) + { + size_t sizeIgnored = 0; + if( CompareTokens( value.c_str(), ANCHOR_CONSTANT_TABLE[ i ].name, sizeIgnored ) ) + { + anchor = ANCHOR_CONSTANT_TABLE[ i ].value; + return true; + } + } + return false; +} + +inline bool GetParentOriginConstant( const std::string& value, Vector3& parentOrigin ) +{ + // Values are the same so just use the same table as anchor-point + return GetAnchorPointConstant( value, parentOrigin ); +} + /** * @brief Extract a given dimension from a Vector2 * @@ -332,23 +384,6 @@ unsigned int Actor::GetId() const return mId; } -void Actor::Attach( ActorAttachment& attachment ) -{ - DALI_ASSERT_DEBUG( !mAttachment && "An Actor can only have one attachment" ); - - if( OnStage() ) - { - attachment.Connect(); - } - - mAttachment = ActorAttachmentPtr( &attachment ); -} - -ActorAttachmentPtr Actor::GetAttachment() -{ - return mAttachment; -} - bool Actor::OnStage() const { return mIsOnStage; @@ -457,15 +492,15 @@ void Actor::Remove( Actor& child ) if( removed ) { - // Notification for derived classes - OnChildRemove( *(removed.Get()) ); - // Only put in a relayout request if there is a suitable dependency if( RelayoutDependentOnChildren() ) { RelayoutRequest(); } } + + // Notification for derived classes + OnChildRemove( child ); } void Actor::Unparent() @@ -656,7 +691,7 @@ void Actor::SetPosition( const Vector3& position ) if( NULL != mNode ) { // mNode is being used in a separate thread; queue a message to set the value & base value - SceneGraph::NodePropertyMessage::Send( GetEventThreadServices(), mNode, &mNode->mPosition, &AnimatableProperty::Bake, position ); + SceneGraph::NodeTransformPropertyMessage::Send( GetEventThreadServices(), mNode, &mNode->mPosition, &SceneGraph::TransformManagerPropertyHandler::Bake, position ); } } @@ -667,7 +702,7 @@ void Actor::SetX( float x ) if( NULL != mNode ) { // mNode is being used in a separate thread; queue a message to set the value & base value - SceneGraph::NodePropertyComponentMessage::Send( GetEventThreadServices(), mNode, &mNode->mPosition, &AnimatableProperty::BakeX, x ); + SceneGraph::NodeTransformComponentMessage::Send( GetEventThreadServices(), mNode, &mNode->mPosition, &SceneGraph::TransformManagerPropertyHandler::BakeX, x ); } } @@ -678,7 +713,7 @@ void Actor::SetY( float y ) if( NULL != mNode ) { // mNode is being used in a separate thread; queue a message to set the value & base value - SceneGraph::NodePropertyComponentMessage::Send( GetEventThreadServices(), mNode, &mNode->mPosition, &AnimatableProperty::BakeY, y ); + SceneGraph::NodeTransformComponentMessage::Send( GetEventThreadServices(), mNode, &mNode->mPosition, &SceneGraph::TransformManagerPropertyHandler::BakeY, y ); } } @@ -689,7 +724,7 @@ void Actor::SetZ( float z ) if( NULL != mNode ) { // mNode is being used in a separate thread; queue a message to set the value & base value - SceneGraph::NodePropertyComponentMessage::Send( GetEventThreadServices(), mNode, &mNode->mPosition, &AnimatableProperty::BakeZ, z ); + SceneGraph::NodeTransformComponentMessage::Send( GetEventThreadServices(), mNode, &mNode->mPosition, &SceneGraph::TransformManagerPropertyHandler::BakeZ, z ); } } @@ -700,7 +735,7 @@ void Actor::TranslateBy( const Vector3& distance ) if( NULL != mNode ) { // mNode is being used in a separate thread; queue a message to set the value & base value - SceneGraph::NodePropertyMessage::Send( GetEventThreadServices(), mNode, &mNode->mPosition, &AnimatableProperty::BakeRelative, distance ); + SceneGraph::NodeTransformPropertyMessage::Send( GetEventThreadServices(), mNode, &mNode->mPosition, &SceneGraph::TransformManagerPropertyHandler::BakeRelative, distance ); } } @@ -738,7 +773,7 @@ void Actor::SetPositionInheritanceMode( PositionInheritanceMode mode ) if( NULL != mNode ) { // mNode is being used in a separate thread; queue a message to set the value - SetPositionInheritanceModeMessage( GetEventThreadServices(), *mNode, mode ); + SetInheritPositionMessage( GetEventThreadServices(), *mNode, mode == INHERIT_PARENT_POSITION ); } } @@ -748,6 +783,21 @@ PositionInheritanceMode Actor::GetPositionInheritanceMode() const return mPositionInheritanceMode; } +void Actor::SetInheritPosition( bool inherit ) +{ + if( mInheritPosition != inherit && NULL != mNode ) + { + // non animateable so keep local copy + mInheritPosition = inherit; + SetInheritPositionMessage( GetEventThreadServices(), *mNode, inherit ); + } +} + +bool Actor::IsPositionInherited() const +{ + return mInheritPosition; +} + void Actor::SetOrientation( const Radian& angle, const Vector3& axis ) { Vector3 normalizedAxis( axis.x, axis.y, axis.z ); @@ -763,7 +813,7 @@ void Actor::SetOrientation( const Quaternion& orientation ) if( NULL != mNode ) { // mNode is being used in a separate thread; queue a message to set the value & base value - SceneGraph::NodePropertyMessage::Send( GetEventThreadServices(), mNode, &mNode->mOrientation, &AnimatableProperty::Bake, orientation ); + SceneGraph::NodeTransformPropertyMessage::Send( GetEventThreadServices(), mNode, &mNode->mOrientation, &SceneGraph::TransformManagerPropertyHandler::Bake, orientation ); } } @@ -772,7 +822,7 @@ void Actor::RotateBy( const Radian& angle, const Vector3& axis ) if( NULL != mNode ) { // mNode is being used in a separate thread; queue a message to set the value & base value - SceneGraph::NodePropertyMessage::Send( GetEventThreadServices(), mNode, &mNode->mOrientation, &AnimatableProperty::BakeRelative, Quaternion(angle, axis) ); + SceneGraph::NodeTransformPropertyMessage::Send( GetEventThreadServices(), mNode, &mNode->mOrientation, &SceneGraph::TransformManagerPropertyHandler::BakeRelative, Quaternion(angle, axis) ); } } @@ -781,7 +831,7 @@ void Actor::RotateBy( const Quaternion& relativeRotation ) if( NULL != mNode ) { // mNode is being used in a separate thread; queue a message to set the value & base value - SceneGraph::NodePropertyMessage::Send( GetEventThreadServices(), mNode, &mNode->mOrientation, &AnimatableProperty::BakeRelative, relativeRotation ); + SceneGraph::NodeTransformPropertyMessage::Send( GetEventThreadServices(), mNode, &mNode->mOrientation, &SceneGraph::TransformManagerPropertyHandler::BakeRelative, relativeRotation ); } } @@ -822,7 +872,7 @@ void Actor::SetScale( const Vector3& scale ) if( NULL != mNode ) { // mNode is being used in a separate thread; queue a message to set the value & base value - SceneGraph::NodePropertyMessage::Send( GetEventThreadServices(), mNode, &mNode->mScale, &AnimatableProperty::Bake, scale ); + SceneGraph::NodeTransformPropertyMessage::Send( GetEventThreadServices(), mNode, &mNode->mScale, &SceneGraph::TransformManagerPropertyHandler::Bake, scale ); } } @@ -831,7 +881,7 @@ void Actor::SetScaleX( float x ) if( NULL != mNode ) { // mNode is being used in a separate thread; queue a message to set the value & base value - SceneGraph::NodePropertyComponentMessage::Send( GetEventThreadServices(), mNode, &mNode->mScale, &AnimatableProperty::BakeX, x ); + SceneGraph::NodeTransformComponentMessage::Send( GetEventThreadServices(), mNode, &mNode->mScale, &SceneGraph::TransformManagerPropertyHandler::BakeX, x ); } } @@ -840,7 +890,7 @@ void Actor::SetScaleY( float y ) if( NULL != mNode ) { // mNode is being used in a separate thread; queue a message to set the value & base value - SceneGraph::NodePropertyComponentMessage::Send( GetEventThreadServices(), mNode, &mNode->mScale, &AnimatableProperty::BakeY, y ); + SceneGraph::NodeTransformComponentMessage::Send( GetEventThreadServices(), mNode, &mNode->mScale, &SceneGraph::TransformManagerPropertyHandler::BakeY, y ); } } @@ -849,7 +899,7 @@ void Actor::SetScaleZ( float z ) if( NULL != mNode ) { // mNode is being used in a separate thread; queue a message to set the value & base value - SceneGraph::NodePropertyComponentMessage::Send( GetEventThreadServices(), mNode, &mNode->mScale, &AnimatableProperty::BakeZ, z ); + SceneGraph::NodeTransformComponentMessage::Send( GetEventThreadServices(), mNode, &mNode->mScale, &SceneGraph::TransformManagerPropertyHandler::BakeZ, z ); } } @@ -858,7 +908,7 @@ void Actor::ScaleBy(const Vector3& relativeScale) if( NULL != mNode ) { // mNode is being used in a separate thread; queue a message to set the value & base value - SceneGraph::NodePropertyMessage::Send( GetEventThreadServices(), mNode, &mNode->mScale, &AnimatableProperty::BakeRelativeMultiply, relativeScale ); + SceneGraph::NodeTransformPropertyMessage::Send( GetEventThreadServices(), mNode, &mNode->mScale, &SceneGraph::TransformManagerPropertyHandler::BakeRelativeMultiply, relativeScale ); } } @@ -886,10 +936,11 @@ const Vector3& Actor::GetCurrentWorldScale() const void Actor::SetInheritScale( bool inherit ) { - // non animateable so keep local copy - mInheritScale = inherit; - if( NULL != mNode ) + + if( mInheritScale != inherit && NULL != mNode ) { + // non animateable so keep local copy + mInheritScale = inherit; // mNode is being used in a separate thread; queue a message to set the value SetInheritScaleMessage( GetEventThreadServices(), *mNode, inherit ); } @@ -904,14 +955,7 @@ Matrix Actor::GetCurrentWorldMatrix() const { if( NULL != mNode ) { - // World matrix is no longer updated unless there is something observing the node. - // Need to calculate it from node's world position, orientation and scale: - BufferIndex updateBufferIndex = GetEventThreadServices().GetEventBufferIndex(); - Matrix worldMatrix(false); - worldMatrix.SetTransformComponents( mNode->GetWorldScale( updateBufferIndex ), - mNode->GetWorldOrientation( updateBufferIndex ), - mNode->GetWorldPosition( updateBufferIndex ) ); - return worldMatrix; + return mNode->GetWorldMatrix(0); } return Matrix::IDENTITY; @@ -1016,10 +1060,10 @@ const Vector4& Actor::GetCurrentColor() const void Actor::SetInheritOrientation( bool inherit ) { - // non animateable so keep local copy - mInheritOrientation = inherit; - if( NULL != mNode ) + if( mInheritOrientation != inherit && NULL != mNode) { + // non animateable so keep local copy + mInheritOrientation = inherit; // mNode is being used in a separate thread; queue a message to set the value SetInheritOrientationMessage( GetEventThreadServices(), *mNode, inherit ); } @@ -1110,7 +1154,7 @@ void Actor::SetSizeInternal( const Vector3& size ) mTargetSize = size; // mNode is being used in a separate thread; queue a message to set the value & base value - SceneGraph::NodePropertyMessage::Send( GetEventThreadServices(), mNode, &mNode->mSize, &AnimatableProperty::Bake, mTargetSize ); + SceneGraph::NodeTransformPropertyMessage::Send( GetEventThreadServices(), mNode, &mNode->mSize, &SceneGraph::TransformManagerPropertyHandler::Bake, mTargetSize ); // Notification for derived classes mInsideOnSizeSet = true; @@ -1143,34 +1187,65 @@ void Actor::NotifySizeAnimation( Animation& animation, float targetSize, Propert { mTargetSize.height = targetSize; } + else if ( Dali::Actor::Property::SIZE_DEPTH == property ) + { + mTargetSize.depth = targetSize; + } // Notify deriving classes OnSizeAnimation( animation, mTargetSize ); } +void Actor::NotifyPositionAnimation( Animation& animation, const Vector3& targetPosition ) +{ + mTargetPosition = targetPosition; +} + +void Actor::NotifyPositionAnimation( Animation& animation, float targetPosition, Property::Index property ) +{ + if ( Dali::Actor::Property::POSITION_X == property ) + { + mTargetPosition.x = targetPosition; + } + else if ( Dali::Actor::Property::POSITION_Y == property ) + { + mTargetPosition.y = targetPosition; + } + else if ( Dali::Actor::Property::POSITION_Z == property ) + { + mTargetPosition.z = targetPosition; + } +} + void Actor::SetWidth( float width ) { + mTargetSize.width = width; + if( NULL != mNode ) { // mNode is being used in a separate thread; queue a message to set the value & base value - SceneGraph::NodePropertyComponentMessage::Send( GetEventThreadServices(), mNode, &mNode->mSize, &AnimatableProperty::BakeX, width ); + SceneGraph::NodeTransformComponentMessage::Send( GetEventThreadServices(), mNode, &mNode->mSize, &SceneGraph::TransformManagerPropertyHandler::BakeX, width ); } } void Actor::SetHeight( float height ) { + mTargetSize.height = height; + if( NULL != mNode ) { // mNode is being used in a separate thread; queue a message to set the value & base value - SceneGraph::NodePropertyComponentMessage::Send( GetEventThreadServices(), mNode, &mNode->mSize, &AnimatableProperty::BakeY, height ); + SceneGraph::NodeTransformComponentMessage::Send( GetEventThreadServices(), mNode, &mNode->mSize, &SceneGraph::TransformManagerPropertyHandler::BakeY, height ); } } void Actor::SetDepth( float depth ) { + mTargetSize.depth = depth; + if( NULL != mNode ) { // mNode is being used in a separate thread; queue a message to set the value & base value - SceneGraph::NodePropertyComponentMessage::Send( GetEventThreadServices(), mNode, &mNode->mSize, &AnimatableProperty::BakeZ, depth ); + SceneGraph::NodeTransformComponentMessage::Send( GetEventThreadServices(), mNode, &mNode->mSize, &SceneGraph::TransformManagerPropertyHandler::BakeZ, depth ); } } @@ -1421,15 +1496,6 @@ void Actor::RemoveRenderer( unsigned int index ) } } -void Actor::SetOverlay( bool enable ) -{ - // Setting STENCIL will override OVERLAY_2D - if( DrawMode::STENCIL != mDrawMode ) - { - SetDrawMode( enable ? DrawMode::OVERLAY_2D : DrawMode::NORMAL ); - } -} - bool Actor::IsOverlay() const { return ( DrawMode::OVERLAY_2D == mDrawMode ); @@ -1476,7 +1542,7 @@ bool Actor::ScreenToLocal( float& localX, float& localY, float screenX, float sc return false; } -bool Actor::ScreenToLocal( RenderTask& renderTask, float& localX, float& localY, float screenX, float screenY ) const +bool Actor::ScreenToLocal( const RenderTask& renderTask, float& localX, float& localY, float screenX, float screenY ) const { bool retval = false; // only valid when on-stage @@ -1507,13 +1573,9 @@ bool Actor::ScreenToLocal( const Matrix& viewMatrix, const Matrix& projectionMat return false; } - BufferIndex bufferIndex( GetEventThreadServices().GetEventBufferIndex() ); - - // Calculate the ModelView matrix - Matrix modelView( false/*don't init*/); - // need to use the components as world matrix is only updated for actors that need it - modelView.SetTransformComponents( mNode->GetWorldScale( bufferIndex ), mNode->GetWorldOrientation( bufferIndex ), mNode->GetWorldPosition( bufferIndex ) ); - Matrix::Multiply( modelView, modelView, viewMatrix ); + // Get the ModelView matrix + Matrix modelView; + Matrix::Multiply( modelView, mNode->GetWorldMatrix(0), viewMatrix ); // Calculate the inverted ModelViewProjection matrix; this will be used for 2 unprojects Matrix invertedMvp( false/*don't init*/); @@ -1658,8 +1720,8 @@ bool Actor::RayActorTest( const Vector4& rayOrigin, const Vector4& rayDir, Vecto Matrix invModelMatrix( false/*don't init*/); BufferIndex bufferIndex( GetEventThreadServices().GetEventBufferIndex() ); - // need to use the components as world matrix is only updated for actors that need it - invModelMatrix.SetInverseTransformComponents( mNode->GetWorldScale( bufferIndex ), mNode->GetWorldOrientation( bufferIndex ), mNode->GetWorldPosition( bufferIndex ) ); + invModelMatrix = mNode->GetWorldMatrix(0); + invModelMatrix.Invert(); Vector4 rayOriginLocal( invModelMatrix * rayOrigin ); Vector4 rayDirLocal( invModelMatrix * rayDir - invModelMatrix.GetTranslation() ); @@ -1709,7 +1771,7 @@ bool Actor::IsKeyboardFocusable() const bool Actor::GetTouchRequired() const { - return !mTouchedSignal.Empty() || mDerivedRequiresTouch; + return !mTouchedSignal.Empty() || !mTouchSignal.Empty() || mDerivedRequiresTouch; } bool Actor::GetHoverRequired() const @@ -1743,20 +1805,26 @@ bool Actor::IsGestureRequred( Gesture::Type type ) const return mGestureData && mGestureData->IsGestureRequred( type ); } -bool Actor::EmitTouchEventSignal( const TouchEvent& event ) +bool Actor::EmitTouchEventSignal( const TouchEvent& event, const Dali::TouchData& touch ) { bool consumed = false; + if( !mTouchSignal.Empty() ) + { + Dali::Actor handle( this ); + consumed = mTouchSignal.Emit( handle, touch ); + } + if( !mTouchedSignal.Empty() ) { Dali::Actor handle( this ); - consumed = mTouchedSignal.Emit( handle, event ); + consumed |= mTouchedSignal.Emit( handle, event ); } if( !consumed ) { // Notification for derived classes - consumed = OnTouchEvent( event ); + consumed = OnTouchEvent( event ); // TODO } return consumed; @@ -1802,9 +1870,15 @@ bool Actor::EmitWheelEventSignal( const WheelEvent& event ) Dali::Actor::TouchSignalType& Actor::TouchedSignal() { + DALI_LOG_WARNING( "Deprecated: Use TouchSignal() instead\n" ); return mTouchedSignal; } +Dali::Actor::TouchDataSignalType& Actor::TouchSignal() +{ + return mTouchSignal; +} + Dali::Actor::HoverSignalType& Actor::HoveredSignal() { return mHoveredSignal; @@ -1855,6 +1929,14 @@ bool Actor::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tra { actor->OffStageSignal().Connect( tracker, functor ); } + else if( 0 == signalName.compare( SIGNAL_ON_RELAYOUT ) ) + { + actor->OnRelayoutSignal().Connect( tracker, functor ); + } + else if( 0 == signalName.compare( SIGNAL_TOUCH ) ) + { + actor->TouchSignal().Connect( tracker, functor ); + } else { // signalName does not match any signal @@ -1873,13 +1955,11 @@ Actor::Actor( DerivedType derivedType ) mAnchorPoint( NULL ), mRelayoutData( NULL ), mGestureData( NULL ), - mAttachment(), mTargetSize( 0.0f, 0.0f, 0.0f ), mName(), mId( ++mActorCounter ), // actor ID is initialised to start from 1, and 0 is reserved mDepth( 0u ), mIsRoot( ROOT_LAYER == derivedType ), - mIsRenderable( RENDERABLE == derivedType ), mIsLayer( LAYER == derivedType || ROOT_LAYER == derivedType ), mIsOnStage( false ), mSensitive( true ), @@ -1890,11 +1970,13 @@ Actor::Actor( DerivedType derivedType ) mDerivedRequiresWheelEvent( false ), mOnStageSignalled( false ), mInsideOnSizeSet( false ), + mInheritPosition( true ), mInheritOrientation( true ), mInheritScale( true ), mDrawMode( DrawMode::NORMAL ), mPositionInheritanceMode( Node::DEFAULT_POSITION_INHERITANCE_MODE ), - mColorMode( Node::DEFAULT_COLOR_MODE ) + mColorMode( Node::DEFAULT_COLOR_MODE ), + mIsBatchParent( false ) { } @@ -2013,12 +2095,6 @@ void Actor::ConnectToSceneGraph() ConnectNodeMessage( GetEventThreadServices().GetUpdateManager(), *(mParent->mNode), *mNode ); } - // Notify attachment - if( mAttachment ) - { - mAttachment->Connect(); - } - unsigned int rendererCount( GetRendererCount() ); for( unsigned int i(0); iDisconnect(); - } - unsigned int rendererCount( GetRendererCount() ); for( unsigned int i(0); i() ); + Property::Type type = property.GetType(); + if( type == Property::VECTOR3 ) + { + SetParentOrigin( property.Get< Vector3 >() ); + } + else if ( type == Property::STRING ) + { + std::string parentOriginString; + property.Get( parentOriginString ); + Vector3 parentOrigin; + if( GetParentOriginConstant( parentOriginString, parentOrigin ) ) + { + SetParentOrigin( parentOrigin ); + } + } break; } @@ -2272,7 +2356,21 @@ void Actor::SetDefaultProperty( Property::Index index, const Property::Value& pr case Dali::Actor::Property::ANCHOR_POINT: { - SetAnchorPoint( property.Get< Vector3 >() ); + Property::Type type = property.GetType(); + if( type == Property::VECTOR3 ) + { + SetAnchorPoint( property.Get< Vector3 >() ); + } + else if ( type == Property::STRING ) + { + std::string anchorPointString; + property.Get( anchorPointString ); + Vector3 anchor; + if( GetAnchorPointConstant( anchorPointString, anchor ) ) + { + SetAnchorPoint( anchor ); + } + } break; } @@ -2426,6 +2524,12 @@ void Actor::SetDefaultProperty( Property::Index index, const Property::Value& pr break; } + case Dali::Actor::Property::INHERIT_POSITION: + { + SetInheritPosition( property.Get< bool >() ); + break; + } + case Dali::Actor::Property::INHERIT_ORIENTATION: { SetInheritOrientation( property.Get< bool >() ); @@ -2440,19 +2544,31 @@ void Actor::SetDefaultProperty( Property::Index index, const Property::Value& pr case Dali::Actor::Property::COLOR_MODE: { - SetColorMode( Scripting::GetColorMode( property.Get< std::string >() ) ); + ColorMode mode; + if ( Scripting::GetEnumeration< ColorMode >( property.Get< std::string >().c_str(), COLOR_MODE_TABLE, COLOR_MODE_TABLE_COUNT, mode ) ) + { + SetColorMode( mode ); + } break; } case Dali::Actor::Property::POSITION_INHERITANCE: { - SetPositionInheritanceMode( Scripting::GetPositionInheritanceMode( property.Get< std::string >() ) ); + PositionInheritanceMode mode; + if( Scripting::GetEnumeration< PositionInheritanceMode >( property.Get< std::string >().c_str(), POSITION_INHERITANCE_MODE_TABLE, POSITION_INHERITANCE_MODE_TABLE_COUNT, mode ) ) + { + SetPositionInheritanceMode( mode ); + } break; } case Dali::Actor::Property::DRAW_MODE: { - SetDrawMode( Scripting::GetDrawMode( property.Get< std::string >() ) ); + DrawMode::Type mode; + if( Scripting::GetEnumeration< DrawMode::Type >( property.Get< std::string >().c_str(), DRAW_MODE_TABLE, DRAW_MODE_TABLE_COUNT, mode ) ) + { + SetDrawMode( mode ); + } break; } @@ -2465,7 +2581,7 @@ void Actor::SetDefaultProperty( Property::Index index, const Property::Value& pr case Dali::Actor::Property::WIDTH_RESIZE_POLICY: { ResizePolicy::Type type; - if( Scripting::GetEnumeration< ResizePolicy::Type >( property.Get< std::string >().c_str(), ResizePolicy::TypeTable, ResizePolicy::TypeTableCount, type ) ) + if( Scripting::GetEnumeration< ResizePolicy::Type >( property.Get< std::string >().c_str(), RESIZE_POLICY_TABLE, RESIZE_POLICY_TABLE_COUNT, type ) ) { SetResizePolicy( type, Dimension::WIDTH ); } @@ -2475,7 +2591,7 @@ void Actor::SetDefaultProperty( Property::Index index, const Property::Value& pr case Dali::Actor::Property::HEIGHT_RESIZE_POLICY: { ResizePolicy::Type type; - if( Scripting::GetEnumeration< ResizePolicy::Type >( property.Get< std::string >().c_str(), ResizePolicy::TypeTable, ResizePolicy::TypeTableCount, type ) ) + if( Scripting::GetEnumeration< ResizePolicy::Type >( property.Get< std::string >().c_str(), RESIZE_POLICY_TABLE, RESIZE_POLICY_TABLE_COUNT, type ) ) { SetResizePolicy( type, Dimension::HEIGHT ); } @@ -2485,7 +2601,7 @@ void Actor::SetDefaultProperty( Property::Index index, const Property::Value& pr case Dali::Actor::Property::SIZE_SCALE_POLICY: { SizeScalePolicy::Type type; - if( Scripting::GetEnumeration< SizeScalePolicy::Type >( property.Get< std::string >().c_str(), SizeScalePolicy::TypeTable, SizeScalePolicy::TypeTableCount, type ) ) + if( Scripting::GetEnumeration< SizeScalePolicy::Type >( property.Get< std::string >().c_str(), SIZE_SCALE_POLICY_TABLE, SIZE_SCALE_POLICY_TABLE_COUNT, type ) ) { SetSizeScalePolicy( type ); } @@ -2534,6 +2650,20 @@ void Actor::SetDefaultProperty( Property::Index index, const Property::Value& pr break; } + case Dali::Actor::Property::BATCH_PARENT: + { + bool value; + + if( property.Get( value ) ) + { + if( value != mIsBatchParent ) + { + mIsBatchParent = value; + SetIsBatchParentMessage( GetEventThreadServices(), *mNode, mIsBatchParent ); + } + } + break; + } default: { // this can happen in the case of a non-animatable default property so just do nothing @@ -2696,7 +2826,7 @@ void Actor::SetSceneGraphProperty( Property::Index index, const PropertyMetadata DALI_ASSERT_ALWAYS( false && "Property type enumeration out of bounds" ); // should not come here break; } - } + } // entry.GetType } Property::Value Actor::GetDefaultProperty( Property::Index index ) const @@ -2755,49 +2885,49 @@ Property::Value Actor::GetDefaultProperty( Property::Index index ) const case Dali::Actor::Property::SIZE: { - value = GetCurrentSize(); + value = GetTargetSize(); break; } case Dali::Actor::Property::SIZE_WIDTH: { - value = GetCurrentSize().width; + value = GetTargetSize().width; break; } case Dali::Actor::Property::SIZE_HEIGHT: { - value = GetCurrentSize().height; + value = GetTargetSize().height; break; } case Dali::Actor::Property::SIZE_DEPTH: { - value = GetCurrentSize().depth; + value = GetTargetSize().depth; break; } case Dali::Actor::Property::POSITION: { - value = GetCurrentPosition(); + value = GetTargetPosition(); break; } case Dali::Actor::Property::POSITION_X: { - value = GetCurrentPosition().x; + value = GetTargetPosition().x; break; } case Dali::Actor::Property::POSITION_Y: { - value = GetCurrentPosition().y; + value = GetTargetPosition().y; break; } case Dali::Actor::Property::POSITION_Z: { - value = GetCurrentPosition().z; + value = GetTargetPosition().z; break; } @@ -2933,6 +3063,12 @@ Property::Value Actor::GetDefaultProperty( Property::Index index ) const break; } + case Dali::Actor::Property::INHERIT_POSITION: + { + value = IsPositionInherited(); + break; + } + case Dali::Actor::Property::INHERIT_ORIENTATION: { value = IsOrientationInherited(); @@ -2947,19 +3083,19 @@ Property::Value Actor::GetDefaultProperty( Property::Index index ) const case Dali::Actor::Property::COLOR_MODE: { - value = Scripting::GetColorMode( GetColorMode() ); + value = Scripting::GetLinearEnumerationName< ColorMode >( GetColorMode(), COLOR_MODE_TABLE, COLOR_MODE_TABLE_COUNT ); break; } case Dali::Actor::Property::POSITION_INHERITANCE: { - value = Scripting::GetPositionInheritanceMode( GetPositionInheritanceMode() ); + value = Scripting::GetLinearEnumerationName< PositionInheritanceMode >( GetPositionInheritanceMode(), POSITION_INHERITANCE_MODE_TABLE, POSITION_INHERITANCE_MODE_TABLE_COUNT ); break; } case Dali::Actor::Property::DRAW_MODE: { - value = Scripting::GetDrawMode( GetDrawMode() ); + value = Scripting::GetEnumerationName< DrawMode::Type >( GetDrawMode(), DRAW_MODE_TABLE, DRAW_MODE_TABLE_COUNT ); break; } @@ -2971,19 +3107,19 @@ Property::Value Actor::GetDefaultProperty( Property::Index index ) const case Dali::Actor::Property::WIDTH_RESIZE_POLICY: { - value = Scripting::GetLinearEnumerationName< ResizePolicy::Type >( GetResizePolicy( Dimension::WIDTH ), ResizePolicy::TypeTable, ResizePolicy::TypeTableCount ); + value = Scripting::GetLinearEnumerationName< ResizePolicy::Type >( GetResizePolicy( Dimension::WIDTH ), RESIZE_POLICY_TABLE, RESIZE_POLICY_TABLE_COUNT ); break; } case Dali::Actor::Property::HEIGHT_RESIZE_POLICY: { - value = Scripting::GetLinearEnumerationName< ResizePolicy::Type >( GetResizePolicy( Dimension::HEIGHT ), ResizePolicy::TypeTable, ResizePolicy::TypeTableCount ); + value = Scripting::GetLinearEnumerationName< ResizePolicy::Type >( GetResizePolicy( Dimension::HEIGHT ), RESIZE_POLICY_TABLE, RESIZE_POLICY_TABLE_COUNT ); break; } case Dali::Actor::Property::SIZE_SCALE_POLICY: { - value = Scripting::GetLinearEnumerationName< SizeScalePolicy::Type >( GetSizeScalePolicy(), SizeScalePolicy::TypeTable, SizeScalePolicy::TypeTableCount ); + value = Scripting::GetLinearEnumerationName< SizeScalePolicy::Type >( GetSizeScalePolicy(), SIZE_SCALE_POLICY_TABLE, SIZE_SCALE_POLICY_TABLE_COUNT ); break; } @@ -3019,6 +3155,12 @@ Property::Value Actor::GetDefaultProperty( Property::Index index ) const break; } + case Dali::Actor::Property::BATCH_PARENT: + { + value = mIsBatchParent; + break; + } + default: { DALI_ASSERT_ALWAYS( false && "Actor Property index invalid" ); // should not come here @@ -3059,7 +3201,8 @@ const PropertyBase* Actor::GetSceneObjectAnimatableProperty( Property::Index ind property = animatable->GetSceneGraphProperty(); } - else if ( index >= DEFAULT_PROPERTY_MAX_COUNT ) + else if ( ( index >= CHILD_PROPERTY_REGISTRATION_START_INDEX ) && // Child properties are also stored as custom properties + ( index <= PROPERTY_CUSTOM_MAX_INDEX ) ) { CustomPropertyMetadata* custom = FindCustomProperty( index ); DALI_ASSERT_ALWAYS( custom && "Property index is invalid" ); @@ -3171,7 +3314,8 @@ const PropertyInputImpl* Actor::GetSceneObjectInputProperty( Property::Index ind property = animatable->GetSceneGraphProperty(); } - else if ( index >= DEFAULT_PROPERTY_MAX_COUNT ) + else if ( ( index >= CHILD_PROPERTY_REGISTRATION_START_INDEX ) && // Child properties are also stored as custom properties + ( index <= PROPERTY_CUSTOM_MAX_INDEX ) ) { CustomPropertyMetadata* custom = FindCustomProperty( index ); DALI_ASSERT_ALWAYS( custom && "Property index is invalid" ); @@ -3413,6 +3557,9 @@ void Actor::SetParent( Actor* parent ) // Instruct each actor to create a corresponding node in the scene graph ConnectToStage( parent->GetHierarchyDepth() ); } + + // Resolve the name and index for the child properties if any + ResolveChildProperties(); } else // parent being set to NULL { @@ -3970,6 +4117,7 @@ Vector2 Actor::ApplySizeSetPolicy( const Vector2 size ) return size; } } + break; } default: @@ -4009,6 +4157,22 @@ void Actor::SetNegotiatedSize( RelayoutContainer& container ) void Actor::NegotiateSize( const Vector2& allocatedSize, RelayoutContainer& container ) { + // Force a size negotiation for actors that has assigned size during relayout + // This is required as otherwise the flags that force a relayout will not + // necessarilly be set. This will occur if the actor has already been laid out. + // The dirty flags are then cleared. Then if the actor is added back into the + // relayout container afterwards, the dirty flags would still be clear... + // causing a relayout to be skipped. Here we force any actors added to the + // container to be relayed out. + if(GetResizePolicy(Dimension::WIDTH) == ResizePolicy::USE_ASSIGNED_SIZE) + { + SetLayoutNegotiated(false, Dimension::WIDTH); + } + if(GetResizePolicy(Dimension::HEIGHT) == ResizePolicy::USE_ASSIGNED_SIZE) + { + SetLayoutNegotiated(false, Dimension::HEIGHT); + } + // Do the negotiation NegotiateDimensions( allocatedSize ); @@ -4022,6 +4186,19 @@ void Actor::NegotiateSize( const Vector2& allocatedSize, RelayoutContainer& cont { ActorPtr child = GetChildAt( i ); + // Forces children that have already been laid out to be relayed out + // if they have assigned size during relayout. + if(child->GetResizePolicy(Dimension::WIDTH) == ResizePolicy::USE_ASSIGNED_SIZE) + { + child->SetLayoutNegotiated(false, Dimension::WIDTH); + child->SetLayoutDirty(true, Dimension::WIDTH); + } + if(child->GetResizePolicy(Dimension::HEIGHT) == ResizePolicy::USE_ASSIGNED_SIZE) + { + child->SetLayoutNegotiated(false, Dimension::HEIGHT); + child->SetLayoutDirty(true, Dimension::HEIGHT); + } + // Only relayout if required if( child->RelayoutRequired() ) { @@ -4139,6 +4316,11 @@ float Actor::GetMaximumSize( Dimension::Type dimension ) const return FLT_MAX; // Default } +Object* Actor::GetParentObject() const +{ + return mParent; +} + } // namespace Internal } // namespace Dali