| #ifndef _RIVE_SEMANTIC_TRAIT_HPP_ |
| #define _RIVE_SEMANTIC_TRAIT_HPP_ |
| |
| #include "rive/generated/semantic/semantic_data_base.hpp" |
| #include <cstdint> |
| |
| namespace rive |
| { |
| /// Bitmask constants for semantic trait flags. |
| /// |
| /// Traits sit between Role and State: they declare what *capabilities* |
| /// a semantic node has. A state flag is only meaningful when its |
| /// corresponding trait is set. |
| /// |
| /// Example: a button with the Expandable trait can be Expanded or |
| /// collapsed. Without the trait the Expanded state bit is ignored. |
| /// |
| /// Stored in SemanticNode::traitFlags and transmitted in |
| /// SemanticsDiffNode::traitFlags. Platform accessibility layers use |
| /// traits to distinguish "property not applicable" from "property is |
| /// false" (the tristate problem). |
| /// |
| /// Values are pulled from SemanticDataBase's generated `*Bitmask` |
| /// constants, which are derived from the authoritative JSON definitions. |
| /// Editing the bit layout means editing dev/defs/semantic/semantic_data.json |
| /// and regenerating — the enum values will track automatically. |
| enum class SemanticTrait : uint32_t |
| { |
| None = 0, |
| |
| /// Node can be expanded / collapsed (disclosure). |
| Expandable = SemanticDataBase::isExpandableBitmask, |
| |
| /// Node can be selected / unselected. |
| Selectable = SemanticDataBase::isSelectableBitmask, |
| |
| /// Node can be checked / unchecked (checkbox, radio). |
| Checkable = SemanticDataBase::isCheckableBitmask, |
| |
| /// Node can be toggled on / off (switch). |
| Toggleable = SemanticDataBase::isToggleableBitmask, |
| |
| /// Node can be marked as required / optional (form field). |
| Requirable = SemanticDataBase::isRequirableBitmask, |
| |
| /// Node has an enabled / disabled concept. |
| /// Without this trait, the Disabled state bit is ignored and the |
| /// platform sees the node as neither enabled nor disabled. |
| Enablable = SemanticDataBase::isEnablableBitmask, |
| |
| /// Node can receive focus. Auto-set by the runtime when a sibling |
| /// FocusData exists. |
| Focusable = SemanticDataBase::isFocusableBitmask, |
| }; |
| |
| constexpr SemanticTrait operator|(SemanticTrait a, SemanticTrait b) |
| { |
| return static_cast<SemanticTrait>(static_cast<uint32_t>(a) | |
| static_cast<uint32_t>(b)); |
| } |
| |
| constexpr SemanticTrait operator&(SemanticTrait a, SemanticTrait b) |
| { |
| return static_cast<SemanticTrait>(static_cast<uint32_t>(a) & |
| static_cast<uint32_t>(b)); |
| } |
| |
| constexpr bool hasSemanticTrait(uint32_t flags, SemanticTrait trait) |
| { |
| return (flags & static_cast<uint32_t>(trait)) != 0; |
| } |
| } // namespace rive |
| |
| #endif |