blob: c748e791e666b9d830f9944998303872b31d0aae [file] [log] [blame] [edit]
#ifndef _RIVE_DRAGGABLE_CONSTRAINT_HPP_
#define _RIVE_DRAGGABLE_CONSTRAINT_HPP_
#include "rive/generated/constraints/draggable_constraint_base.hpp"
#include "rive/animation/state_machine_listener.hpp"
#include "rive/drawable.hpp"
#include "rive/listener_group.hpp"
#include "rive/math/vec2d.hpp"
#include "rive/process_event_result.hpp"
#include <stdio.h>
namespace rive
{
class HitComponent;
enum class DraggableConstraintDirection : uint8_t
{
horizontal,
vertical,
all
};
class DraggableProxy
{
protected:
Drawable* m_hittable;
public:
virtual ~DraggableProxy() {}
virtual bool isOpaque() { return false; }
virtual bool startDrag(Vec2D mousePosition, float timeStamp = 0) = 0;
virtual bool drag(Vec2D mousePosition, float timeStamp = 0) = 0;
virtual bool endDrag(Vec2D mousePosition, float timeStamp = 0) = 0;
Drawable* hittable() { return m_hittable; }
};
class DraggableConstraint : public DraggableConstraintBase,
public ListenerGroupProvider
{
public:
DraggableConstraint() {}
virtual std::vector<DraggableProxy*> draggables() = 0;
DraggableConstraintDirection direction()
{
return DraggableConstraintDirection(directionValue());
}
bool constrainsHorizontal()
{
auto dir = direction();
return dir == DraggableConstraintDirection::horizontal ||
dir == DraggableConstraintDirection::all;
}
bool constrainsVertical()
{
auto dir = direction();
return dir == DraggableConstraintDirection::vertical ||
dir == DraggableConstraintDirection::all;
}
std::vector<ListenerGroupWithTargets*> listenerGroups() override;
std::vector<HitComponent*> hitComponents(StateMachineInstance* sm) override
{
return {};
}
};
class DraggableConstraintListenerGroup : public ListenerGroup
{
public:
DraggableConstraintListenerGroup(const StateMachineListener* listener,
DraggableConstraint* constraint,
DraggableProxy* draggable) :
ListenerGroup(listener),
m_constraint(constraint),
m_draggable(draggable)
{}
~DraggableConstraintListenerGroup()
{
delete listener();
delete m_draggable;
}
void enable(int pointerId = 0) override {}
void disable(int pointerId = 0) override {}
DraggableConstraint* constraint() { return m_constraint; }
bool canEarlyOut(Component* drawable) override { return false; }
bool needsDownListener(Component* drawable) override { return true; }
bool needsUpListener(Component* drawable) override { return true; }
ProcessEventResult processEvent(
Component* component,
Vec2D position,
int pointerId,
ListenerType hitEvent,
bool canHit,
float timeStamp,
StateMachineInstance* stateMachineInstance) override;
private:
DraggableConstraint* m_constraint;
DraggableProxy* m_draggable;
bool m_hasScrolled = false;
};
} // namespace rive
#endif