fix: keep unprocessed data binds until they are consumed (#10732) f4b36c2d03 Co-authored-by: hernan <hernan@rive.app>
diff --git a/.rive_head b/.rive_head index d4b2016..9c83d97 100644 --- a/.rive_head +++ b/.rive_head
@@ -1 +1 @@ -b73733a0525518a76e8a6b32a2529a2dea319ace +f4b36c2d03f14884451fccd8947c6751e58b6683
diff --git a/include/rive/data_bind/data_bind_container.hpp b/include/rive/data_bind/data_bind_container.hpp index 77ade01..38883e6 100644 --- a/include/rive/data_bind/data_bind_container.hpp +++ b/include/rive/data_bind/data_bind_container.hpp
@@ -22,10 +22,11 @@ void sortDataBinds(); private: - void updateDataBind(DataBind* dataBind, bool applyTargetToSource); + bool updateDataBind(DataBind* dataBind, bool applyTargetToSource); std::vector<DataBind*> m_dataBinds; std::vector<DataBind*> m_persistingDataBinds; std::vector<DataBind*> m_dirtyDataBinds; + std::vector<DataBind*> m_unprocessedDirtyDataBinds; }; } // namespace rive
diff --git a/src/data_bind/data_bind_container.cpp b/src/data_bind/data_bind_container.cpp index b4d5b25..38c9134 100644 --- a/src/data_bind/data_bind_container.cpp +++ b/src/data_bind/data_bind_container.cpp
@@ -65,12 +65,12 @@ dataBind->container(this); } -void DataBindContainer::updateDataBind(DataBind* dataBind, +bool DataBindContainer::updateDataBind(DataBind* dataBind, bool applyTargetToSource) { if (dataBind->canSkip()) { - return; + return false; } auto d = dataBind->dirt(); @@ -96,6 +96,7 @@ dataBind->updateSourceBinding(); } + return true; } void DataBindContainer::updateDataBinds(bool applyTargetToSource) @@ -109,9 +110,15 @@ // data binds on this list don't need to apply target to source because // any data bind that applies to source is collected on the // m_persistingDataBinds list - updateDataBind(dataBind, false); + if (!updateDataBind(dataBind, false)) + { + m_unprocessedDirtyDataBinds.push_back(dataBind); + } } m_dirtyDataBinds.clear(); + m_dirtyDataBinds.assign(m_unprocessedDirtyDataBinds.begin(), + m_unprocessedDirtyDataBinds.end()); + m_unprocessedDirtyDataBinds.clear(); } void DataBindContainer::sortDataBinds()