blob: 1916fa215459c730586f0d5664be935edc2dbd2f [file] [log] [blame]
#ifndef _RIVE_COMPONENT_HPP_
#define _RIVE_COMPONENT_HPP_
#include "rive/component_dirt.hpp"
#include "rive/generated/component_base.hpp"
#include <vector>
namespace rive
{
class ContainerComponent;
class Artboard;
class Component : public ComponentBase
{
friend class Artboard;
private:
ContainerComponent* m_Parent = nullptr;
std::vector<Component*> m_Dependents;
unsigned int m_GraphOrder;
Artboard* m_Artboard = nullptr;
protected:
ComponentDirt m_Dirt = ComponentDirt::Filthy;
public:
inline Artboard* artboard() const { return m_Artboard; }
StatusCode onAddedDirty(CoreContext* context) override;
inline ContainerComponent* parent() const { return m_Parent; }
const std::vector<Component*>& dependents() const
{
return m_Dependents;
}
void addDependent(Component* component);
// TODO: re-evaluate when more of the lib is complete...
// These could be pure virtual but we define them empty here to avoid
// having to implement them in a bunch of concrete classes that
// currently don't use this logic.
virtual void buildDependencies() {}
virtual void onDirty(ComponentDirt dirt) {}
virtual void update(ComponentDirt value) {}
unsigned int graphOrder() const { return m_GraphOrder; }
bool addDirt(ComponentDirt value, bool recurse = false);
inline bool hasDirt(ComponentDirt flag) const
{
return (m_Dirt & flag) == flag;
}
static inline bool hasDirt(ComponentDirt value, ComponentDirt flag)
{
return (value & flag) != ComponentDirt::None;
}
StatusCode import(ImportStack& importStack) override;
};
} // namespace rive
#endif