| #ifndef _RIVE_SEMANTIC_DATA_HPP_ |
| #define _RIVE_SEMANTIC_DATA_HPP_ |
| |
| #include "rive/component_dirt.hpp" |
| #include "rive/generated/semantic/semantic_data_base.hpp" |
| #include "rive/semantic/semantic_node.hpp" |
| #include "rive/refcnt.hpp" |
| |
| #include <vector> |
| |
| namespace rive |
| { |
| class SemanticListener; |
| class SemanticManager; |
| |
| class SemanticData : public SemanticDataBase |
| { |
| public: |
| ~SemanticData() override; |
| |
| rcp<SemanticNode> semanticNode(); |
| bool hasSemanticNode() const { return m_semanticNode != nullptr; } |
| |
| /// Set or clear the Focused state flag on the underlying SemanticNode. |
| /// This is runtime-driven (not authored), so it modifies the node directly. |
| void setFocusedState(bool focused); |
| |
| /// Request focus on a sibling FocusData (if any) via the FocusManager. |
| /// Returns true if focus was successfully set. |
| bool requestFocus(); |
| |
| /// Register/unregister a SemanticListener for semantic action callbacks. |
| void addSemanticListener(SemanticListener* listener); |
| void removeSemanticListener(SemanticListener* listener); |
| |
| /// Fire semantic actions, notifying all registered listeners. |
| void fireSemanticTap(); |
| void fireSemanticIncrease(); |
| void fireSemanticDecrease(); |
| |
| /// Find the parent SemanticData by walking up the component hierarchy. |
| SemanticData* findParentSemanticData() const; |
| |
| /// Find the closest SemanticNode for a component by walking up the |
| /// hierarchy. Crosses artboard boundaries via externalParentSemanticNode. |
| static rcp<SemanticNode> findClosestSemanticNode(Component* component); |
| |
| // Component overrides for update cycle |
| bool collapse(bool value) override; |
| void buildDependencies() override; |
| void update(ComponentDirt value) override; |
| void syncSemanticTreeVisibility(); |
| |
| protected: |
| void roleChanged() override; |
| void labelChanged() override; |
| void stateFlagsChanged() override; |
| void traitFlagsChanged() override; |
| void valueChanged() override; |
| void hintChanged() override; |
| void headingLevelChanged() override; |
| |
| uint32_t semanticId() const; |
| |
| private: |
| bool shouldExcludeFromSemanticTree() const; |
| rcp<SemanticNode> resolveParentNode() const; |
| void updateWorldBounds(); |
| void markContentDirty(); |
| void applyInferredSemanticsIfNeeded(); |
| rcp<SemanticNode> m_semanticNode; |
| SemanticManager* m_semanticManager = nullptr; |
| std::vector<SemanticListener*> m_semanticListeners; |
| bool m_boundsRetryPending = false; |
| bool m_excludedFromTree = false; |
| }; |
| } // namespace rive |
| |
| #endif |