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 }