blob: 6af399055329a0412e596a6282e3b8d889bb8926 [file] [log] [blame] [edit]
#ifndef _RIVE_NESTED_ARTBOARD_HPP_
#define _RIVE_NESTED_ARTBOARD_HPP_
#include "rive/generated/nested_artboard_base.hpp"
#include "rive/artboard_host.hpp"
#include "rive/data_bind/data_context.hpp"
#include "rive/viewmodel/viewmodel_instance_value.hpp"
#include "rive/hit_info.hpp"
#include "rive/span.hpp"
#include "rive/advancing_component.hpp"
#include "rive/resetting_component.hpp"
#include "rive/viewmodel/viewmodel_instance_artboard.hpp"
#include "rive/refcnt.hpp"
#include "rive/file.hpp"
#include <stdio.h>
namespace rive
{
class ArtboardInstance;
class NestedAnimation;
class NestedInput;
class NestedStateMachine;
class StateMachineInstance;
class NestedArtboard : public NestedArtboardBase,
public AdvancingComponent,
public ResettingComponent,
public ArtboardHost
{
protected:
Artboard* m_Artboard = nullptr; // might point to m_Instance, and might not
std::unique_ptr<ArtboardInstance> m_Instance; // may be null
std::unique_ptr<NestedStateMachine>
m_boundNestedStateMachine; // may be null
std::vector<NestedAnimation*> m_NestedAnimations;
File* m_file = nullptr;
rcp<ViewModelInstance> m_viewModelInstance = nullptr;
DataContext* m_dataContext = nullptr;
protected:
std::vector<uint32_t> m_DataBindPathIdsBuffer;
private:
Artboard* findArtboard(
ViewModelInstanceArtboard* viewModelInstanceArtboard);
void clearNestedAnimations();
public:
NestedArtboard();
~NestedArtboard() override;
StatusCode onAddedClean(CoreContext* context) override;
void draw(Renderer* renderer) override;
Core* hitTest(HitInfo*, const Mat2D&) override;
void addNestedAnimation(NestedAnimation* nestedAnimation);
void nest(Artboard* artboard);
virtual void updateArtboard(
ViewModelInstanceArtboard* viewModelInstanceArtboard);
size_t artboardCount() override { return 1; }
ArtboardInstance* artboardInstance(int index = 0) override
{
return m_Instance.get();
}
Artboard* sourceArtboard() { return m_Artboard; }
StatusCode import(ImportStack& importStack) override;
Core* clone() const override;
void update(ComponentDirt value) override;
bool hasNestedStateMachines() const;
Span<NestedAnimation*> nestedAnimations();
NestedArtboard* nestedArtboard(std::string name) const;
NestedStateMachine* stateMachine(std::string name) const;
NestedInput* input(std::string name) const;
NestedInput* input(std::string name, std::string stateMachineName) const;
Vec2D measureLayout(float width,
LayoutMeasureMode widthMode,
float height,
LayoutMeasureMode heightMode) override;
void controlSize(Vec2D size,
LayoutScaleType widthScaleType,
LayoutScaleType heightScaleType,
LayoutDirection direction) override;
/// Convert a world space (relative to the artboard that this
/// NestedArtboard is a child of) to the local space of the Artboard
/// nested within. Returns true when the conversion succeeds, and false
/// when one is not possible.
bool worldToLocal(Vec2D world, Vec2D* local);
void decodeDataBindPathIds(Span<const uint8_t> value) override;
void copyDataBindPathIds(const NestedArtboardBase& object) override;
std::vector<uint32_t> dataBindPathIds() override
{
return m_DataBindPathIdsBuffer;
};
void bindViewModelInstance(rcp<ViewModelInstance> viewModelInstance,
DataContext* parent) override;
void internalDataContext(DataContext* dataContext) override;
void clearDataContext() override;
void unbind() override;
void updateDataBinds() override;
bool advanceComponent(float elapsedSeconds,
AdvanceFlags flags = AdvanceFlags::Animate |
AdvanceFlags::NewFrame) override;
void reset() override;
Artboard* parentArtboard() override { return artboard(); }
Vec2D hostTransformPoint(const Vec2D&, ArtboardInstance*) override;
bool hitTestHost(const Vec2D& position,
bool skipOnUnclipped,
ArtboardInstance* artboard) override;
void markHostTransformDirty() override { markTransformDirty(); }
void file(File*) override;
File* file() const override;
};
} // namespace rive
#endif