1 /*
2 * Copyright (c) 2023-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 #include "core/interfaces/native/node/node_stack_modifier.h"
16 #include <cstdint>
17
18 #include "core/pipeline/base/element_register.h"
19 #include "core/components_ng/base/frame_node.h"
20 #include "core/components_ng/base/view_abstract.h"
21 #include "core/components/common/properties/alignment.h"
22 #include "core/components_ng/pattern/stack/stack_model_ng.h"
23
24 namespace OHOS::Ace::NG {
25 namespace {
26 Alignment DEFAULT_STACK_ALIGNMENT = Alignment::CENTER;
27 constexpr int NUM_0 = 0;
28 constexpr int NUM_1 = 1;
29 constexpr int NUM_2 = 2;
30 constexpr int NUM_3 = 3;
31 constexpr int NUM_4 = 4;
32 constexpr int NUM_5 = 5;
33 constexpr int NUM_6 = 6;
34 constexpr int NUM_7 = 7;
35 constexpr int NUM_8 = 8;
36 constexpr int32_t DEFAULT_ALIGNMENT_INDEX = 4;
SetAlignContent(ArkUINodeHandle node,ArkUI_Int32 align)37 void SetAlignContent(ArkUINodeHandle node, ArkUI_Int32 align)
38 {
39 auto* frameNode = reinterpret_cast<FrameNode*>(node);
40 CHECK_NULL_VOID(frameNode);
41 Alignment alignment = Alignment::CENTER;
42 switch (align) {
43 case NUM_0:
44 alignment = Alignment::TOP_LEFT;
45 break;
46 case NUM_1:
47 alignment = Alignment::TOP_CENTER;
48 break;
49 case NUM_2:
50 alignment = Alignment::TOP_RIGHT;
51 break;
52 case NUM_3:
53 alignment = Alignment::CENTER_LEFT;
54 break;
55 case NUM_4:
56 alignment = Alignment::CENTER;
57 break;
58 case NUM_5:
59 alignment = Alignment::CENTER_RIGHT;
60 break;
61 case NUM_6:
62 alignment = Alignment::BOTTOM_LEFT;
63 break;
64 case NUM_7:
65 alignment = Alignment::BOTTOM_CENTER;
66 break;
67 case NUM_8:
68 alignment = Alignment::BOTTOM_RIGHT;
69 break;
70 default:
71 alignment = Alignment::CENTER;
72 }
73 StackModelNG::SetAlignment(frameNode, alignment);
74 }
75
ResetAlignContent(ArkUINodeHandle node)76 void ResetAlignContent(ArkUINodeHandle node)
77 {
78 auto* frameNode = reinterpret_cast<FrameNode*>(node);
79 CHECK_NULL_VOID(frameNode);
80 StackModelNG::SetAlignment(frameNode, DEFAULT_STACK_ALIGNMENT);
81 }
82
findAlignmentIndex(Alignment & alignment)83 int32_t findAlignmentIndex(Alignment& alignment)
84 {
85 std::vector<Alignment> alignMents = {
86 Alignment::TOP_LEFT,
87 Alignment::TOP_CENTER,
88 Alignment::TOP_RIGHT,
89 Alignment::CENTER_LEFT,
90 Alignment::CENTER,
91 Alignment::CENTER_RIGHT,
92 Alignment::BOTTOM_LEFT,
93 Alignment::BOTTOM_CENTER,
94 Alignment::BOTTOM_RIGHT,
95 };
96 auto iterator = std::find(alignMents.begin(), alignMents.end(), alignment);
97 if (iterator == alignMents.end()) {
98 return DEFAULT_ALIGNMENT_INDEX;
99 }
100 return iterator - alignMents.begin();
101 }
102
GetAlignContent(ArkUINodeHandle node)103 int32_t GetAlignContent(ArkUINodeHandle node)
104 {
105 auto* frameNode = reinterpret_cast<FrameNode*>(node);
106 CHECK_NULL_RETURN(frameNode, DEFAULT_ALIGNMENT_INDEX);
107 auto currentAlignment = StackModelNG::GetAlignment(frameNode);
108 return findAlignmentIndex(currentAlignment);
109 }
110 } // namespace
111 namespace NodeModifier {
GetStackModifier()112 const ArkUIStackModifier* GetStackModifier()
113 {
114 static const ArkUIStackModifier modifier = { SetAlignContent, ResetAlignContent, GetAlignContent };
115
116 return &modifier;
117 }
118
GetCJUIStackModifier()119 const CJUIStackModifier* GetCJUIStackModifier()
120 {
121 static const CJUIStackModifier modifier = { SetAlignContent, ResetAlignContent, GetAlignContent };
122
123 return &modifier;
124 }
125 }
126 }