• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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