blob: 437b1a283249986c431da014b33f6dc5c302ac47 [file] [log] [blame]
#ifndef _RIVE_ARTBOARD_COMPONENT_LIST_HPP_
#define _RIVE_ARTBOARD_COMPONENT_LIST_HPP_
#include "rive/generated/artboard_component_list_base.hpp"
#include "rive/layout/artboard_component_list_override.hpp"
#include "rive/advancing_component.hpp"
#include "rive/resetting_component.hpp"
#include "rive/animation/state_machine_instance.hpp"
#include "rive/artboard.hpp"
#include "rive/constraints/constrainable_list.hpp"
#include "rive/property_recorder.hpp"
#include "rive/file.hpp"
#include "rive/artboard_host.hpp"
#include "rive/data_bind/data_bind_list_item_consumer.hpp"
#include "rive/layout/layout_node_provider.hpp"
#include "rive/viewmodel/viewmodel_instance_list_item.hpp"
#include "rive/virtualizing_component.hpp"
#include <stdio.h>
#include <unordered_map>
namespace rive
{
class LayoutComponent;
class ScrollConstraint;
class ArtboardComponentList : public ArtboardComponentListBase,
public ArtboardHost,
public AdvancingComponent,
public ResettingComponent,
public LayoutNodeProvider,
public DataBindListItemConsumer,
public VirtualizingComponent,
public ConstrainableList
{
private:
std::vector<rcp<ViewModelInstanceListItem>> m_listItems;
std::vector<rcp<ViewModelInstanceListItem>> m_oldItems;
public:
ArtboardComponentList();
~ArtboardComponentList() override;
#ifdef WITH_RIVE_LAYOUT
void* layoutNode(int index) override;
#endif
size_t artboardCount() override { return m_listItems.size(); }
rcp<ViewModelInstanceListItem> listItem(int index);
ArtboardInstance* artboardInstance(int index = 0) override;
StateMachineInstance* stateMachineInstance(int index = 0);
bool worldToLocal(Vec2D world, Vec2D* local, int index);
bool advanceComponent(float elapsedSeconds,
AdvanceFlags flags = AdvanceFlags::Animate |
AdvanceFlags::NewFrame) override;
void reset() override;
AABB layoutBounds() override;
AABB layoutBoundsForNode(int index) override;
void markHostingLayoutDirty(ArtboardInstance* artboardInstance) override;
TransformComponent* transformComponent() override
{
return this->as<TransformComponent>();
}
void updateWorldTransform() override;
void updateList(std::vector<rcp<ViewModelInstanceListItem>>* list) override;
void draw(Renderer* renderer) override;
bool willDraw() override;
Core* hitTest(HitInfo*, const Mat2D&) override;
void update(ComponentDirt value) override;
void updateConstraints() override;
void internalDataContext(DataContext* dataContext) override;
void bindViewModelInstance(rcp<ViewModelInstance> viewModelInstance,
DataContext* parent) override;
void clearDataContext() override;
void unbind() override;
void updateDataBinds() override;
Artboard* parentArtboard() override { return artboard(); }
bool hitTestHost(const Vec2D& position,
bool skipOnUnclipped,
ArtboardInstance* artboard) override;
Vec2D hostTransformPoint(const Vec2D& vec, ArtboardInstance*) override;
void markHostTransformDirty() override { markTransformDirty(); }
bool syncStyleChanges() override;
void updateLayoutBounds(bool animate = true) override;
void markLayoutNodeDirty(
bool shouldForceUpdateLayoutBounds = false) override;
bool isLayoutProvider() override { return true; }
size_t numLayoutNodes() override { return m_listItems.size(); }
void clear();
void file(File*) override;
File* file() const override;
Core* clone() const override;
// API used by the virtualizer
Artboard* findArtboard(
const rcp<ViewModelInstanceListItem>& listItem) const;
void addVirtualizable(int index) override;
void removeVirtualizable(int index) override;
void setVisibleIndices(int start, int end) override
{
m_visibleStartIndex = start;
m_visibleEndIndex = end;
}
void shouldResetInstances(bool value) { m_shouldResetInstances = value; }
void setVirtualizablePosition(int index, Vec2D position) override;
void createArtboardAt(int index);
void addArtboardAt(std::unique_ptr<ArtboardInstance> artboard, int index);
void removeArtboardAt(int index);
void removeArtboard(rcp<ViewModelInstanceListItem> item);
bool virtualizationEnabled() override;
ScrollConstraint* scrollConstraint();
int itemCount() override { return (int)m_listItems.size(); }
Virtualizable* item(int index) override { return artboardInstance(index); }
void setItemSize(Vec2D size, int index) override;
Vec2D size() override;
Vec2D itemSize(int index) override;
float gap();
void syncLayoutChildren();
bool mainAxisIsRow();
LayoutComponent* layoutParent();
const Mat2D& listTransform() override;
void listItemTransforms(std::vector<Mat2D*>& transforms) override;
private:
void updateArtboardsWorldTransform();
void disposeListItem(const rcp<ViewModelInstanceListItem>& listItem);
std::unique_ptr<ArtboardInstance> createArtboard(
Component* target,
rcp<ViewModelInstanceListItem> listItem) const;
void bindArtboard(ArtboardInstance* artboard,
rcp<ViewModelInstanceListItem> listItem);
std::unique_ptr<StateMachineInstance> createStateMachineInstance(
Component* target,
ArtboardInstance* artboard);
void linkStateMachineToArtboard(StateMachineInstance* stateMachineInstance,
ArtboardInstance* artboard);
void computeLayoutBounds();
void createArtboardRecorders(const Artboard*);
void applyRecorders(Artboard* artboard, const Artboard* sourceArtboard);
void applyRecorders(StateMachineInstance* stateMachineInstance,
const Artboard* sourceArtboard);
mutable std::unordered_map<uint32_t, Artboard*> m_artboardsMap;
std::unordered_map<rcp<ViewModelInstanceListItem>,
std::unique_ptr<ArtboardInstance>>
m_artboardInstancesMap;
std::unordered_map<rcp<ViewModelInstanceListItem>,
std::unique_ptr<StateMachineInstance>>
m_stateMachinesMap;
std::unordered_map<Artboard*,
std::vector<std::unique_ptr<ArtboardInstance>>>
m_resourcePool;
std::unordered_map<Artboard*,
std::vector<std::unique_ptr<StateMachineInstance>>>
m_stateMachinesPool;
std::unordered_map<const Artboard*, std::unique_ptr<PropertyRecorder>>
m_propertyRecordersMap;
std::unordered_map<ArtboardInstance*, Mat2D> m_artboardTransforms;
Vec2D artboardPosition(ArtboardInstance* artboard);
File* m_file = nullptr;
std::vector<Vec2D> m_artboardSizes;
Vec2D m_layoutSize;
int m_visibleStartIndex = -1;
int m_visibleEndIndex = -1;
std::unordered_map<ArtboardInstance*, ArtboardComponentListOverride*>
m_artboardOverridesMap;
void attachArtboardOverride(ArtboardInstance*,
rcp<ViewModelInstanceListItem>);
void clearArtboardOverride(ArtboardInstance*);
bool m_shouldResetInstances = false;
bool listsAreEqual(std::vector<rcp<ViewModelInstanceListItem>>* list,
std::vector<rcp<ViewModelInstanceListItem>>* compared);
};
} // namespace rive
#endif