Added signal to inform when an Actor's children have changed order 92/181692/1
authorDavid Steele <david.steele@samsung.com>
Fri, 15 Jun 2018 15:35:32 +0000 (16:35 +0100)
committerDavid Steele <david.steele@samsung.com>
Fri, 15 Jun 2018 15:35:32 +0000 (16:35 +0100)
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 <david.steele@samsung.com>
automated-tests/src/dali/utc-Dali-Actor.cpp
dali/devel-api/actors/actor-devel.cpp
dali/devel-api/actors/actor-devel.h
dali/internal/event/actors/actor-impl.cpp
dali/internal/event/actors/actor-impl.h

index 04b74f1..41c8e46 100644 (file)
@@ -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 );
index 591130c..9e89f7c 100644 (file)
@@ -40,6 +40,11 @@ ChildChangedSignalType& ChildRemovedSignal( Actor actor )
   return GetImplementation( actor ).ChildRemovedSignal();
 }
 
+ChildOrderChangedSignalType& ChildOrderChangedSignal( Actor actor )
+{
+  return GetImplementation( actor ).ChildOrderChangedSignal();
+}
+
 
 
 } // namespace DevelActor
index 84a712e..3a075e2 100644 (file)
@@ -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
index 5428e97..8b3b465 100644 (file)
@@ -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();
     }
   }
index b9734c7..69c14bc 100644 (file)
@@ -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