blob: 7a6e4847ecfbe536333d2c3c0081c7ce014941ff [file] [log] [blame]
#ifndef _RIVE_FOCUS_DATA_HPP_
#define _RIVE_FOCUS_DATA_HPP_
#include "rive/component_dirt.hpp"
#include "rive/generated/focus_data_base.hpp"
#include "rive/input/focus_node.hpp"
#include "rive/input/focusable.hpp"
#include "rive/math/aabb.hpp"
#include "rive/refcnt.hpp"
#include <vector>
namespace rive
{
class FocusListener;
class FocusData : public FocusDataBase, public Focusable
{
public:
~FocusData() override;
rcp<FocusNode> focusNode();
/// Register a listener to be notified of focus/blur events.
void addFocusListener(FocusListener* listener);
/// Unregister a listener.
void removeFocusListener(FocusListener* listener);
/// Programmatically focus this node.
void focus();
/// Find the parent FocusData by walking up the component hierarchy.
/// Returns nullptr if no parent FocusData exists.
FocusData* findParentFocusData() const;
/// Find the closest FocusNode for a component by walking up the hierarchy.
/// Checks parent nodes for FocusData children, and crosses artboard
/// boundaries using externalParentFocusNode.
/// @param component The component to start searching from
/// @return The closest FocusNode, or nullptr if none found
static rcp<FocusNode> findClosestFocusNode(Component* component);
// Focusable interface implementation
bool keyInput(Key value,
KeyModifiers modifiers,
bool isPressed,
bool isRepeat) override;
bool textInput(const std::string& text) override;
void focused() override;
void blurred() override;
bool worldPosition(Vec2D& outPosition) override;
Artboard* focusableArtboard() const override { return artboard(); }
// Component overrides for update cycle
void buildDependencies() override;
void update(ComponentDirt value) override;
protected:
void canFocusChanged() override;
void canTouchChanged() override;
void canTraverseChanged() override;
void edgeBehaviorValueChanged() override;
void nameChanged() override;
private:
void updateWorldBounds();
void scrollIntoView();
void scrollConstraintToShowBounds(class ScrollConstraint* constraint,
const AABB& elementBounds);
rcp<FocusNode> m_focusNode;
std::vector<FocusListener*> m_focusListeners;
};
} // namespace rive
#endif