1 /*
2  * Copyright (c) 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/interfaces/native/node/node_relative_container_modifier.h"
17 
18 #include "core/components_ng/pattern/relative_container/relative_container_model_ng.h"
19 
20 namespace OHOS::Ace::NG {
21 namespace {
22 
SetGuideLine(ArkUINodeHandle node,ArkUIGuidelineStyle * values,ArkUI_Int32 size)23 void SetGuideLine(ArkUINodeHandle node, ArkUIGuidelineStyle* values, ArkUI_Int32 size)
24 {
25     auto* frameNode = reinterpret_cast<FrameNode*>(node);
26     CHECK_NULL_VOID(frameNode);
27     std::vector<GuidelineInfo> guidelineInfos;
28     for (int32_t i = 0; i < size; ++i) {
29         GuidelineInfo info;
30         std::string idStr(values[i].id);
31         info.id = idStr;
32         info.direction = static_cast<LineDirection>(values[i].direction);
33         if (values[i].hasStart && values[i].hasEnd) {
34             CalcDimension start(values[i].start, DimensionUnit::VP);
35             info.start = start;
36         } else if (values[i].hasStart) {
37             CalcDimension start(values[i].start, DimensionUnit::VP);
38             info.start = start;
39         } else if (values[i].hasEnd) {
40             CalcDimension end(values[i].end, DimensionUnit::VP);
41             info.end = end;
42         } else {
43             CalcDimension start(0.0, DimensionUnit::VP);
44             info.start = start;
45         }
46         guidelineInfos.push_back(info);
47     }
48     RelativeContainerModelNG::SetGuideline(frameNode, guidelineInfos);
49 }
50 
SetBarrier(ArkUINodeHandle node,ArkUIBarrierStyle * values,ArkUI_Int32 size)51 void SetBarrier(ArkUINodeHandle node, ArkUIBarrierStyle* values, ArkUI_Int32 size)
52 {
53     auto* frameNode = reinterpret_cast<FrameNode*>(node);
54     CHECK_NULL_VOID(frameNode);
55     std::vector<BarrierInfo> barrierInfos;
56     for (int32_t i = 0; i < size; ++i) {
57         BarrierInfo info;
58         std::string idStr(values[i].id);
59         info.id = idStr;
60         info.direction = static_cast<BarrierDirection>(values[i].direction);
61         auto referencedIdChar = values[i].referencedId;
62         auto referencedIdSize = values[i].referencedIdSize;
63         std::vector<std::string> referencedId;
64         for (int32_t j = 0; j < referencedIdSize; ++j) {
65             std::string idItem(referencedIdChar[j]);
66             referencedId.push_back(idItem);
67         }
68         info.referencedId = referencedId;
69         barrierInfos.push_back(info);
70     }
71     RelativeContainerModelNG::SetBarrier(frameNode, barrierInfos);
72 }
73 
GetGuideLine(ArkUINodeHandle node,ArkUIGuidelineStyle * values,ArkUI_Int32 * size)74 void GetGuideLine(ArkUINodeHandle node, ArkUIGuidelineStyle* values, ArkUI_Int32* size)
75 {
76     auto* frameNode = reinterpret_cast<FrameNode*>(node);
77     CHECK_NULL_VOID(frameNode);
78     static std::vector<GuidelineInfo> guidelineInfos = RelativeContainerModelNG::GetGuideline(frameNode);
79     int32_t index = 0;
80     for (auto info : guidelineInfos) {
81         values[index].id = info.id.c_str();
82         values[index].direction = static_cast<ArkUI_Int32>(info.direction);
83         values[index].start = static_cast<ArkUI_Float32>(info.start.has_value() ? info.start.value().Value() : 0);
84         values[index].end = static_cast<ArkUI_Float32>(info.end.has_value() ? info.end.value().Value() : 0);
85         index++;
86     }
87     *size = index;
88 }
89 
GetBarrier(ArkUINodeHandle node,ArkUIBarrierStyle * values,ArkUI_Int32 * size)90 void GetBarrier(ArkUINodeHandle node, ArkUIBarrierStyle* values, ArkUI_Int32* size)
91 {
92     auto* frameNode = reinterpret_cast<FrameNode*>(node);
93     CHECK_NULL_VOID(frameNode);
94     static std::vector<BarrierInfo> barrierInfo = RelativeContainerModelNG::GetBarrier(frameNode);
95     int32_t index = 0;
96     for (auto info : barrierInfo) {
97         if (index >= *size) {
98             break;
99         }
100         values[index].id = info.id.c_str();
101         values[index].direction = static_cast<ArkUI_Int32>(info.direction);
102         values[index].referencedId = new ArkUI_CharPtr[info.referencedId.size()];
103         int j = 0;
104         for (auto str : info.referencedId) {
105             values[index].referencedId[j++] = str.c_str();
106         }
107         values[index].referencedIdSize = j;
108         index++;
109     }
110     *size = index;
111 }
112 
ResetGuideline(ArkUINodeHandle node)113 void ResetGuideline(ArkUINodeHandle node)
114 {
115     auto* frameNode = reinterpret_cast<FrameNode*>(node);
116     CHECK_NULL_VOID(frameNode);
117     RelativeContainerModelNG::ResetGuideline(frameNode);
118 }
119 
ResetBarrier(ArkUINodeHandle node)120 void ResetBarrier(ArkUINodeHandle node)
121 {
122     auto* frameNode = reinterpret_cast<FrameNode*>(node);
123     CHECK_NULL_VOID(frameNode);
124     RelativeContainerModelNG::ResetBarrier(frameNode);
125 }
126 } // namespace
127 
128 namespace NodeModifier {
129 
GetRelativeContainerModifier()130 const ArkUIRelativeContainerModifier* GetRelativeContainerModifier()
131 {
132     static const ArkUIRelativeContainerModifier modifier = { SetGuideLine, SetBarrier, GetGuideLine, GetBarrier,
133         ResetGuideline, ResetBarrier };
134     return &modifier;
135 }
136 
GetCJUIRelativeContainerModifier()137 const CJUIRelativeContainerModifier* GetCJUIRelativeContainerModifier()
138 {
139     static const CJUIRelativeContainerModifier modifier = { SetGuideLine, SetBarrier, GetGuideLine, GetBarrier,
140         ResetGuideline, ResetBarrier };
141     return &modifier;
142 }
143 } // namespace NodeModifier
144 
145 } // namespace OHOS::Ace::NG