• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 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/components/declaration/div/div_declaration.h"
17 
18 #include "base/utils/string_utils.h"
19 #include "core/components/declaration/common/declaration_constants.h"
20 #include "core/components/scroll/scroll_fade_effect.h"
21 #include "core/components/scroll/scroll_spring_effect.h"
22 #include "frameworks/bridge/common/utils/utils.h"
23 
24 namespace OHOS::Ace {
25 
26 using namespace Framework;
27 
InitSpecialized()28 void DivDeclaration::InitSpecialized()
29 {
30     AddSpecializedAttribute(DeclarationConstants::DEFAULT_DIV_ATTR);
31     AddSpecializedStyle(DeclarationConstants::DEFAULT_DIV_STYLE);
32 }
33 
SetSpecializedAttr(const std::pair<std::string,std::string> & attr)34 bool DivDeclaration::SetSpecializedAttr(const std::pair<std::string, std::string>& attr)
35 {
36     if (attr.first == DOM_DIV_CARD_TYPE) {
37         auto& divAttr = MaybeResetAttribute<DivAttribute>(AttributeTag::SPECIALIZED_ATTR);
38         if (divAttr.IsValid()) {
39             divAttr.isCard = StringToBool(attr.second);
40         }
41         return true;
42     } else if (attr.first == DOM_DIV_CARD_BLUR) {
43         auto& divAttr = MaybeResetAttribute<DivAttribute>(AttributeTag::SPECIALIZED_ATTR);
44         if (divAttr.IsValid()) {
45             divAttr.isCardBlur = StringToBool(attr.second);
46         }
47         return true;
48     }
49     return false;
50 }
51 
SetSpecializedStyle(const std::pair<std::string,std::string> & style)52 bool DivDeclaration::SetSpecializedStyle(const std::pair<std::string, std::string>& style)
53 {
54     static const LinearMapNode<void (*)(const std::string&, DivDeclaration&)> styleSetters[] {
55         { DOM_ALIGN_CONTENT,
56             [](const std::string& value, DivDeclaration& declaration) {
57                 auto& divStyle = declaration.MaybeResetStyle<DivStyle>(StyleTag::SPECIALIZED_STYLE);
58                 if (divStyle.IsValid()) {
59                     divStyle.alignContent = value;
60                 }
61             } },
62         { DOM_ALIGN_ITEMS,
63             [](const std::string& value, DivDeclaration& declaration) {
64                 auto& divStyle = declaration.MaybeResetStyle<DivStyle>(StyleTag::SPECIALIZED_STYLE);
65                 if (divStyle.IsValid()) {
66                     divStyle.alignItems = value;
67                 }
68             } },
69         { DOM_FLEX_DIRECTION,
70             [](const std::string& value, DivDeclaration& declaration) {
71                 auto& divStyle = declaration.MaybeResetStyle<DivStyle>(StyleTag::SPECIALIZED_STYLE);
72                 if (divStyle.IsValid()) {
73                     divStyle.direction = value;
74                 }
75             } },
76         { DOM_FLEX_WRAP,
77             [](const std::string& value, DivDeclaration& declaration) {
78                 auto& divStyle = declaration.MaybeResetStyle<DivStyle>(StyleTag::SPECIALIZED_STYLE);
79                 if (divStyle.IsValid()) {
80                     divStyle.isFlexWrap = (value == DOM_WRAP);
81                 }
82             } },
83         { DOM_GRID_AUTO_FLOW,
84             [](const std::string& value, DivDeclaration& declaration) {
85                 auto& divStyle = declaration.MaybeResetStyle<DivStyle>(StyleTag::SPECIALIZED_STYLE);
86                 if (divStyle.IsValid()) {
87                     divStyle.direction = value;
88                 }
89             } },
90         { DOM_GRID_COLUMN_END,
91             [](const std::string& value, DivDeclaration& declaration) {
92                 auto& divStyle = declaration.MaybeResetStyle<DivStyle>(StyleTag::SPECIALIZED_STYLE);
93                 if (divStyle.IsValid()) {
94                     divStyle.columnEnd = StringToInt(value);
95                 }
96             } },
97         { DOM_GRID_COLUMN_START,
98             [](const std::string& value, DivDeclaration& declaration) {
99                 auto& divStyle = declaration.MaybeResetStyle<DivStyle>(StyleTag::SPECIALIZED_STYLE);
100                 if (divStyle.IsValid()) {
101                     divStyle.columnStart = StringToInt(value);
102                 }
103             } },
104         { DOM_GRID_COLUMN_GAP,
105             [](const std::string& value, DivDeclaration& declaration) {
106                 auto& divStyle = declaration.MaybeResetStyle<DivStyle>(StyleTag::SPECIALIZED_STYLE);
107                 if (divStyle.IsValid()) {
108                     divStyle.columnGap = StringToDouble(value);
109                 }
110             } },
111         { DOM_GRID_ROW_END,
112             [](const std::string& value, DivDeclaration& declaration) {
113                 auto& divStyle = declaration.MaybeResetStyle<DivStyle>(StyleTag::SPECIALIZED_STYLE);
114                 if (divStyle.IsValid()) {
115                     divStyle.rowEnd = StringToInt(value);
116                 }
117             } },
118         { DOM_GRID_ROW_START,
119             [](const std::string& value, DivDeclaration& declaration) {
120                 auto& divStyle = declaration.MaybeResetStyle<DivStyle>(StyleTag::SPECIALIZED_STYLE);
121                 if (divStyle.IsValid()) {
122                     divStyle.rowStart = StringToInt(value);
123                 }
124             } },
125         { DOM_GRID_ROW_GAP,
126             [](const std::string& value, DivDeclaration& declaration) {
127                 auto& divStyle = declaration.MaybeResetStyle<DivStyle>(StyleTag::SPECIALIZED_STYLE);
128                 if (divStyle.IsValid()) {
129                     divStyle.rowGap = StringToDouble(value);
130                 }
131             } },
132         { DOM_GRID_TEMPLATE_COLUMNS,
133             [](const std::string& value, DivDeclaration& declaration) {
134                 auto& divStyle = declaration.MaybeResetStyle<DivStyle>(StyleTag::SPECIALIZED_STYLE);
135                 if (divStyle.IsValid()) {
136                     divStyle.columnsArgs = value;
137                 }
138             } },
139         { DOM_GRID_TEMPLATE_ROWS,
140             [](const std::string& value, DivDeclaration& declaration) {
141                 auto& divStyle = declaration.MaybeResetStyle<DivStyle>(StyleTag::SPECIALIZED_STYLE);
142                 if (divStyle.IsValid()) {
143                     divStyle.rowsArgs = value;
144                 }
145             } },
146         { DOM_JUSTIFY_CONTENT,
147             [](const std::string& value, DivDeclaration& declaration) {
148                 auto& divStyle = declaration.MaybeResetStyle<DivStyle>(StyleTag::SPECIALIZED_STYLE);
149                 if (divStyle.IsValid()) {
150                     divStyle.justifyContent = value;
151                 }
152             } },
153         { DOM_SCROLL_OVER_SCROLL_EFFECT,
154             [](const std::string& value, DivDeclaration& declaration) {
155                 auto& divStyle = declaration.MaybeResetStyle<DivStyle>(StyleTag::SPECIALIZED_STYLE);
156                 if (divStyle.IsValid()) {
157                     if (value == DOM_SCROLL_EFFECT_SPRING) {
158                         divStyle.edgeEffect = EdgeEffect::SPRING;
159                     } else if (value == DOM_SCROLL_EFFECT_FADE) {
160                         divStyle.edgeEffect = EdgeEffect::FADE;
161                     } else {
162                         divStyle.edgeEffect = EdgeEffect::NONE;
163                     }
164                 }
165             } },
166         { DOM_SCROLL_SCROLLBAR_COLOR,
167             [](const std::string& value, DivDeclaration& declaration) {
168                 auto& divStyle = declaration.MaybeResetStyle<DivStyle>(StyleTag::SPECIALIZED_STYLE);
169                 if (divStyle.IsValid()) {
170                     divStyle.scrollBarColor.first = true;
171                     divStyle.scrollBarColor.second = declaration.ParseColor(value);
172                 }
173             } },
174         { DOM_SCROLL_SCROLLBAR_WIDTH,
175             [](const std::string& value, DivDeclaration& declaration) {
176                 auto& divStyle = declaration.MaybeResetStyle<DivStyle>(StyleTag::SPECIALIZED_STYLE);
177                 if (divStyle.IsValid()) {
178                     divStyle.scrollBarWidth.first = true;
179                     auto width = declaration.ParseDimension(value);
180                     divStyle.scrollBarWidth.second = width.IsValid() ? width : Dimension();
181                 }
182             } },
183     };
184     auto operatorIter = BinarySearchFindIndex(styleSetters, ArraySize(styleSetters), style.first.c_str());
185     if (operatorIter != -1) {
186         styleSetters[operatorIter].value(style.second, *this);
187         return true;
188     }
189     return false;
190 }
191 
192 } // namespace OHOS::Ace
193