blob: 152ad283941d84501195b13d89e977ebc81ac1fa [file] [log] [blame]
#ifndef _RIVE_VIEW_MODEL_INSTANCE_VALUE_HPP_
#define _RIVE_VIEW_MODEL_INSTANCE_VALUE_HPP_
#include "rive/generated/viewmodel/viewmodel_instance_value_base.hpp"
#include "rive/animation/state_machine_input_instance.hpp"
#include "rive/viewmodel/viewmodel_property.hpp"
#include "rive/dependency_helper.hpp"
#include "rive/dirtyable.hpp"
#include "rive/component.hpp"
#include "rive/component_dirt.hpp"
#include "rive/refcnt.hpp"
#include <stdio.h>
#include <list>
namespace rive
{
class ViewModelInstance;
class ViewModelInstanceValueDelegate
{
public:
virtual void valueChanged() = 0;
};
enum class ValueFlags : uint8_t
{
valueChanged = 1 << 1,
delegatesChanged = 1 << 2,
delegating = 1 << 3,
};
RIVE_MAKE_ENUM_BITSET(ValueFlags)
class SuppressDelegation;
class ViewModelInstanceValue : public ViewModelInstanceValueBase,
public RefCnt<ViewModelInstanceValue>,
public Triggerable
{
friend class SuppressDelegation;
private:
ViewModelProperty* m_ViewModelProperty;
static std::string defaultName;
ValueFlags m_changeFlags;
std::vector<ViewModelInstanceValueDelegate*> m_delegates;
std::vector<ViewModelInstanceValueDelegate*> m_delegatesCopy;
public:
void addDelegate(ViewModelInstanceValueDelegate* delegate);
void removeDelegate(ViewModelInstanceValueDelegate* delegate);
protected:
DependencyHelper<rcp<ViewModelInstance>, Dirtyable> m_DependencyHelper;
void addDirt(ComponentDirt value);
// Suppress/restore calling delegates.
bool suppressDelegation();
void restoreDelegation();
public:
StatusCode import(ImportStack& importStack) override;
void viewModelProperty(ViewModelProperty* value);
ViewModelProperty* viewModelProperty();
void addDependent(Dirtyable* value);
void removeDependent(Dirtyable* value);
virtual void setRoot(rcp<ViewModelInstance> value);
virtual void advanced();
bool hasChanged();
void onValueChanged();
const std::string& name() const;
};
class SuppressDelegation
{
public:
SuppressDelegation(ViewModelInstanceValue* value) :
m_value(value), m_suppressed(value->suppressDelegation())
{}
~SuppressDelegation()
{
if (m_suppressed)
{
m_value->restoreDelegation();
}
}
private:
ViewModelInstanceValue* m_value;
bool m_suppressed;
};
} // namespace rive
#endif