text: // Copyright 2013 The Flutter Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style license that can be
  // found in the LICENSE file.
  
  #ifndef FLUTTER_LIB_UI_SEMANTICS_SEMANTICS_NODE_H_
  #define FLUTTER_LIB_UI_SEMANTICS_SEMANTICS_NODE_H_
  
  #include <cstdint>
  #include <string>
  #include <unordered_map>
  #include <vector>
  
  #include "third_party/skia/include/core/SkM44.h"
  #include "third_party/skia/include/core/SkRect.h"
  
  #include "flutter/lib/ui/semantics/string_attribute.h"
  
  namespace flutter {
  
  // Must match the SemanticsAction enum in semantics.dart and in each of the
  // embedders.
  enum class SemanticsAction : int32_t {
    kTap = 1 << 0,
    kLongPress = 1 << 1,
    kScrollLeft = 1 << 2,
    kScrollRight = 1 << 3,
    kScrollUp = 1 << 4,
    kScrollDown = 1 << 5,
    kIncrease = 1 << 6,
    kDecrease = 1 << 7,
    kShowOnScreen = 1 << 8,
    kMoveCursorForwardByCharacter = 1 << 9,
    kMoveCursorBackwardByCharacter = 1 << 10,
    kSetSelection = 1 << 11,
    kCopy = 1 << 12,
    kCut = 1 << 13,
    kPaste = 1 << 14,
    kDidGainAccessibilityFocus = 1 << 15,
    kDidLoseAccessibilityFocus = 1 << 16,
    kCustomAction = 1 << 17,
    kDismiss = 1 << 18,
    kMoveCursorForwardByWordIndex = 1 << 19,
    kMoveCursorBackwardByWordIndex = 1 << 20,
    kSetText = 1 << 21,
  };
  
  const int kVerticalScrollSemanticsActions =
      static_cast<int32_t>(SemanticsAction::kScrollUp) |
      static_cast<int32_t>(SemanticsAction::kScrollDown);
  
  const int kHorizontalScrollSemanticsActions =
      static_cast<int32_t>(SemanticsAction::kScrollLeft) |
      static_cast<int32_t>(SemanticsAction::kScrollRight);
  
  const int kScrollableSemanticsActions =
      kVerticalScrollSemanticsActions | kHorizontalScrollSemanticsActions;
  
  /// C/C++ representation of `SemanticsFlags` defined in
  /// `lib/ui/semantics.dart`.
  ///\warning This must match the `SemanticsFlags` enum in
  ///         `lib/ui/semantics.dart`.
  /// See also:
  ///   - file://./../../../lib/ui/semantics.dart
  enum class SemanticsFlags : int32_t {
    kHasCheckedState = 1 << 0,
    kIsChecked = 1 << 1,
    kIsSelected = 1 << 2,
    kIsButton = 1 << 3,
    kIsTextField = 1 << 4,
    kIsFocused = 1 << 5,
    kHasEnabledState = 1 << 6,
    kIsEnabled = 1 << 7,
    kIsInMutuallyExclusiveGroup = 1 << 8,
    kIsHeader = 1 << 9,
    kIsObscured = 1 << 10,
    kScopesRoute = 1 << 11,
    kNamesRoute = 1 << 12,
    kIsHidden = 1 << 13,
    kIsImage = 1 << 14,
    kIsLiveRegion = 1 << 15,
    kHasToggledState = 1 << 16,
    kIsToggled = 1 << 17,
    kHasImplicitScrolling = 1 << 18,
    // The Dart API defines the following flag but it isn't used in iOS.
    // kIsMultiline = 1 << 19,
    kIsReadOnly = 1 << 20,
    kIsFocusable = 1 << 21,
    kIsLink = 1 << 22,
    kIsSlider = 1 << 23,
    kIsKeyboardKey = 1 << 24,
  };
  
  const int kScrollableSemanticsFlags =
      static_cast<int32_t>(SemanticsFlags::kHasImplicitScrolling);
  
  struct SemanticsNode {
    SemanticsNode();
  
    SemanticsNode(const SemanticsNode& other);
  
    ~SemanticsNode();
  
    bool HasAction(SemanticsAction action) const;
    bool HasFlag(SemanticsFlags flag) const;
  
    // Whether this node is for embedded platform views.
    bool IsPlatformViewNode() const;
  
    int32_t id = 0;
    int32_t flags = 0;
    int32_t actions = 0;
    int32_t maxValueLength = -1;
    int32_t currentValueLength = -1;
    int32_t textSelectionBase = -1;
    int32_t textSelectionExtent = -1;
    int32_t platformViewId = -1;
    int32_t scrollChildren = 0;
    int32_t scrollIndex = 0;
    double scrollPosition = std::nan("");
    double scrollExtentMax = std::nan("");
    double scrollExtentMin = std::nan("");
    double elevation = 0.0;
    double thickness = 0.0;
    std::string label;
    StringAttributes labelAttributes;
    std::string hint;
    StringAttributes hintAttributes;
    std::string value;
    StringAttributes valueAttributes;
    std::string increasedValue;
    StringAttributes increasedValueAttributes;
    std::string decreasedValue;
    StringAttributes decreasedValueAttributes;
    int32_t textDirection = 0;  // 0=unknown, 1=rtl, 2=ltr
  
    SkRect rect = SkRect::MakeEmpty();  // Local space, relative to parent.
    SkM44 transform = SkM44{};          // Identity
    std::vector<int32_t> childrenInTraversalOrder;
    std::vector<int32_t> childrenInHitTestOrder;
    std::vector<int32_t> customAccessibilityActions;
  };
  
  // Contains semantic nodes that need to be updated.
  //
  // The keys in the map are stable node IDd, and the values contain
  // semantic information for the node corresponding to the ID.
  using SemanticsNodeUpdates = std::unordered_map<int32_t, SemanticsNode>;
  
  }  // namespace flutter
  
  #endif  // FLUTTER_LIB_UI_SEMANTICS_SEMANTICS_NODE_H_
  