From f31d5072b61dad6ec2a9097ee0068f29c0ac4950 Mon Sep 17 00:00:00 2001 From: David Steele Date: Fri, 15 Jun 2018 16:35:32 +0100 Subject: [PATCH] Added signal to inform when an Actor's children have changed order At present, this fires immediately after a call to Raise/Lower or other such APIs. This means that layouting has a chance to run before the re-writing of depth information. Change-Id: Ie2488a14f1f17df93589c396f6c8b699d6783090 Signed-off-by: David Steele --- automated-tests/src/dali/utc-Dali-Actor.cpp | 22 +++++++++++++++++++++- dali/devel-api/actors/actor-devel.cpp | 5 +++++ dali/devel-api/actors/actor-devel.h | 18 ++++++++++++++++++ dali/internal/event/actors/actor-impl.cpp | 14 ++++++++++++++ dali/internal/event/actors/actor-impl.h | 7 ++++++- 5 files changed, 64 insertions(+), 2 deletions(-) diff --git a/automated-tests/src/dali/utc-Dali-Actor.cpp b/automated-tests/src/dali/utc-Dali-Actor.cpp index 04b74f1..41c8e46 100644 --- a/automated-tests/src/dali/utc-Dali-Actor.cpp +++ b/automated-tests/src/dali/utc-Dali-Actor.cpp @@ -246,6 +246,20 @@ struct VisibilityChangedVoidFunctor bool& mSignalCalled; }; +struct ChildOrderChangedFunctor +{ + ChildOrderChangedFunctor(bool& signalCalled) + : mSignalCalled( signalCalled ) + { } + + void operator()() + { + mSignalCalled = true; + } + + bool& mSignalCalled; +}; + } // anonymous namespace @@ -5112,6 +5126,10 @@ int UtcDaliActorRaiseAbove(void) actorB.TouchSignal().Connect( TestTouchCallback2 ); actorC.TouchSignal().Connect( TestTouchCallback3 ); + bool orderChangedSignal(false); + ChildOrderChangedFunctor f(orderChangedSignal); + DevelActor::ChildOrderChangedSignal( stage.GetRootLayer() ).Connect( &application, f ) ; + Dali::Integration::Point point; point.SetDeviceId( 1 ); point.SetState( PointState::DOWN ); @@ -5129,10 +5147,12 @@ int UtcDaliActorRaiseAbove(void) tet_printf( "Raise actor B Above Actor C\n" ); + DALI_TEST_EQUALS( orderChangedSignal, false, TEST_LOCATION ); actorB.RaiseAbove( actorC ); + DALI_TEST_EQUALS( orderChangedSignal, true, TEST_LOCATION ); + // Ensure sorting happens at end of Core::ProcessEvents() before next touch application.SendNotification(); - application.ProcessEvent( touchEvent ); DALI_TEST_EQUALS( gTouchCallBackCalled, false, TEST_LOCATION ); diff --git a/dali/devel-api/actors/actor-devel.cpp b/dali/devel-api/actors/actor-devel.cpp index 591130c..9e89f7c 100644 --- a/dali/devel-api/actors/actor-devel.cpp +++ b/dali/devel-api/actors/actor-devel.cpp @@ -40,6 +40,11 @@ ChildChangedSignalType& ChildRemovedSignal( Actor actor ) return GetImplementation( actor ).ChildRemovedSignal(); } +ChildOrderChangedSignalType& ChildOrderChangedSignal( Actor actor ) +{ + return GetImplementation( actor ).ChildOrderChangedSignal(); +} + } // namespace DevelActor diff --git a/dali/devel-api/actors/actor-devel.h b/dali/devel-api/actors/actor-devel.h index 84a712e..3a075e2 100644 --- a/dali/devel-api/actors/actor-devel.h +++ b/dali/devel-api/actors/actor-devel.h @@ -196,6 +196,24 @@ DALI_CORE_API ChildChangedSignalType& ChildAddedSignal( Actor actor ); DALI_CORE_API ChildChangedSignalType& ChildRemovedSignal( Actor actor ); +typedef Signal< void (void) > ChildOrderChangedSignalType; ///< Used when the actor's children have changed order + +/** + * @brief This signal is emitted when an actor's children change their sibling order + * + * A callback of the following type may be connected: + * @code + * void MyCallbackName( Actor parent ); + * @endcode + * parent The parent actor of the moved children + * + * @return The signal to connect to + * @pre The Actor has been initialized + */ +DALI_CORE_API ChildOrderChangedSignalType& ChildOrderChangedSignal( Actor actor ); + + + } // namespace DevelActor } // namespace Dali diff --git a/dali/internal/event/actors/actor-impl.cpp b/dali/internal/event/actors/actor-impl.cpp index 5428e97..8b3b465 100644 --- a/dali/internal/event/actors/actor-impl.cpp +++ b/dali/internal/event/actors/actor-impl.cpp @@ -2088,6 +2088,11 @@ DevelActor::ChildChangedSignalType& Actor::ChildRemovedSignal() return mChildRemovedSignal; } +DevelActor::ChildOrderChangedSignalType& Actor::ChildOrderChangedSignal() +{ + return mChildOrderChangedSignal; +} + bool Actor::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor ) { bool connected( true ); @@ -2166,6 +2171,7 @@ Actor::Actor( DerivedType derivedType ) mLayoutDirectionChangedSignal(), mChildAddedSignal(), mChildRemovedSignal(), + mChildOrderChangedSignal(), mTargetOrientation( Quaternion::IDENTITY ), mTargetColor( Color::WHITE ), mTargetSize( Vector3::ZERO ), @@ -5261,6 +5267,7 @@ void Actor::Raise() } } } + mParent->mChildOrderChangedSignal.Emit(); RequestRebuildDepthTree(); } else @@ -5288,6 +5295,7 @@ void Actor::Lower() } } } + mParent->mChildOrderChangedSignal.Emit(); RequestRebuildDepthTree(); } else @@ -5310,6 +5318,7 @@ void Actor::RaiseToTop() siblings.push_back(ActorPtr(this)); } } + mParent->mChildOrderChangedSignal.Emit(); RequestRebuildDepthTree(); } else @@ -5334,6 +5343,7 @@ void Actor::LowerToBottom() siblings.insert(siblings.begin(), thisPtr); } } + mParent->mChildOrderChangedSignal.Emit(); RequestRebuildDepthTree(); } else @@ -5362,6 +5372,8 @@ void Actor::RaiseAbove( Internal::Actor& target ) ++targetIter; siblings.insert(targetIter, thisPtr); } + + mParent->mChildOrderChangedSignal.Emit(); RequestRebuildDepthTree(); } } @@ -5388,6 +5400,8 @@ void Actor::LowerBelow( Internal::Actor& target ) siblings.erase(thisIter); // this only invalidates iterators at or after this point. siblings.insert(targetIter, thisPtr); } + + mParent->mChildOrderChangedSignal.Emit(); RequestRebuildDepthTree(); } } diff --git a/dali/internal/event/actors/actor-impl.h b/dali/internal/event/actors/actor-impl.h index b9734c7..69c14bc 100644 --- a/dali/internal/event/actors/actor-impl.h +++ b/dali/internal/event/actors/actor-impl.h @@ -1492,6 +1492,11 @@ public: DevelActor::ChildChangedSignalType& ChildRemovedSignal(); /** + * @copydoc DevelActor::ChildOrderChangedSignal + */ + DevelActor::ChildOrderChangedSignalType& ChildOrderChangedSignal(); + + /** * Connects a callback function with the object's signals. * @param[in] object The object providing the signal. * @param[in] tracker Used to disconnect the signal. @@ -1612,7 +1617,6 @@ public: void RebuildDepthTree(); protected: - /** * Traverse the actor tree, inserting actors into the depth tree in sibling order. * @param[in] sceneGraphNodeDepths A vector capturing the nodes and their depth index @@ -1986,6 +1990,7 @@ protected: Dali::Actor::LayoutDirectionChangedSignalType mLayoutDirectionChangedSignal; DevelActor::ChildChangedSignalType mChildAddedSignal; DevelActor::ChildChangedSignalType mChildRemovedSignal; + DevelActor::ChildOrderChangedSignalType mChildOrderChangedSignal; Quaternion mTargetOrientation; ///< Event-side storage for orientation Vector4 mTargetColor; ///< Event-side storage for color -- 2.7.4