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