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