| #include "rive/constraints/scrolling/scroll_bar_constraint.hpp" |
| #include "rive/constraints/scrolling/scroll_constraint.hpp" |
| #include "rive/constraints/scrolling/scroll_constraint_proxy.hpp" |
| #include "rive/math/vec2d.hpp" |
| |
| using namespace rive; |
| |
| bool ViewportDraggableProxy::drag(Vec2D mousePosition, float timeStamp) |
| { |
| if (!m_constraint->interactive()) |
| { |
| return false; |
| } |
| auto deltaPosition = mousePosition - m_lastPosition; |
| if (!m_isDragging) |
| { |
| switch (m_constraint->direction()) |
| { |
| case DraggableConstraintDirection::vertical: |
| { |
| if (std::abs(deltaPosition.y) > m_constraint->threshold()) |
| { |
| m_isDragging = true; |
| } |
| else |
| { |
| return false; |
| } |
| } |
| break; |
| case DraggableConstraintDirection::horizontal: |
| { |
| if (std::abs(deltaPosition.x) > m_constraint->threshold()) |
| { |
| m_isDragging = true; |
| } |
| else |
| { |
| return false; |
| } |
| } |
| break; |
| case DraggableConstraintDirection::all: |
| { |
| if (deltaPosition.length() > m_constraint->threshold()) |
| { |
| m_isDragging = true; |
| } |
| else |
| { |
| return false; |
| } |
| } |
| break; |
| } |
| } |
| m_constraint->dragView(deltaPosition, timeStamp); |
| m_lastPosition = mousePosition; |
| return true; |
| } |
| |
| bool ViewportDraggableProxy::startDrag(Vec2D mousePosition, float timeStamp) |
| { |
| if (!m_constraint->interactive()) |
| { |
| return false; |
| } |
| m_isDragging = false; |
| m_constraint->initPhysics(); |
| m_lastPosition = mousePosition; |
| return true; |
| } |
| |
| bool ViewportDraggableProxy::endDrag(Vec2D mousePosition, float timeStamp) |
| { |
| if (!m_constraint->interactive()) |
| { |
| return false; |
| } |
| m_constraint->runPhysics(); |
| return true; |
| } |