Reorder node's children only required case.
[platform/core/uifw/dali-core.git] / dali / internal / update / common / property-owner.cpp
index e6cfa77..1111f94 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2023 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 <algorithm>
 
 // INTERNAL INCLUDES
-#include <dali/public-api/common/dali-common.h>
+#include <dali/internal/common/const-string.h>
 #include <dali/internal/update/animation/scene-graph-constraint-base.h>
+#include <dali/public-api/common/dali-common.h>
 
 namespace Dali
 {
-
 namespace Internal
 {
-
 namespace SceneGraph
 {
-
 PropertyOwner* PropertyOwner::New()
 {
   return new PropertyOwner();
@@ -47,18 +45,18 @@ PropertyOwner::~PropertyOwner()
 void PropertyOwner::AddObserver(Observer& observer)
 {
   //Check for duplicates in debug builds
-  DALI_ASSERT_DEBUG( mObservers.End() == std::find( mObservers.Begin(), mObservers.End(), &observer ) );
+  DALI_ASSERT_DEBUG(mObservers.End() == std::find(mObservers.Begin(), mObservers.End(), &observer));
 
-  mObservers.PushBack( &observer );
+  mObservers.PushBack(&observer);
 }
 
 void PropertyOwner::RemoveObserver(Observer& observer)
 {
   // Find the observer...
-  const ConstObserverIter endIter =  mObservers.End();
-  for( ObserverIter iter = mObservers.Begin(); iter != endIter; ++iter)
+  const ConstObserverIter endIter = mObservers.End();
+  for(ObserverIter iter = mObservers.Begin(); iter != endIter; ++iter)
   {
-    if( (*iter) == &observer)
+    if((*iter) == &observer)
     {
       // erase it
       mObservers.Erase(iter);
@@ -76,7 +74,7 @@ void PropertyOwner::Destroy()
 {
   // Notification for observers
   const ConstObserverIter endIter = mObservers.End();
-  for( ConstObserverIter iter = mObservers.Begin(); iter != endIter; ++iter)
+  for(ConstObserverIter iter = mObservers.Begin(); iter != endIter; ++iter)
   {
     (*iter)->PropertyOwnerDestroyed(*this);
   }
@@ -89,52 +87,40 @@ void PropertyOwner::Destroy()
 
 void PropertyOwner::ConnectToSceneGraph()
 {
+  mIsConnectedToSceneGraph = true;
+  SetUpdated(true);
+
   // Notification for observers
   const ConstObserverIter endIter = mObservers.End();
-  for( ConstObserverIter iter = mObservers.Begin(); iter != endIter; ++iter)
+  for(ConstObserverIter iter = mObservers.Begin(); iter != endIter; ++iter)
   {
-    (*iter)->PropertyOwnerConnected( *this );
+    (*iter)->PropertyOwnerConnected(*this);
   }
 }
 
-void PropertyOwner::DisconnectFromSceneGraph( BufferIndex updateBufferIndex )
+void PropertyOwner::DisconnectFromSceneGraph(BufferIndex updateBufferIndex)
 {
+  mIsConnectedToSceneGraph = false;
+
   // Notification for observers
   const ConstObserverIter endIter = mObservers.End();
-  for( ConstObserverIter iter = mObservers.Begin(); iter != endIter; ++iter)
+  for(ConstObserverIter iter = mObservers.Begin(); iter != endIter; ++iter)
   {
-    (*iter)->PropertyOwnerDisconnected( updateBufferIndex, *this );
+    (*iter)->PropertyOwnerDisconnected(updateBufferIndex, *this);
   }
 
   // Remove all constraints when disconnected from scene-graph
   mConstraints.Clear();
 }
 
-void PropertyOwner::InstallCustomProperty(PropertyBase* property)
+void PropertyOwner::ReserveProperties(int propertyCount)
 {
-  DALI_ASSERT_DEBUG( NULL != property );
-
-  mCustomProperties.PushBack( property );
+  mCustomProperties.Reserve(propertyCount);
 }
 
-void PropertyOwner::ResetToBaseValues( BufferIndex updateBufferIndex )
+void PropertyOwner::InstallCustomProperty(OwnerPointer<PropertyBase>& property)
 {
-  // Reset custom properties
-  const OwnedPropertyIter endIter = mCustomProperties.End();
-  for ( OwnedPropertyIter iter = mCustomProperties.Begin(); endIter != iter; ++iter )
-  {
-    (*iter)->ResetToBaseValue( updateBufferIndex );
-  }
-
-  // Reset constraint weights
-  const ConstraintIter constraintEndIter = mConstraints.End();
-  for( ConstraintIter iter = mConstraints.Begin(); constraintEndIter != iter; ++iter )
-  {
-    (*iter)->mWeight.ResetToBaseValue( updateBufferIndex );
-  }
-
-  // Notification for derived classes, to reset default properties
-  ResetDefaultProperties( updateBufferIndex );
+  mCustomProperties.PushBack(property.Release());
 }
 
 ConstraintOwnerContainer& PropertyOwner::GetConstraints()
@@ -142,32 +128,48 @@ ConstraintOwnerContainer& PropertyOwner::GetConstraints()
   return mConstraints;
 }
 
-void PropertyOwner::ApplyConstraint( ConstraintBase* constraint )
+void PropertyOwner::ApplyConstraint(OwnerPointer<ConstraintBase>& constraint)
 {
-  mConstraints.PushBack( constraint );
-
   constraint->OnConnect();
+  mConstraints.PushBack(constraint.Release());
 }
 
-void PropertyOwner::RemoveConstraint( ConstraintBase* constraint )
+void PropertyOwner::RemoveConstraint(ConstraintBase* constraint)
 {
-  // Reset constraint weights
   const ConstraintIter constraintEndIter = mConstraints.End();
-  for( ConstraintIter iter = mConstraints.Begin(); constraintEndIter != iter; ++iter )
+  for(ConstraintIter iter = mConstraints.Begin(); constraintEndIter != iter; ++iter)
   {
-    if ( *iter == constraint )
+    if(*iter == constraint)
     {
-      mConstraints.Erase( iter );
+      mConstraints.Erase(iter);
       return; // We're finished
     }
   }
 
-  // Should not come here
-  DALI_ASSERT_DEBUG( false && "Constraint missing in RemoveConstraint" );
+  //it may be that the constraint has already been removed e.g. from disconnection from scene graph, so nothing needs to be done
 }
 
 PropertyOwner::PropertyOwner()
+: mUpdated(false),
+  mIsConnectedToSceneGraph(false)
+{
+}
+
+void PropertyOwner::AddUniformMapping(const UniformPropertyMapping& map)
+{
+  mUniformMaps.Add(map);
+  OnMappingChanged();
+}
+
+void PropertyOwner::RemoveUniformMapping(const ConstString& uniformName)
+{
+  mUniformMaps.Remove(uniformName);
+  OnMappingChanged();
+}
+
+const UniformMap& PropertyOwner::GetUniformMap() const
 {
+  return mUniformMaps;
 }
 
 } // namespace SceneGraph