Just block notifying OnScene and OffScene callback during SwithParent. 30/261430/1
authorseungho <sbsh.baek@samsung.com>
Mon, 12 Jul 2021 10:12:40 +0000 (19:12 +0900)
committerSeungho Baek <sbsh.baek@samsung.com>
Mon, 19 Jul 2021 01:37:50 +0000 (10:37 +0900)
 - Currently, during SwitchParent, too many works were blocked
   such as changing node hierarchy and changing tree depth.
 - This patch just block only notifying OnScene and OffScene signal and callback.

Change-Id: I642bd22d7886933d5999fcd73d31eda8892e6fbe
Signed-off-by: seungho <sbsh.baek@samsung.com>
dali/internal/event/actors/actor-impl.cpp
dali/internal/event/actors/actor-impl.h
dali/internal/event/actors/actor-parent-impl.cpp

index 4e9205c..f5be1a7 100644 (file)
@@ -1457,7 +1457,7 @@ void Actor::UnparentChildren()
   mParentImpl.UnparentChildren();
 }
 
-void Actor::ConnectToScene(uint32_t parentDepth)
+void Actor::ConnectToScene(uint32_t parentDepth, bool notify)
 {
   // This container is used instead of walking the Actor hierarchy.
   // It protects us when the Actor hierarchy is modified during OnSceneConnectionExternal callbacks.
@@ -1474,7 +1474,7 @@ void Actor::ConnectToScene(uint32_t parentDepth)
   // Notify applications about the newly connected actors.
   for(const auto& actor : connectionList)
   {
-    actor->NotifyStageConnection();
+    actor->NotifyStageConnection(notify);
   }
 
   RelayoutRequest();
@@ -1526,19 +1526,22 @@ void Actor::ConnectToSceneGraph()
   OnSceneObjectAdd();
 }
 
-void Actor::NotifyStageConnection()
+void Actor::NotifyStageConnection(bool notify)
 {
   // Actors can be removed (in a callback), before the on-stage stage is reported.
   // The actor may also have been reparented, in which case mOnSceneSignalled will be true.
   if(OnScene() && !mOnSceneSignalled)
   {
-    // Notification for external (CustomActor) derived classes
-    OnSceneConnectionExternal(mDepth);
-
-    if(!mOnSceneSignal.Empty())
+    if(notify)
     {
-      Dali::Actor handle(this);
-      mOnSceneSignal.Emit(handle);
+      // Notification for external (CustomActor) derived classes
+      OnSceneConnectionExternal(mDepth);
+
+      if(!mOnSceneSignal.Empty())
+      {
+        Dali::Actor handle(this);
+        mOnSceneSignal.Emit(handle);
+      }
     }
 
     // Guard against Remove during callbacks
@@ -1549,7 +1552,7 @@ void Actor::NotifyStageConnection()
   }
 }
 
-void Actor::DisconnectFromStage()
+void Actor::DisconnectFromStage(bool notify)
 {
   // This container is used instead of walking the Actor hierachy.
   // It protects us when the Actor hierachy is modified during OnSceneDisconnectionExternal callbacks.
@@ -1566,7 +1569,7 @@ void Actor::DisconnectFromStage()
   // Notify applications about the newly disconnected actors.
   for(const auto& actor : disconnectionList)
   {
-    actor->NotifyStageDisconnection();
+    actor->NotifyStageDisconnection(notify);
   }
 }
 
@@ -1603,20 +1606,23 @@ void Actor::DisconnectFromSceneGraph()
   OnSceneObjectRemove();
 }
 
-void Actor::NotifyStageDisconnection()
+void Actor::NotifyStageDisconnection(bool notify)
 {
   // Actors can be added (in a callback), before the off-stage state is reported.
   // Also if the actor was added & removed before mOnSceneSignalled was set, then we don't notify here.
   // only do this step if there is a stage, i.e. Core is not being shut down
   if(EventThreadServices::IsCoreRunning() && !OnScene() && mOnSceneSignalled)
   {
-    // Notification for external (CustomeActor) derived classes
-    OnSceneDisconnectionExternal();
-
-    if(!mOffSceneSignal.Empty())
+    if(notify)
     {
-      Dali::Actor handle(this);
-      mOffSceneSignal.Emit(handle);
+      // Notification for external (CustomeActor) derived classes
+      OnSceneDisconnectionExternal();
+
+      if(!mOffSceneSignal.Empty())
+      {
+        Dali::Actor handle(this);
+        mOffSceneSignal.Emit(handle);
+      }
     }
 
     // Guard against Add during callbacks
@@ -1836,7 +1842,7 @@ void Actor::LowerBelow(Internal::Actor& target)
   }
 }
 
-void Actor::SetParent(ActorParent* parent, bool keepOnScene)
+void Actor::SetParent(ActorParent* parent, bool notify)
 {
   if(parent)
   {
@@ -1847,10 +1853,10 @@ void Actor::SetParent(ActorParent* parent, bool keepOnScene)
     mScene             = parentActor->mScene;
 
     if(EventThreadServices::IsCoreRunning() && // Don't emit signals or send messages during Core destruction
-       parentActor->OnScene() && !keepOnScene)
+       parentActor->OnScene())
     {
       // Instruct each actor to create a corresponding node in the scene graph
-      ConnectToScene(parentActor->GetHierarchyDepth());
+      ConnectToScene(parentActor->GetHierarchyDepth(), notify);
     }
 
     // Resolve the name and index for the child properties if any
@@ -1863,13 +1869,13 @@ void Actor::SetParent(ActorParent* parent, bool keepOnScene)
     mParent = nullptr;
 
     if(EventThreadServices::IsCoreRunning() && // Don't emit signals or send messages during Core destruction
-       OnScene() && !keepOnScene)
+       OnScene())
     {
       // Disconnect the Node & its children from the scene-graph.
       DisconnectNodeMessage(GetEventThreadServices().GetUpdateManager(), GetNode());
 
       // Instruct each actor to discard pointers to the scene-graph
-      DisconnectFromStage();
+      DisconnectFromStage(notify);
     }
 
     mScene = nullptr;
index 93bc211..e7fed21 100644 (file)
@@ -1638,8 +1638,9 @@ protected:
   /**
    * Called on a child during Add() when the parent actor is connected to the Scene.
    * @param[in] parentDepth The depth of the parent in the hierarchy.
+   * @param[in] notify Emits notification if set to true.
    */
-  void ConnectToScene(uint32_t parentDepth);
+  void ConnectToScene(uint32_t parentDepth, bool notify);
 
   /**
    * Helper for ConnectToScene, to recursively connect a tree of actors.
@@ -1656,13 +1657,15 @@ protected:
 
   /**
    * Helper for ConnectToScene, to notify a connected actor through the public API.
+   * @param[in] notify Emits notification if set to true.
    */
-  void NotifyStageConnection();
+  void NotifyStageConnection(bool notify);
 
   /**
    * Called on a child during Remove() when the actor was previously on the Stage.
+   * @param[in] notify Emits notification if set to true.
    */
-  void DisconnectFromStage();
+  void DisconnectFromStage(bool notify);
 
   /**
    * Helper for DisconnectFromStage, to recursively disconnect a tree of actors.
@@ -1678,8 +1681,9 @@ protected:
 
   /**
    * Helper for DisconnectFromStage, to notify a disconnected actor through the public API.
+   * @param[in] notify Emits notification if set to true.
    */
-  void NotifyStageDisconnection();
+  void NotifyStageDisconnection(bool notify);
 
   /**
    * When the Actor is OnScene, checks whether the corresponding Node is connected to the scene graph.
@@ -1845,9 +1849,9 @@ private:
   /**
    * Set the actor's parent.
    * @param[in] parent The new parent.
-   * @param[in] keepOnScene Keep this actor to be on Scene if this is true.
+   * @param[in] notify Emits notification if set to true. Default is true.
    */
-  void SetParent(ActorParent* parent, bool keepOnScene = false);
+  void SetParent(ActorParent* parent, bool notify = true);
 
   /**
    * For use in derived classes, called after Initialize()
index 6d153a0..41a6e2c 100644 (file)
@@ -91,7 +91,7 @@ void ActorParentImpl::Add(Actor& child, bool notify)
       mChildren->push_back(ActorPtr(&child));
 
       // SetParent asserts that child can be added
-      child.SetParent(&mOwner, !notify);
+      child.SetParent(&mOwner, notify);
 
       if(notify)
       {
@@ -136,7 +136,7 @@ void ActorParentImpl::Remove(Actor& child, bool notify)
       mChildren->erase(iter);
 
       DALI_ASSERT_DEBUG(actor->GetParent() == &mOwner);
-      actor->SetParent(nullptr, (notify) ? false : true);
+      actor->SetParent(nullptr, notify);
 
       break;
     }