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_item_model_ng.h"
17
18 #include "core/components_ng/base/view_stack_processor.h"
19 #include "core/components_ng/pattern/grid/grid_item_layout_property.h"
20 #include "core/components_ng/pattern/grid/grid_item_pattern.h"
21 #include "core/components_ng/pattern/scrollable/scrollable_item.h"
22 #include "core/components_ng/pattern/scrollable/scrollable_item_pool.h"
23 #include "core/components_v2/inspector/inspector_constants.h"
24
25 namespace OHOS::Ace::NG {
26
Create(GridItemStyle gridItemStyle)27 void GridItemModelNG::Create(GridItemStyle gridItemStyle)
28 {
29 auto* stack = ViewStackProcessor::GetInstance();
30 auto nodeId = stack->ClaimNodeId();
31 ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::GRID_ITEM_ETS_TAG, nodeId);
32 auto frameNode = ScrollableItemPool::GetInstance().Allocate(V2::GRID_ITEM_ETS_TAG, nodeId,
33 [itemStyle = gridItemStyle]() { return AceType::MakeRefPtr<GridItemPattern>(nullptr, itemStyle); });
34 stack->Push(frameNode);
35 }
36
Create(std::function<void (int32_t)> && deepRenderFunc,bool isLazy,GridItemStyle gridItemStyle)37 void GridItemModelNG::Create(std::function<void(int32_t)>&& deepRenderFunc, bool isLazy, GridItemStyle gridItemStyle)
38 {
39 if (!isLazy) {
40 Create(gridItemStyle);
41 return;
42 }
43
44 auto* stack = ViewStackProcessor::GetInstance();
45 auto nodeId = stack->ClaimNodeId();
46 auto deepRender = [nodeId, deepRenderFunc = std::move(deepRenderFunc)]() -> RefPtr<UINode> {
47 CHECK_NULL_RETURN(deepRenderFunc, nullptr);
48 ScopedViewStackProcessor scopedViewStackProcessor;
49 deepRenderFunc(nodeId);
50 return ViewStackProcessor::GetInstance()->Finish();
51 };
52 auto frameNode = FrameNode::GetOrCreateFrameNode(V2::GRID_ITEM_ETS_TAG, nodeId,
53 [shallowBuilder = AceType::MakeRefPtr<ShallowBuilder>(std::move(deepRender)), itemStyle = gridItemStyle]() {
54 return AceType::MakeRefPtr<GridItemPattern>(shallowBuilder, itemStyle);
55 });
56 stack->Push(frameNode);
57 }
58
CreateFrameNode(int32_t nodeId)59 RefPtr<FrameNode> GridItemModelNG::CreateFrameNode(int32_t nodeId)
60 {
61 auto frameNode = ScrollableItemPool::GetInstance().Allocate(V2::GRID_ITEM_ETS_TAG, nodeId,
62 [itemStyle = GridItemStyle::NONE]() { return AceType::MakeRefPtr<GridItemPattern>(nullptr, itemStyle); });
63
64 return frameNode;
65 }
66
SetRowStart(int32_t value)67 void GridItemModelNG::SetRowStart(int32_t value)
68 {
69 ACE_UPDATE_LAYOUT_PROPERTY(GridItemLayoutProperty, RowStart, value);
70 }
71
SetRowEnd(int32_t value)72 void GridItemModelNG::SetRowEnd(int32_t value)
73 {
74 ACE_UPDATE_LAYOUT_PROPERTY(GridItemLayoutProperty, RowEnd, value);
75 }
76
SetColumnStart(int32_t value)77 void GridItemModelNG::SetColumnStart(int32_t value)
78 {
79 ACE_UPDATE_LAYOUT_PROPERTY(GridItemLayoutProperty, ColumnStart, value);
80 }
81
SetColumnEnd(int32_t value)82 void GridItemModelNG::SetColumnEnd(int32_t value)
83 {
84 ACE_UPDATE_LAYOUT_PROPERTY(GridItemLayoutProperty, ColumnEnd, value);
85 }
86
SetForceRebuild(bool value)87 void GridItemModelNG::SetForceRebuild(bool value)
88 {
89 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
90 CHECK_NULL_VOID(frameNode);
91 auto pattern = frameNode->GetPattern<GridItemPattern>();
92 CHECK_NULL_VOID(pattern);
93 pattern->SetForceRebuild(value);
94 }
95
SetSelectable(bool value)96 void GridItemModelNG::SetSelectable(bool value)
97 {
98 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
99 CHECK_NULL_VOID(frameNode);
100 auto pattern = frameNode->GetPattern<GridItemPattern>();
101 CHECK_NULL_VOID(pattern);
102 pattern->SetSelectable(value);
103 }
104
SetSelected(bool selected)105 void GridItemModelNG::SetSelected(bool selected)
106 {
107 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
108 CHECK_NULL_VOID(frameNode);
109 auto pattern = frameNode->GetPattern<GridItemPattern>();
110 CHECK_NULL_VOID(pattern);
111 pattern->SetSelected(selected);
112 auto eventHub = frameNode->GetEventHub<GridItemEventHub>();
113 CHECK_NULL_VOID(eventHub);
114 eventHub->SetCurrentUIState(UI_STATE_SELECTED, selected);
115 }
116
SetSelectChangeEvent(std::function<void (bool)> && changeEvent)117 void GridItemModelNG::SetSelectChangeEvent(std::function<void(bool)>&& changeEvent)
118 {
119 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
120 CHECK_NULL_VOID(frameNode);
121 auto eventHub = frameNode->GetEventHub<GridItemEventHub>();
122 CHECK_NULL_VOID(eventHub);
123 eventHub->SetSelectChangeEvent(std::move(changeEvent));
124 }
125
SetOnSelect(SelectFunc && onSelect)126 void GridItemModelNG::SetOnSelect(SelectFunc&& onSelect)
127 {
128 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
129 CHECK_NULL_VOID(frameNode);
130 auto eventHub = frameNode->GetEventHub<GridItemEventHub>();
131 CHECK_NULL_VOID(eventHub);
132 eventHub->SetOnSelect(std::move(onSelect));
133 }
134
SetSelectable(FrameNode * frameNode,bool selectable)135 void GridItemModelNG::SetSelectable(FrameNode* frameNode, bool selectable)
136 {
137 CHECK_NULL_VOID(frameNode);
138 auto pattern = frameNode->GetPattern<GridItemPattern>();
139 CHECK_NULL_VOID(pattern);
140 pattern->SetSelectable(selectable);
141 }
142
SetSelected(FrameNode * frameNode,bool selected)143 void GridItemModelNG::SetSelected(FrameNode* frameNode, bool selected)
144 {
145 CHECK_NULL_VOID(frameNode);
146 auto pattern = frameNode->GetPattern<GridItemPattern>();
147 CHECK_NULL_VOID(pattern);
148 pattern->SetSelected(selected);
149 auto eventHub = frameNode->GetEventHub<GridItemEventHub>();
150 CHECK_NULL_VOID(eventHub);
151 eventHub->SetCurrentUIState(UI_STATE_SELECTED, selected);
152 }
153
SetRowStart(FrameNode * frameNode,int32_t rowStart)154 void GridItemModelNG::SetRowStart(FrameNode* frameNode, int32_t rowStart)
155 {
156 ACE_UPDATE_NODE_LAYOUT_PROPERTY(GridItemLayoutProperty, RowStart, rowStart, frameNode);
157 }
158
SetRowEnd(FrameNode * frameNode,int32_t rowEnd)159 void GridItemModelNG::SetRowEnd(FrameNode* frameNode, int32_t rowEnd)
160 {
161 ACE_UPDATE_NODE_LAYOUT_PROPERTY(GridItemLayoutProperty, RowEnd, rowEnd, frameNode);
162 }
163
SetColumnStart(FrameNode * frameNode,int32_t columnStart)164 void GridItemModelNG::SetColumnStart(FrameNode* frameNode, int32_t columnStart)
165 {
166 ACE_UPDATE_NODE_LAYOUT_PROPERTY(GridItemLayoutProperty, ColumnStart, columnStart, frameNode);
167 }
168
SetColumnEnd(FrameNode * frameNode,int32_t columnEnd)169 void GridItemModelNG::SetColumnEnd(FrameNode* frameNode, int32_t columnEnd)
170 {
171 ACE_UPDATE_NODE_LAYOUT_PROPERTY(GridItemLayoutProperty, ColumnEnd, columnEnd, frameNode);
172 }
173
SetGridItemStyle(FrameNode * frameNode,GridItemStyle gridItemStyle)174 void GridItemModelNG::SetGridItemStyle(FrameNode* frameNode, GridItemStyle gridItemStyle)
175 {
176 CHECK_NULL_VOID(frameNode);
177 auto pattern = frameNode->GetPatternPtr<GridItemPattern>();
178 CHECK_NULL_VOID(pattern);
179 pattern->UpdateGridItemStyle(gridItemStyle);
180 }
181 } // namespace OHOS::Ace::NG
182