blob: c4b399b315cf03fa8cd3b1e0ee04a331c3f33fb3 [file]
#ifndef _RIVE_DATA_BIND_CONTAINER_HPP_
#define _RIVE_DATA_BIND_CONTAINER_HPP_
#include <cstddef>
#include <vector>
namespace rive
{
class DataContext;
class DataBind;
class DataBindContainer
{
public:
virtual void updateDataBinds(bool applyTargetToSource = true);
void addDataBind(DataBind* dataBind);
void removeDataBind(DataBind* dataBind);
const std::vector<DataBind*> dataBinds() const { return m_dataBinds; }
virtual void addDirtyDataBind(DataBind* dataBind);
virtual void rebind() {};
virtual void relinkDataContext() {};
virtual void rebuildDataBind(DataBind*) {};
protected:
void deleteDataBinds();
bool advanceDataBinds(float);
void bindDataBindsFromContext(DataContext*);
void unbindDataBinds();
void sortDataBinds();
private:
void updateDataBind(DataBind* dataBind, bool applyTargetToSource);
std::vector<DataBind*> m_dataBinds;
std::vector<DataBind*> m_persistingDataBinds;
// Push-driven toSource binds waiting to apply target → source. Kept
// separate from m_dirtyDataBinds so updateDataBinds can run the
// target→source pass *before* the source→target pass. Without this, a
// target→source apply triggered later in the same updateDataBinds call
// would see a source value updated by a sibling toTarget bind that ran
// first.
std::vector<DataBind*> m_dirtyToSourceDataBinds;
std::vector<DataBind*> m_pendingDirtyToSourceDataBinds;
std::vector<DataBind*> m_dirtyDataBinds;
std::vector<DataBind*> m_pendingDirtyDataBinds;
std::vector<DataBind*> m_pendingAdditions;
std::vector<DataBind*> m_pendingRemovals;
DataContext* m_dataContext = nullptr;
bool m_isProcessing = false;
};
} // namespace rive
#endif