1 /* 2 * Copyright (c) 2022-2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_GRID_GRID_PATTERN_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_GRID_GRID_PATTERN_H 18 19 #include <memory> 20 21 #include "base/geometry/axis.h" 22 #include "base/memory/referenced.h" 23 #include "core/components/scroll/scroll_controller_base.h" 24 #include "core/components_ng/pattern/grid/grid_accessibility_property.h" 25 #include "core/components_ng/pattern/grid/grid_event_hub.h" 26 #include "core/components_ng/pattern/grid/grid_layout_info.h" 27 #include "core/components_ng/pattern/grid/grid_layout_property.h" 28 #include "core/components_ng/pattern/grid/grid_paint_method.h" 29 #include "core/components_ng/pattern/grid/grid_position_controller.h" 30 #include "core/components_ng/pattern/pattern.h" 31 #include "core/components_ng/pattern/scroll_bar/proxy/scroll_bar_proxy.h" 32 #include "core/components_ng/pattern/scrollable/scrollable_pattern.h" 33 34 namespace OHOS::Ace::NG { 35 class ACE_EXPORT GridPattern : public ScrollablePattern { 36 DECLARE_ACE_TYPE(GridPattern, ScrollablePattern); 37 38 public: 39 GridPattern() = default; 40 CreateLayoutProperty()41 RefPtr<LayoutProperty> CreateLayoutProperty() override 42 { 43 return MakeRefPtr<GridLayoutProperty>(); 44 } 45 46 RefPtr<LayoutAlgorithm> CreateLayoutAlgorithm() override; 47 48 RefPtr<PaintProperty> CreatePaintProperty() override; 49 50 RefPtr<NodePaintMethod> CreateNodePaintMethod() override; 51 CreateAccessibilityProperty()52 RefPtr<AccessibilityProperty> CreateAccessibilityProperty() override 53 { 54 return MakeRefPtr<GridAccessibilityProperty>(); 55 } 56 IsScrollable()57 bool IsScrollable() const override 58 { 59 return isConfigScrollable_; 60 } 61 SetMultiSelectable(bool multiSelectable)62 void SetMultiSelectable(bool multiSelectable) 63 { 64 multiSelectable_ = multiSelectable; 65 } 66 MultiSelectable()67 bool MultiSelectable() const 68 { 69 return multiSelectable_; 70 } 71 SetSupportAnimation(bool supportAnimation)72 void SetSupportAnimation(bool supportAnimation) 73 { 74 supportAnimation_ = supportAnimation; 75 } 76 SupportAnimation()77 bool SupportAnimation() const 78 { 79 return supportAnimation_; 80 } 81 GetFocusPattern()82 FocusPattern GetFocusPattern() const override 83 { 84 return { FocusType::SCOPE, true }; 85 } 86 GetScopeFocusAlgorithm()87 ScopeFocusAlgorithm GetScopeFocusAlgorithm() override 88 { 89 auto property = GetLayoutProperty<GridLayoutProperty>(); 90 if (!property) { 91 return ScopeFocusAlgorithm(); 92 } 93 return ScopeFocusAlgorithm(property->IsVertical(), true, ScopeType::OTHERS, 94 [wp = WeakClaim(this)]( 95 FocusStep step, const WeakPtr<FocusHub>& currFocusNode, WeakPtr<FocusHub>& nextFocusNode) { 96 auto grid = wp.Upgrade(); 97 if (grid) { 98 nextFocusNode = grid->GetNextFocusNode(step, currFocusNode); 99 } 100 }); 101 } 102 103 int32_t GetFocusNodeIndex(const RefPtr<FocusHub>& focusNode) override; 104 105 void ScrollToFocusNodeIndex(int32_t index) override; 106 107 bool ScrollToNode(const RefPtr<FrameNode>& focusFrameNode) override; 108 CreateEventHub()109 RefPtr<EventHub> CreateEventHub() override 110 { 111 return MakeRefPtr<GridEventHub>(); 112 } 113 UsResRegion()114 bool UsResRegion() override 115 { 116 return false; 117 } 118 GetGridLayoutInfo()119 GridLayoutInfo GetGridLayoutInfo() const 120 { 121 return gridLayoutInfo_; 122 } 123 ResetGridLayoutInfo()124 void ResetGridLayoutInfo() 125 { 126 gridLayoutInfo_.lineHeightMap_.clear(); 127 gridLayoutInfo_.gridMatrix_.clear(); 128 gridLayoutInfo_.endIndex_ = gridLayoutInfo_.startIndex_ - 1; 129 gridLayoutInfo_.endMainLineIndex_ = 0; 130 gridLayoutInfo_.ResetPositionFlags(); 131 gridLayoutInfo_.irregularItemsPosition_.clear(); 132 } 133 134 void ToJsonValue(std::unique_ptr<JsonValue>& json) const override; 135 136 bool UpdateCurrentOffset(float offset, int32_t source) override; 137 IsAtTop()138 bool IsAtTop() const override 139 { 140 return gridLayoutInfo_.reachStart_; 141 } 142 IsAtBottom()143 bool IsAtBottom() const override 144 { 145 return gridLayoutInfo_.offsetEnd_; 146 } 147 148 OverScrollOffset GetOverScrollOffset(double delta) const override; 149 150 bool OutBoundaryCallback() override; 151 152 void SetPositionController(const RefPtr<ScrollableController>& controller); 153 154 void ScrollPage(bool reverse); 155 156 bool UpdateStartIndex(int32_t index); 157 158 bool UpdateStartIndex(int32_t index, ScrollAlign align); 159 GetTotalOffset()160 float GetTotalOffset() const override 161 { 162 return EstimateHeight(); 163 } 164 165 float GetTotalHeight() const override; 166 167 void OnAnimateStop() override; 168 169 void AnimateTo(float position, float duration, const RefPtr<Curve>& curve, bool smooth) override; 170 void ScrollTo(float position) override; 171 172 void ScrollBy(float offset); 173 174 bool OnScrollCallback(float offset, int32_t source) override; 175 176 int32_t GetOriginalIndex() const; 177 int32_t GetCrossCount() const; 178 int32_t GetChildrenCount() const; 179 void MoveItems(int32_t itemIndex, int32_t insertIndex); 180 void ClearDragState(); 181 float EstimateHeight() const; 182 float GetAverageHeight() const; 183 184 void DumpInfo() override; 185 186 private: 187 float GetMainGap(); 188 float GetAllDelta(); 189 void CheckRestartSpring(); 190 void CheckScrollable(); 191 bool IsOutOfBoundary(); 192 void SetEdgeEffectCallback(const RefPtr<ScrollEdgeEffect>& scrollEffect) override; 193 SizeF GetContentSize() const; 194 void OnModifyDone() override; 195 float GetMainContentSize() const; 196 bool OnDirtyLayoutWrapperSwap(const RefPtr<LayoutWrapper>& dirty, const DirtySwapConfig& config) override; 197 WeakPtr<FocusHub> GetNextFocusNode(FocusStep step, const WeakPtr<FocusHub>& currentFocusNode); 198 std::pair<int32_t, int32_t> GetNextIndexByStep( 199 int32_t curMainIndex, int32_t curCrossIndex, int32_t curMainSpan, int32_t curCrossSpan, FocusStep step); 200 WeakPtr<FocusHub> SearchFocusableChildInCross(int32_t tarMainIndex, int32_t tarCrossIndex, int32_t maxCrossCount, 201 int32_t curMainIndex = -1, int32_t curCrossIndex = -1); 202 WeakPtr<FocusHub> GetChildFocusNodeByIndex(int32_t tarMainIndex, int32_t tarCrossIndex, int32_t tarIndex = -1); 203 std::unordered_set<int32_t> GetFocusableChildCrossIndexesAt(int32_t tarMainIndex); 204 void ScrollToFocusNode(const WeakPtr<FocusHub>& focusNode); 205 void FlushFocusOnScroll(const GridLayoutInfo& gridLayoutInfo); 206 std::pair<bool, bool> IsFirstOrLastFocusableChild(int32_t curMainIndex, int32_t curCrossIndex); 207 std::pair<FocusStep, FocusStep> GetFocusSteps(int32_t curMainIndex, int32_t curCrossIndex, FocusStep step); 208 void InitOnKeyEvent(const RefPtr<FocusHub>& focusHub); 209 bool OnKeyEvent(const KeyEvent& event); 210 bool HandleDirectionKey(KeyCode code); 211 212 void ClearMultiSelect() override; 213 bool IsItemSelected(const MouseInfo& info) override; 214 void MultiSelectWithoutKeyboard(const RectF& selectedZone) override; 215 void UpdateScrollBarOffset() override; 216 void UpdateRectOfDraggedInItem(int32_t insertIndex); 217 void SetAccessibilityAction(); 218 219 GridLayoutInfo gridLayoutInfo_; 220 void ProcessEvent(bool indexChanged, float finalOffset); 221 void MarkDirtyNodeSelf(); 222 void OnScrollEndCallback() override; 223 void OnScrollStartCallback() override; 224 void FireOnScrollStart(); 225 void InitScrollableEvent(); 226 227 RefPtr<GridPositionController> positionController_; 228 float animatorOffset_ = 0.0f; 229 bool scrollStop_ = false; 230 bool initialIndex_ = false; 231 float prevHeight_ = 0; 232 float currentHeight_ = 0; 233 234 bool supportAnimation_ = false; 235 bool isConfigScrollable_ = false; 236 237 bool scrollable_ = true; 238 239 bool firstShow_ = true; 240 float endHeight_ = 0.0f; 241 242 std::pair<std::optional<float>, std::optional<float>> scrollbarInfo_; 243 244 ACE_DISALLOW_COPY_AND_MOVE(GridPattern); 245 }; 246 247 } // namespace OHOS::Ace::NG 248 249 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_GRID_GRID_PATTERN_H 250