1 /*
2 * Copyright (c) 2022-2024 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 #include "core/components_ng/pattern/grid/grid_model_ng.h"
17
18 #include <regex>
19
20 #include "base/utils/utils.h"
21 #include "core/components_ng/base/frame_node.h"
22 #include "core/components_ng/base/view_abstract.h"
23 #include "core/components_ng/base/view_stack_processor.h"
24 #include "core/components_ng/pattern/grid/grid_event_hub.h"
25 #include "core/components_ng/pattern/grid/grid_pattern.h"
26 #include "core/components_ng/pattern/scroll_bar/proxy/scroll_bar_proxy.h"
27 #include "core/components_ng/pattern/scrollable/scrollable_model_ng.h"
28 #include "core/components_v2/inspector/inspector_constants.h"
29 #include "core/pipeline_ng/pipeline_context.h"
30
31 namespace OHOS::Ace::NG {
32
Create(const RefPtr<ScrollControllerBase> & positionController,const RefPtr<ScrollProxy> & scrollProxy)33 void GridModelNG::Create(const RefPtr<ScrollControllerBase>& positionController, const RefPtr<ScrollProxy>& scrollProxy)
34 {
35 auto* stack = ViewStackProcessor::GetInstance();
36 auto nodeId = stack->ClaimNodeId();
37 ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::GRID_ETS_TAG, nodeId);
38 auto frameNode =
39 FrameNode::GetOrCreateFrameNode(V2::GRID_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<GridPattern>(); });
40 stack->Push(frameNode);
41 auto pattern = frameNode->GetPattern<GridPattern>();
42 CHECK_NULL_VOID(pattern);
43 if (positionController) {
44 auto controller = AceType::DynamicCast<ScrollableController>(positionController);
45 pattern->SetPositionController(controller);
46 }
47 if (scrollProxy) {
48 auto scrollBarProxy = AceType::DynamicCast<NG::ScrollBarProxy>(scrollProxy);
49 pattern->SetScrollBarProxy(scrollBarProxy);
50 }
51 pattern->AddScrollableFrameInfo(SCROLL_FROM_NONE);
52 }
53
GetOrCreateController(FrameNode * frameNode)54 RefPtr<ScrollControllerBase> GridModelNG::GetOrCreateController(FrameNode* frameNode)
55 {
56 CHECK_NULL_RETURN(frameNode, nullptr);
57 auto pattern = frameNode->GetPattern<GridPattern>();
58 CHECK_NULL_RETURN(pattern, nullptr);
59 return pattern->GetOrCreatePositionController();
60 }
61
Pop()62 void GridModelNG::Pop()
63 {
64 NG::ViewStackProcessor::GetInstance()->PopContainer();
65 }
66
SetLayoutOptions(GridLayoutOptions options)67 void GridModelNG::SetLayoutOptions(GridLayoutOptions options)
68 {
69 ACE_UPDATE_LAYOUT_PROPERTY(GridLayoutProperty, LayoutOptions, options);
70 }
71
SetColumnsTemplate(const std::string & value)72 void GridModelNG::SetColumnsTemplate(const std::string& value)
73 {
74 if (value.empty()) {
75 TAG_LOGW(AceLogTag::ACE_GRID, "Columns Template [%{public}s] is not valid.", value.c_str());
76 ACE_UPDATE_LAYOUT_PROPERTY(GridLayoutProperty, ColumnsTemplate, "1fr");
77 return;
78 }
79 ACE_UPDATE_LAYOUT_PROPERTY(GridLayoutProperty, ColumnsTemplate, value);
80 }
81
SetRowsTemplate(const std::string & value)82 void GridModelNG::SetRowsTemplate(const std::string& value)
83 {
84 if (value.empty()) {
85 TAG_LOGW(AceLogTag::ACE_GRID, "Rows Template [%{public}s] is not valid.", value.c_str());
86 ACE_UPDATE_LAYOUT_PROPERTY(GridLayoutProperty, RowsTemplate, "1fr");
87 return;
88 }
89 ACE_UPDATE_LAYOUT_PROPERTY(GridLayoutProperty, RowsTemplate, value);
90 }
91
SetColumnsGap(const Dimension & value)92 void GridModelNG::SetColumnsGap(const Dimension& value)
93 {
94 if (value.IsNonNegative()) {
95 ACE_UPDATE_LAYOUT_PROPERTY(GridLayoutProperty, ColumnsGap, value);
96 }
97 }
98
SetRowsGap(const Dimension & value)99 void GridModelNG::SetRowsGap(const Dimension& value)
100 {
101 if (value.IsNonNegative()) {
102 ACE_UPDATE_LAYOUT_PROPERTY(GridLayoutProperty, RowsGap, value);
103 }
104 }
105
SetGridHeight(const Dimension & value)106 void GridModelNG::SetGridHeight(const Dimension& value)
107 {
108 ViewAbstract::SetHeight(NG::CalcLength(value));
109 }
110
SetScrollBarMode(DisplayMode value)111 void GridModelNG::SetScrollBarMode(DisplayMode value)
112 {
113 ACE_UPDATE_PAINT_PROPERTY(ScrollablePaintProperty, ScrollBarMode, value);
114 }
115
SetScrollBarColor(const std::string & value)116 void GridModelNG::SetScrollBarColor(const std::string& value)
117 {
118 ACE_UPDATE_PAINT_PROPERTY(ScrollablePaintProperty, ScrollBarColor, Color::FromString(value));
119 }
120
SetScrollBarWidth(const std::string & value)121 void GridModelNG::SetScrollBarWidth(const std::string& value)
122 {
123 ACE_UPDATE_PAINT_PROPERTY(ScrollablePaintProperty, ScrollBarWidth, StringUtils::StringToDimensionWithUnit(value));
124 }
125
SetCachedCount(int32_t value,bool show)126 void GridModelNG::SetCachedCount(int32_t value, bool show)
127 {
128 ACE_UPDATE_LAYOUT_PROPERTY(GridLayoutProperty, CachedCount, value);
129 ACE_UPDATE_LAYOUT_PROPERTY(GridLayoutProperty, ShowCachedItems, show);
130 }
131
SetEditable(bool value)132 void GridModelNG::SetEditable(bool value)
133 {
134 ACE_UPDATE_LAYOUT_PROPERTY(GridLayoutProperty, Editable, value);
135 }
136
SetIsRTL(TextDirection direction)137 void GridModelNG::SetIsRTL(TextDirection direction)
138 {
139 ACE_UPDATE_LAYOUT_PROPERTY(LayoutProperty, LayoutDirection, direction);
140 }
141
SetLayoutDirection(FlexDirection value)142 void GridModelNG::SetLayoutDirection(FlexDirection value)
143 {
144 ACE_UPDATE_LAYOUT_PROPERTY(GridLayoutProperty, GridDirection, value);
145 }
146
SetMaxCount(int32_t value)147 void GridModelNG::SetMaxCount(int32_t value)
148 {
149 ACE_UPDATE_LAYOUT_PROPERTY(GridLayoutProperty, MaxCount, value);
150 }
151
SetMinCount(int32_t value)152 void GridModelNG::SetMinCount(int32_t value)
153 {
154 ACE_UPDATE_LAYOUT_PROPERTY(GridLayoutProperty, MinCount, value);
155 }
156
SetCellLength(int32_t value)157 void GridModelNG::SetCellLength(int32_t value)
158 {
159 ACE_UPDATE_LAYOUT_PROPERTY(GridLayoutProperty, CellLength, value);
160 }
161
SetMultiSelectable(bool value)162 void GridModelNG::SetMultiSelectable(bool value)
163 {
164 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
165 CHECK_NULL_VOID(frameNode);
166 auto pattern = frameNode->GetPattern<GridPattern>();
167 CHECK_NULL_VOID(pattern);
168 pattern->SetMultiSelectable(value);
169 }
170
SetSupportAnimation(bool value)171 void GridModelNG::SetSupportAnimation(bool value)
172 {
173 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
174 CHECK_NULL_VOID(frameNode);
175 auto pattern = frameNode->GetPattern<GridPattern>();
176 CHECK_NULL_VOID(pattern);
177 pattern->SetSupportAnimation(value);
178 }
179
SetSupportDragAnimation(bool value)180 void GridModelNG::SetSupportDragAnimation(bool value) {}
181
SetEdgeEffect(EdgeEffect edgeEffect,bool alwaysEnabled)182 void GridModelNG::SetEdgeEffect(EdgeEffect edgeEffect, bool alwaysEnabled)
183 {
184 ScrollableModelNG::SetEdgeEffect(edgeEffect, alwaysEnabled);
185 }
186
SetNestedScroll(const NestedScrollOptions & nestedOpt)187 void GridModelNG::SetNestedScroll(const NestedScrollOptions& nestedOpt)
188 {
189 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
190 CHECK_NULL_VOID(frameNode);
191 auto pattern = frameNode->GetPattern<GridPattern>();
192 CHECK_NULL_VOID(pattern);
193 pattern->SetNestedScroll(nestedOpt);
194 }
195
SetScrollEnabled(bool scrollEnabled)196 void GridModelNG::SetScrollEnabled(bool scrollEnabled)
197 {
198 ACE_UPDATE_LAYOUT_PROPERTY(GridLayoutProperty, ScrollEnabled, scrollEnabled);
199 }
200
SetFriction(double friction)201 void GridModelNG::SetFriction(double friction)
202 {
203 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
204 CHECK_NULL_VOID(frameNode);
205 auto pattern = frameNode->GetPattern<GridPattern>();
206 CHECK_NULL_VOID(pattern);
207 pattern->SetFriction(friction);
208 }
209
SetAlignItems(GridItemAlignment itemAlign)210 void GridModelNG::SetAlignItems(GridItemAlignment itemAlign)
211 {
212 ACE_UPDATE_LAYOUT_PROPERTY(GridLayoutProperty, AlignItems, itemAlign);
213 }
214
SetOnScrollToIndex(ScrollToIndexFunc && value)215 void GridModelNG::SetOnScrollToIndex(ScrollToIndexFunc&& value)
216 {
217 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
218 CHECK_NULL_VOID(frameNode);
219 auto eventHub = frameNode->GetEventHub<GridEventHub>();
220 CHECK_NULL_VOID(eventHub);
221 eventHub->SetOnScrollToIndex(std::move(value));
222 }
223
SetOnScrollBarUpdate(ScrollBarUpdateFunc && value)224 void GridModelNG::SetOnScrollBarUpdate(ScrollBarUpdateFunc&& value)
225 {
226 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
227 CHECK_NULL_VOID(frameNode);
228 auto eventHub = frameNode->GetEventHub<GridEventHub>();
229 CHECK_NULL_VOID(eventHub);
230 eventHub->SetOnScrollBarUpdate(std::move(value));
231 }
232
SetOnItemDragStart(std::function<void (const ItemDragInfo &,int32_t)> && value)233 void GridModelNG::SetOnItemDragStart(std::function<void(const ItemDragInfo&, int32_t)>&& value)
234 {
235 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
236 CHECK_NULL_VOID(frameNode);
237 auto eventHub = frameNode->GetEventHub<GridEventHub>();
238 CHECK_NULL_VOID(eventHub);
239 auto onDragStart = [func = std::move(value)](const ItemDragInfo& dragInfo, int32_t index) -> RefPtr<UINode> {
240 ScopedViewStackProcessor builderViewStackProcessor;
241 {
242 func(dragInfo, index);
243 }
244 return ViewStackProcessor::GetInstance()->Finish();
245 };
246 eventHub->SetOnItemDragStart(std::move(onDragStart));
247
248 auto gestureEventHub = eventHub->GetOrCreateGestureEventHub();
249 CHECK_NULL_VOID(gestureEventHub);
250 eventHub->InitItemDragEvent(gestureEventHub);
251
252 AddDragFrameNodeToManager();
253 }
254
SetOnItemDragEnter(ItemDragEnterFunc && value)255 void GridModelNG::SetOnItemDragEnter(ItemDragEnterFunc&& value)
256 {
257 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
258 CHECK_NULL_VOID(frameNode);
259 auto eventHub = frameNode->GetEventHub<GridEventHub>();
260 CHECK_NULL_VOID(eventHub);
261 eventHub->SetOnItemDragEnter(std::move(value));
262
263 AddDragFrameNodeToManager();
264 }
265
SetOnItemDragMove(ItemDragMoveFunc && value)266 void GridModelNG::SetOnItemDragMove(ItemDragMoveFunc&& value)
267 {
268 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
269 CHECK_NULL_VOID(frameNode);
270 auto eventHub = frameNode->GetEventHub<GridEventHub>();
271 CHECK_NULL_VOID(eventHub);
272 eventHub->SetOnItemDragMove(std::move(value));
273
274 AddDragFrameNodeToManager();
275 }
276
SetOnItemDragLeave(ItemDragLeaveFunc && value)277 void GridModelNG::SetOnItemDragLeave(ItemDragLeaveFunc&& value)
278 {
279 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
280 CHECK_NULL_VOID(frameNode);
281 auto eventHub = frameNode->GetEventHub<GridEventHub>();
282 CHECK_NULL_VOID(eventHub);
283 eventHub->SetOnItemDragLeave(std::move(value));
284
285 AddDragFrameNodeToManager();
286 }
287
SetOnItemDrop(ItemDropFunc && value)288 void GridModelNG::SetOnItemDrop(ItemDropFunc&& value)
289 {
290 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
291 CHECK_NULL_VOID(frameNode);
292 auto eventHub = frameNode->GetEventHub<GridEventHub>();
293 CHECK_NULL_VOID(eventHub);
294 eventHub->SetOnItemDrop(std::move(value));
295
296 AddDragFrameNodeToManager();
297 }
298
AddDragFrameNodeToManager() const299 void GridModelNG::AddDragFrameNodeToManager() const
300 {
301 auto pipeline = PipelineContext::GetCurrentContext();
302 CHECK_NULL_VOID(pipeline);
303 auto dragDropManager = pipeline->GetDragDropManager();
304 CHECK_NULL_VOID(dragDropManager);
305 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
306 CHECK_NULL_VOID(frameNode);
307
308 dragDropManager->AddGridDragFrameNode(frameNode->GetId(), AceType::WeakClaim(frameNode));
309 }
310
SetOnScroll(OnScrollEvent && onScroll)311 void GridModelNG::SetOnScroll(OnScrollEvent&& onScroll)
312 {
313 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
314 CHECK_NULL_VOID(frameNode);
315 auto eventHub = frameNode->GetEventHub<GridEventHub>();
316 CHECK_NULL_VOID(eventHub);
317 eventHub->SetOnScroll(std::move(onScroll));
318 }
319
SetOnScrollFrameBegin(OnScrollFrameBeginEvent && onScrollFrameBegin)320 void GridModelNG::SetOnScrollFrameBegin(OnScrollFrameBeginEvent&& onScrollFrameBegin)
321 {
322 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
323 CHECK_NULL_VOID(frameNode);
324 auto eventHub = frameNode->GetEventHub<GridEventHub>();
325 CHECK_NULL_VOID(eventHub);
326 eventHub->SetOnScrollFrameBegin(std::move(onScrollFrameBegin));
327 }
328
SetOnScrollStart(OnScrollStartEvent && onScrollStart)329 void GridModelNG::SetOnScrollStart(OnScrollStartEvent&& onScrollStart)
330 {
331 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
332 CHECK_NULL_VOID(frameNode);
333 auto eventHub = frameNode->GetEventHub<GridEventHub>();
334 CHECK_NULL_VOID(eventHub);
335 eventHub->SetOnScrollStart(std::move(onScrollStart));
336 }
337
SetOnScrollStop(OnScrollStopEvent && onScrollStop)338 void GridModelNG::SetOnScrollStop(OnScrollStopEvent&& onScrollStop)
339 {
340 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
341 CHECK_NULL_VOID(frameNode);
342 auto eventHub = frameNode->GetEventHub<GridEventHub>();
343 CHECK_NULL_VOID(eventHub);
344 eventHub->SetOnScrollStop(std::move(onScrollStop));
345 }
346
SetOnScrollIndex(ScrollIndexFunc && onScrollIndex)347 void GridModelNG::SetOnScrollIndex(ScrollIndexFunc&& onScrollIndex)
348 {
349 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
350 CHECK_NULL_VOID(frameNode);
351 auto eventHub = frameNode->GetEventHub<GridEventHub>();
352 CHECK_NULL_VOID(eventHub);
353 eventHub->SetOnScrollIndex(std::move(onScrollIndex));
354 }
355
SetOnReachStart(OnReachEvent && onReachStart)356 void GridModelNG::SetOnReachStart(OnReachEvent&& onReachStart)
357 {
358 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
359 CHECK_NULL_VOID(frameNode);
360 auto eventHub = frameNode->GetEventHub<GridEventHub>();
361 CHECK_NULL_VOID(eventHub);
362 eventHub->SetOnReachStart(std::move(onReachStart));
363 }
364
SetOnReachEnd(OnReachEvent && onReachEnd)365 void GridModelNG::SetOnReachEnd(OnReachEvent&& onReachEnd)
366 {
367 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
368 CHECK_NULL_VOID(frameNode);
369 auto eventHub = frameNode->GetEventHub<GridEventHub>();
370 CHECK_NULL_VOID(eventHub);
371 eventHub->SetOnReachEnd(std::move(onReachEnd));
372 }
373
CreateFrameNode(int32_t nodeId)374 RefPtr<FrameNode> GridModelNG::CreateFrameNode(int32_t nodeId)
375 {
376 auto frameNode = FrameNode::GetOrCreateFrameNode(
377 V2::GRID_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<GridPattern>(); });
378
379 return frameNode;
380 }
381
SetOnScrollIndex(FrameNode * frameNode,ScrollIndexFunc && onScrollIndex)382 void GridModelNG::SetOnScrollIndex(FrameNode* frameNode, ScrollIndexFunc&& onScrollIndex)
383 {
384 CHECK_NULL_VOID(frameNode);
385 auto eventHub = frameNode->GetEventHub<GridEventHub>();
386 CHECK_NULL_VOID(eventHub);
387 eventHub->SetOnScrollIndex(std::move(onScrollIndex));
388 }
389
SetColumnsTemplate(FrameNode * frameNode,const std::string & columnsTemplate)390 void GridModelNG::SetColumnsTemplate(FrameNode* frameNode, const std::string& columnsTemplate)
391 {
392 if (columnsTemplate.empty()) {
393 TAG_LOGW(AceLogTag::ACE_GRID, "Columns Template [%{public}s] is not valid.", columnsTemplate.c_str());
394 ACE_UPDATE_NODE_LAYOUT_PROPERTY(GridLayoutProperty, ColumnsTemplate, "1fr", frameNode);
395 return;
396 }
397 ACE_UPDATE_NODE_LAYOUT_PROPERTY(GridLayoutProperty, ColumnsTemplate, columnsTemplate, frameNode);
398 }
399
SetRowsTemplate(FrameNode * frameNode,const std::string & rowsTemplate)400 void GridModelNG::SetRowsTemplate(FrameNode* frameNode, const std::string& rowsTemplate)
401 {
402 if (rowsTemplate.empty()) {
403 TAG_LOGW(AceLogTag::ACE_GRID, "Rows Template [%{public}s] is not valid.", rowsTemplate.c_str());
404 ACE_UPDATE_NODE_LAYOUT_PROPERTY(GridLayoutProperty, RowsTemplate, "1fr", frameNode);
405 return;
406 }
407 ACE_UPDATE_NODE_LAYOUT_PROPERTY(GridLayoutProperty, RowsTemplate, rowsTemplate, frameNode);
408 }
409
SetColumnsGap(FrameNode * frameNode,const Dimension & columnsGap)410 void GridModelNG::SetColumnsGap(FrameNode* frameNode, const Dimension& columnsGap)
411 {
412 if (columnsGap.IsNonNegative()) {
413 ACE_UPDATE_NODE_LAYOUT_PROPERTY(GridLayoutProperty, ColumnsGap, columnsGap, frameNode);
414 }
415 }
416
SetRowsGap(FrameNode * frameNode,const Dimension & rowsGap)417 void GridModelNG::SetRowsGap(FrameNode* frameNode, const Dimension& rowsGap)
418 {
419 if (rowsGap.IsNonNegative()) {
420 ACE_UPDATE_NODE_LAYOUT_PROPERTY(GridLayoutProperty, RowsGap, rowsGap, frameNode);
421 }
422 }
423
SetScrollBarMode(FrameNode * frameNode,DisplayMode scrollBarMode)424 void GridModelNG::SetScrollBarMode(FrameNode* frameNode, DisplayMode scrollBarMode)
425 {
426 ACE_UPDATE_NODE_PAINT_PROPERTY(ScrollablePaintProperty, ScrollBarMode, scrollBarMode, frameNode);
427 }
428
SetScrollBarWidth(FrameNode * frameNode,const Dimension & scrollBarWidth)429 void GridModelNG::SetScrollBarWidth(FrameNode* frameNode, const Dimension& scrollBarWidth)
430 {
431 ACE_UPDATE_NODE_PAINT_PROPERTY(ScrollablePaintProperty, ScrollBarWidth, scrollBarWidth, frameNode);
432 }
433
SetScrollBarColor(FrameNode * frameNode,const Color & scrollBarColor)434 void GridModelNG::SetScrollBarColor(FrameNode* frameNode, const Color& scrollBarColor)
435 {
436 ACE_UPDATE_NODE_PAINT_PROPERTY(ScrollablePaintProperty, ScrollBarColor, scrollBarColor, frameNode);
437 }
438
SetCachedCount(FrameNode * frameNode,int32_t cachedCount)439 void GridModelNG::SetCachedCount(FrameNode* frameNode, int32_t cachedCount)
440 {
441 ACE_UPDATE_NODE_LAYOUT_PROPERTY(GridLayoutProperty, CachedCount, cachedCount, frameNode);
442 }
443
SetShowCached(FrameNode * frameNode,bool show)444 void GridModelNG::SetShowCached(FrameNode* frameNode, bool show)
445 {
446 ACE_UPDATE_NODE_LAYOUT_PROPERTY(GridLayoutProperty, ShowCachedItems, show, frameNode);
447 }
448
SetEditable(FrameNode * frameNode,bool editMode)449 void GridModelNG::SetEditable(FrameNode* frameNode, bool editMode)
450 {
451 ACE_UPDATE_NODE_LAYOUT_PROPERTY(GridLayoutProperty, Editable, editMode, frameNode);
452 }
453
SetMultiSelectable(FrameNode * frameNode,bool multiSelectable)454 void GridModelNG::SetMultiSelectable(FrameNode* frameNode, bool multiSelectable)
455 {
456 auto pattern = frameNode->GetPattern<GridPattern>();
457 CHECK_NULL_VOID(pattern);
458 pattern->SetMultiSelectable(multiSelectable);
459 }
460
SetMaxCount(FrameNode * frameNode,int32_t maxCount)461 void GridModelNG::SetMaxCount(FrameNode* frameNode, int32_t maxCount)
462 {
463 ACE_UPDATE_NODE_LAYOUT_PROPERTY(GridLayoutProperty, MaxCount, maxCount, frameNode);
464 }
465
SetMinCount(FrameNode * frameNode,int32_t minCount)466 void GridModelNG::SetMinCount(FrameNode* frameNode, int32_t minCount)
467 {
468 ACE_UPDATE_NODE_LAYOUT_PROPERTY(GridLayoutProperty, MinCount, minCount, frameNode);
469 }
470
SetCellLength(FrameNode * frameNode,int32_t cellLength)471 void GridModelNG::SetCellLength(FrameNode* frameNode, int32_t cellLength)
472 {
473 ACE_UPDATE_NODE_LAYOUT_PROPERTY(GridLayoutProperty, CellLength, cellLength, frameNode);
474 }
475
SetLayoutDirection(FrameNode * frameNode,FlexDirection layoutDirection)476 void GridModelNG::SetLayoutDirection(FrameNode* frameNode, FlexDirection layoutDirection)
477 {
478 ACE_UPDATE_NODE_LAYOUT_PROPERTY(GridLayoutProperty, GridDirection, layoutDirection, frameNode);
479 }
480
SetSupportAnimation(FrameNode * frameNode,bool supportAnimation)481 void GridModelNG::SetSupportAnimation(FrameNode* frameNode, bool supportAnimation)
482 {
483 auto pattern = frameNode->GetPattern<GridPattern>();
484 CHECK_NULL_VOID(pattern);
485 pattern->SetSupportAnimation(supportAnimation);
486 }
487
SetEdgeEffect(FrameNode * frameNode,EdgeEffect edgeEffect,bool alwaysEnabled)488 void GridModelNG::SetEdgeEffect(FrameNode* frameNode, EdgeEffect edgeEffect, bool alwaysEnabled)
489 {
490 ScrollableModelNG::SetEdgeEffect(frameNode, edgeEffect, alwaysEnabled);
491 }
492
SetNestedScroll(FrameNode * frameNode,const NestedScrollOptions & nestedOpt)493 void GridModelNG::SetNestedScroll(FrameNode* frameNode, const NestedScrollOptions& nestedOpt)
494 {
495 auto pattern = frameNode->GetPattern<GridPattern>();
496 CHECK_NULL_VOID(pattern);
497 pattern->SetNestedScroll(nestedOpt);
498 }
499
SetScrollEnabled(FrameNode * frameNode,bool scrollEnabled)500 void GridModelNG::SetScrollEnabled(FrameNode* frameNode, bool scrollEnabled)
501 {
502 ACE_UPDATE_NODE_LAYOUT_PROPERTY(GridLayoutProperty, ScrollEnabled, scrollEnabled, frameNode);
503 }
504
SetFriction(FrameNode * frameNode,double friction)505 void GridModelNG::SetFriction(FrameNode* frameNode, double friction)
506 {
507 auto pattern = frameNode->GetPattern<GridPattern>();
508 CHECK_NULL_VOID(pattern);
509 if (LessOrEqual(friction, 0.0)) {
510 pattern->SetFriction(FRICTION);
511 }
512 pattern->SetFriction(friction);
513 }
514
SetAlignItems(FrameNode * frameNode,GridItemAlignment itemAlign)515 void GridModelNG::SetAlignItems(FrameNode* frameNode, GridItemAlignment itemAlign)
516 {
517 ACE_UPDATE_NODE_LAYOUT_PROPERTY(GridLayoutProperty, AlignItems, itemAlign, frameNode);
518 }
519
CreatePositionController()520 RefPtr<ScrollControllerBase> GridModelNG::CreatePositionController()
521 {
522 return AceType::MakeRefPtr<ScrollableController>();
523 }
524
CreateScrollBarProxy()525 RefPtr<ScrollProxy> GridModelNG::CreateScrollBarProxy()
526 {
527 return AceType::MakeRefPtr<NG::ScrollBarProxy>();
528 }
529
GetDisplayMode() const530 DisplayMode GridModelNG::GetDisplayMode() const
531 {
532 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<GridPattern>();
533 CHECK_NULL_RETURN(pattern, DisplayMode::AUTO);
534 return pattern->GetDefaultScrollBarDisplayMode();
535 }
536
GetColumnsTemplate(FrameNode * frameNode)537 std::string GridModelNG::GetColumnsTemplate(FrameNode* frameNode)
538 {
539 CHECK_NULL_RETURN(frameNode, nullptr);
540 std::string value = "1fr";
541 ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(GridLayoutProperty, ColumnsTemplate, value, frameNode, value);
542 return value;
543 }
544
GetRowsTemplate(FrameNode * frameNode)545 std::string GridModelNG::GetRowsTemplate(FrameNode* frameNode)
546 {
547 std::string value = "1fr";
548 CHECK_NULL_RETURN(frameNode, nullptr);
549 ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(GridLayoutProperty, RowsTemplate, value, frameNode, value);
550 return value;
551 }
552
GetColumnsGap(FrameNode * frameNode)553 float GridModelNG::GetColumnsGap(FrameNode* frameNode)
554 {
555 Dimension value;
556 CHECK_NULL_RETURN(frameNode, value.Value());
557 ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(GridLayoutProperty, ColumnsGap, value, frameNode, value);
558 return value.Value();
559 }
560
GetRowsGap(FrameNode * frameNode)561 float GridModelNG::GetRowsGap(FrameNode* frameNode)
562 {
563 Dimension value;
564 CHECK_NULL_RETURN(frameNode, value.Value());
565 ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(GridLayoutProperty, RowsGap, value, frameNode, value);
566 return value.Value();
567 }
568
GetCachedCount(FrameNode * frameNode)569 int32_t GridModelNG::GetCachedCount(FrameNode* frameNode)
570 {
571 int32_t cachedCount = 1;
572 CHECK_NULL_RETURN(frameNode, cachedCount);
573 auto pattern = frameNode->GetPattern<GridPattern>();
574 int32_t defCachedCount = pattern != nullptr ? pattern->GetDefaultCachedCount() : 1;
575 ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(GridLayoutProperty, CachedCount, cachedCount, frameNode,
576 defCachedCount);
577 return cachedCount;
578 }
579
GetShowCached(FrameNode * frameNode)580 bool GridModelNG::GetShowCached(FrameNode* frameNode)
581 {
582 bool show = false;
583 ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(GridLayoutProperty, ShowCachedItems, show, frameNode, false);
584 return show;
585 }
586
InitScroller(FrameNode * frameNode,const RefPtr<ScrollControllerBase> & positionController,const RefPtr<ScrollProxy> & scrollProxy)587 void GridModelNG::InitScroller(FrameNode* frameNode, const RefPtr<ScrollControllerBase>& positionController,
588 const RefPtr<ScrollProxy>& scrollProxy)
589 {
590 CHECK_NULL_VOID(frameNode);
591 auto pattern = frameNode->GetPattern<GridPattern>();
592 CHECK_NULL_VOID(pattern);
593 if (positionController) {
594 auto controller = AceType::DynamicCast<ScrollableController>(positionController);
595 pattern->SetPositionController(controller);
596 } else {
597 pattern->SetPositionController(nullptr);
598 }
599 if (scrollProxy) {
600 auto scrollBarProxy = AceType::DynamicCast<NG::ScrollBarProxy>(scrollProxy);
601 pattern->SetScrollBarProxy(scrollBarProxy);
602 } else {
603 pattern->SetScrollBarProxy(nullptr);
604 }
605 pattern->AddScrollableFrameInfo(SCROLL_FROM_NONE);
606 }
607
SetLayoutOptions(FrameNode * frameNode,GridLayoutOptions & options)608 void GridModelNG::SetLayoutOptions(FrameNode* frameNode, GridLayoutOptions& options)
609 {
610 CHECK_NULL_VOID(frameNode);
611 ACE_UPDATE_NODE_LAYOUT_PROPERTY(GridLayoutProperty, LayoutOptions, options, frameNode);
612 }
613 } // namespace OHOS::Ace::NG
614