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 "bridge/cj_frontend/interfaces/cj_ffi/cj_stack_ffi.h"
17 
18 #include "bridge/cj_frontend/interfaces/cj_ffi/utils.h"
19 #include "core/components_ng/base/view_abstract.h"
20 #include "core/components_ng/pattern/stack/stack_model_ng.h"
21 
22 using namespace OHOS::Ace;
23 using namespace OHOS::Ace::Framework;
24 
25 namespace {
26 const std::array<Alignment, 9> ALIGNMENT_ARR {Alignment::TOP_LEFT, Alignment::TOP_CENTER, Alignment::TOP_RIGHT,
27     Alignment::CENTER_LEFT, Alignment::CENTER, Alignment::CENTER_RIGHT, Alignment::BOTTOM_LEFT,
28     Alignment::BOTTOM_CENTER, Alignment::BOTTOM_RIGHT };
29 const std::vector<StackFit> STACK_FITS = {
30     StackFit::KEEP,
31     StackFit::STRETCH,
32     StackFit::INHERIT,
33     StackFit::FIRST_CHILD
34 };
35 const std::vector<Overflow> OVERFLOWS = {
36     Overflow::CLIP,
37     Overflow::OBSERVABLE,
38     Overflow::SCROLL,
39     Overflow::FORCE_CLIP
40 };
41 } // namespace
42 
43 extern "C" {
FfiOHOSAceFrameworkStackCreate(int32_t value)44 void FfiOHOSAceFrameworkStackCreate(int32_t value)
45 {
46     if (!Utils::CheckParamsValid(value, ALIGNMENT_ARR.size())) {
47         LOGE("invalid value for overflow");
48         return;
49     }
50     StackModel::GetInstance()->Create(ALIGNMENT_ARR[value]);
51 }
52 
FfiOHOSAceFrameworkStackSetOverflow(int32_t value)53 void FfiOHOSAceFrameworkStackSetOverflow(int32_t value)
54 {
55     if (!Utils::CheckParamsValid(value, OVERFLOWS.size())) {
56         LOGE("invalid value for overflow");
57         return;
58     }
59     StackModel::GetInstance()->SetOverflow(OVERFLOWS[value]);
60 }
61 
FfiOHOSAceFrameworkStackSetStackFit(int32_t value)62 void FfiOHOSAceFrameworkStackSetStackFit(int32_t value)
63 {
64     if (!Utils::CheckParamsValid(value, STACK_FITS.size())) {
65         LOGE("invalid value for stack fit");
66         return;
67     }
68     StackModel::GetInstance()->SetStackFit(STACK_FITS[value]);
69 }
70 
FfiOHOSAceFrameworkStackSetAlignment(int32_t value)71 void FfiOHOSAceFrameworkStackSetAlignment(int32_t value)
72 {
73     if (!Utils::CheckParamsValid(value, ALIGNMENT_ARR.size())) {
74         LOGE("invalid value for stack fit");
75         return;
76     }
77     StackModel::GetInstance()->SetAlignment(ALIGNMENT_ARR[value]);
78 }
79 
FfiOHOSAceFrameworkStackSetWidth(double value,int32_t unit)80 void FfiOHOSAceFrameworkStackSetWidth(double value, int32_t unit)
81 {
82     Dimension width(value, static_cast<DimensionUnit>(unit));
83 
84     if (LessNotEqual(width.Value(), 0.0)) {
85         width.SetValue(0.0);
86     }
87     NG::ViewAbstract::SetWidth(NG::CalcLength(width));
88     StackModel::GetInstance()->SetHasHeight();
89 }
90 
FfiOHOSAceFrameworkStackSetHeight(double value,int32_t unit)91 void FfiOHOSAceFrameworkStackSetHeight(double value, int32_t unit)
92 {
93     Dimension height(value, static_cast<DimensionUnit>(unit));
94 
95     if (LessNotEqual(height.Value(), 0.0)) {
96         height.SetValue(0.0);
97     }
98     NG::ViewAbstract::SetHeight(NG::CalcLength(height));
99     StackModel::GetInstance()->SetHasHeight();
100 }
101 
FfiOHOSAceFrameworkStackSetSize(double width,int32_t widthUnit,double height,int32_t heightUnit)102 void FfiOHOSAceFrameworkStackSetSize(double width, int32_t widthUnit, double height, int32_t heightUnit)
103 {
104     Dimension widthDime(width, static_cast<DimensionUnit>(widthUnit));
105     Dimension heightDime(height, static_cast<DimensionUnit>(heightUnit));
106 
107     if (LessNotEqual(widthDime.Value(), 0.0)) {
108         widthDime.SetValue(0.0);
109     }
110     if (LessNotEqual(heightDime.Value(), 0.0)) {
111         heightDime.SetValue(0.0);
112     }
113     NG::ViewAbstract::SetWidth(NG::CalcLength(widthDime));
114     NG::ViewAbstract::SetHeight(NG::CalcLength(heightDime));
115     StackModel::GetInstance()->SetHasHeight();
116     StackModel::GetInstance()->SetHasHeight();
117 }
118 }
119