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_v2/inspector/indexer_composed_element.h"
17
18 #include "base/log/dump_log.h"
19 #include "base/utils/string_utils.h"
20 #include "core/components/common/layout/constants.h"
21 #include "core/components/text/text_element.h"
22 #include "core/components_v2/indexer/indexer_element.h"
23 #include "core/components_v2/indexer/render_indexer_item.h"
24 #include "core/components_v2/inspector/utils.h"
25
26 namespace OHOS::Ace::V2 {
27 namespace {
28 const std::unordered_map<std::string, std::function<std::string(const IndexerComposedElement&)>> CREATE_JSON_MAP {
__anoncaba870b0202(const IndexerComposedElement& inspector) 29 { "color", [](const IndexerComposedElement& inspector) { return inspector.GetColor(); } },
__anoncaba870b0302(const IndexerComposedElement& inspector) 30 { "selectedColor", [](const IndexerComposedElement& inspector) { return inspector.GetSelectedColor(); } },
__anoncaba870b0402(const IndexerComposedElement& inspector) 31 { "popupColor", [](const IndexerComposedElement& inspector) { return inspector.GetPopupColor(); } },
32 { "selectedBackgroundColor",
__anoncaba870b0502(const IndexerComposedElement& inspector) 33 [](const IndexerComposedElement& inspector) { return inspector.GetSelectedBackgroundColor(); } },
__anoncaba870b0602(const IndexerComposedElement& inspector) 34 { "popupBackground", [](const IndexerComposedElement& inspector) { return inspector.GetPopupBackground(); } },
__anoncaba870b0702(const IndexerComposedElement& inspector) 35 { "itemSize", [](const IndexerComposedElement& inspector) { return inspector.GetItemSize(); } },
__anoncaba870b0802(const IndexerComposedElement& inspector) 36 { "alignStyle", [](const IndexerComposedElement& inspector) { return inspector.GetAlignStyle(); } },
__anoncaba870b0902(const IndexerComposedElement& inspector) 37 { "selectedFont", [](const IndexerComposedElement& inspector) { return inspector.GetSelectedFont(); } },
__anoncaba870b0a02(const IndexerComposedElement& inspector) 38 { "popupFont", [](const IndexerComposedElement& inspector) { return inspector.GetPopupFont(); } },
__anoncaba870b0b02(const IndexerComposedElement& inspector) 39 { "font", [](const IndexerComposedElement& inspector) { return inspector.GetFont(); } },
40 };
41
42 const std::unordered_map<std::string,
43 std::function<std::unique_ptr<JsonValue>(const IndexerComposedElement&)>> CREATE_JSON_VALUE_MAP {
__anoncaba870b0c02(const IndexerComposedElement& inspector) 44 { "constructor", [](const IndexerComposedElement& inspector) { return inspector.GetConstructor(); } }
45 };
46
47 const std::unordered_map<std::string, std::function<bool(const IndexerComposedElement&)>> CREATE_JSON_BOOL_MAP {
__anoncaba870b0d02(const IndexerComposedElement& inspector) 48 { "usingPopup", [](const IndexerComposedElement& inspector) { return inspector.GetUsingPopup(); } },
49 };
50 }; // namespace
51
Dump()52 void IndexerComposedElement::Dump()
53 {
54 InspectorComposedElement::Dump();
55 for (const auto& value : CREATE_JSON_MAP) {
56 DumpLog::GetInstance().AddDesc(std::string(value.first + ":").append(value.second(*this)));
57 }
58 }
59
ToJsonObject() const60 std::unique_ptr<JsonValue> IndexerComposedElement::ToJsonObject() const
61 {
62 auto resultJson = InspectorComposedElement::ToJsonObject();
63 for (const auto& value : CREATE_JSON_MAP) {
64 resultJson->Put(value.first.c_str(), value.second(*this).c_str());
65 }
66 for (const auto& value : CREATE_JSON_BOOL_MAP) {
67 resultJson->Put(value.first.c_str(), value.second(*this));
68 }
69 for (const auto& value : CREATE_JSON_VALUE_MAP) {
70 resultJson->Put(value.first.c_str(), value.second(*this));
71 }
72 return resultJson;
73 }
74
GetColor() const75 std::string IndexerComposedElement::GetColor() const
76 {
77 auto node = GetInspectorNode(IndexerElement::TypeId());
78 if (!node) {
79 return "";
80 }
81 auto render = AceType::DynamicCast<RenderIndexer>(node)->GetSpecificItem(0);
82 if (!render) {
83 return "#99000000";
84 }
85 auto Color = render->GetNormalTextStyle().GetTextColor();
86 return Color.ColorToString();
87 }
88
GetSelectedColor() const89 std::string IndexerComposedElement::GetSelectedColor() const
90 {
91 auto node = GetInspectorNode(IndexerElement::TypeId());
92 if (!node) {
93 return "";
94 }
95 auto render = AceType::DynamicCast<RenderIndexer>(node)->GetSpecificItem(0);
96 if (!render) {
97 return "";
98 }
99 auto selectedColor = render->GetActiveTextStyle().GetTextColor();
100 return selectedColor.ColorToString();
101 }
102
GetPopupColor() const103 std::string IndexerComposedElement::GetPopupColor() const
104 {
105 auto node = GetInspectorNode(IndexerElement::TypeId());
106 if (!node) {
107 return "";
108 }
109 auto render = AceType::DynamicCast<RenderIndexer>(node);
110 auto popupColor = render ? render->GetBubbleText()->GetTextStyle().GetTextColor() : Color::BLACK;
111 return popupColor.ColorToString();
112 }
113
GetSelectedBackgroundColor() const114 std::string IndexerComposedElement::GetSelectedBackgroundColor() const
115 {
116 auto node = GetInspectorNode(IndexerElement::TypeId());
117 if (!node) {
118 return "";
119 }
120 auto render = AceType::DynamicCast<RenderIndexer>(node)->GetSpecificItem(0);
121 auto selectedBackgroundColor = render ? render->GetSelectedBackgroundColor() : Color::BLACK;
122 return selectedBackgroundColor.ColorToString();
123 }
124
GetPopupBackground() const125 std::string IndexerComposedElement::GetPopupBackground() const
126 {
127 auto node = GetInspectorNode(IndexerElement::TypeId());
128 if (!node) {
129 return "";
130 }
131 auto render = AceType::DynamicCast<RenderIndexer>(node);
132 auto popupBackground = render ? render->GetBubbleBackgroundColor() : Color::BLACK;
133 return popupBackground.ColorToString();
134 }
135
GetItemSize() const136 std::string IndexerComposedElement::GetItemSize() const
137 {
138 auto node = GetInspectorNode(IndexerElement::TypeId());
139 if (!node) {
140 return "";
141 }
142 auto render = AceType::DynamicCast<RenderIndexer>(node)->GetSpecificItem(0);
143 auto size = render ? render->GetItemSize().Value() : 0;
144 return std::to_string(size);
145 }
146
GetAlignStyle() const147 std::string IndexerComposedElement::GetAlignStyle() const
148 {
149 auto node = GetInspectorNode(IndexerElement::TypeId());
150 if (!node) {
151 return "";
152 }
153 auto render = AceType::DynamicCast<RenderIndexer>(node);
154 auto style = render ? render->GetAlignStyle() : AlignStyle::RIGHT;
155 return ConvertAlignStyleToString(style);
156 }
157
GetSelectedFont() const158 std::string IndexerComposedElement::GetSelectedFont() const
159 {
160 auto node = GetInspectorNode(IndexerElement::TypeId());
161 if (!node) {
162 return "";
163 }
164 auto render = AceType::DynamicCast<RenderIndexer>(node)->GetSpecificItem(0);
165 auto selectedFontJson = JsonUtil::Create(true);
166 auto fontSize = render ? render->GetActiveTextStyle().GetFontSize() : Dimension();
167 auto fontStyle = render ? render->GetActiveTextStyle().GetFontStyle() : FontStyle::NORMAL;
168 auto fontWeight = render ? render->GetActiveTextStyle().GetFontWeight() : FontWeight::NORMAL;
169 auto fontFamily = render ? render->GetActiveTextStyle().GetFontFamilies() : std::vector<std::string>();
170 selectedFontJson->Put("size", fontSize.Value());
171 selectedFontJson->Put("weight", ConvertWrapFontWeightToStirng(fontWeight).c_str());
172 selectedFontJson->Put("family", ConvertFontFamily(fontFamily).c_str());
173 selectedFontJson->Put("style", ConvertWrapFontStyleToStirng(fontStyle).c_str());
174 return selectedFontJson->ToString();
175 }
176
GetPopupFont() const177 std::string IndexerComposedElement::GetPopupFont() const
178 {
179 auto node = GetInspectorNode(IndexerElement::TypeId());
180 if (!node) {
181 return "";
182 }
183 auto render = AceType::DynamicCast<RenderIndexer>(node);
184 auto popupFontJson = JsonUtil::Create(true);
185 auto fontSize = render ? render->GetBubbleText()->GetTextStyle().GetFontSize() : Dimension();
186 auto fontStyle = render ? render->GetBubbleText()->GetTextStyle().GetFontStyle() : FontStyle::NORMAL;
187 auto fontWeight = render ? render->GetBubbleText()->GetTextStyle().GetFontWeight() : FontWeight::NORMAL;
188 auto fontFamily = render ? render->GetBubbleText()->GetTextStyle().GetFontFamilies() : std::vector<std::string>();
189 popupFontJson->Put("size", fontSize.Value());
190 popupFontJson->Put("weight", ConvertWrapFontWeightToStirng(fontWeight).c_str());
191 popupFontJson->Put("family", ConvertFontFamily(fontFamily).c_str());
192 popupFontJson->Put("style", ConvertWrapFontStyleToStirng(fontStyle).c_str());
193 return popupFontJson->ToString();
194 }
195
GetFont() const196 std::string IndexerComposedElement::GetFont() const
197 {
198 auto node = GetInspectorNode(IndexerElement::TypeId());
199 if (!node) {
200 return "";
201 }
202 auto render = AceType::DynamicCast<RenderIndexer>(node)->GetSpecificItem(0);
203 auto fontJson = JsonUtil::Create(true);
204 auto fontSize = render ? render->GetNormalTextStyle().GetFontSize() : Dimension();
205 auto fontStyle = render ? render->GetNormalTextStyle().GetFontStyle() : FontStyle::NORMAL;
206 auto fontWeight = render ? render->GetNormalTextStyle().GetFontWeight() : FontWeight::NORMAL;
207 auto fontFamily = render ? render->GetNormalTextStyle().GetFontFamilies() : std::vector<std::string>();
208 fontJson->Put("size", fontSize.Value());
209 fontJson->Put("weight", ConvertWrapFontWeightToStirng(fontWeight).c_str());
210 fontJson->Put("family", ConvertFontFamily(fontFamily).c_str());
211 fontJson->Put("style", ConvertWrapFontStyleToStirng(fontStyle).c_str());
212 return fontJson->ToString();
213 }
214
GetConstructor() const215 std::unique_ptr<JsonValue> IndexerComposedElement::GetConstructor() const
216 {
217 auto jsonValue = JsonUtil::Create(true);
218 jsonValue->Put("arrayValue", GetArrayValue().c_str());
219 jsonValue->Put("selected", GetIndexSelected().c_str());
220 return jsonValue;
221 }
222
GetIndexSelected() const223 std::string IndexerComposedElement::GetIndexSelected() const
224 {
225 auto node = GetInspectorNode(IndexerElement::TypeId());
226 if (!node) {
227 return "";
228 }
229 auto render = AceType::DynamicCast<RenderIndexer>(node);
230 auto selected = render->GetFocusIndex();
231 return std::to_string(selected);
232 }
233
GetArrayValue() const234 std::string IndexerComposedElement::GetArrayValue() const
235 {
236 auto node = GetInspectorNode(IndexerElement::TypeId());
237 if (!node) {
238 return "";
239 }
240 auto render = AceType::DynamicCast<RenderIndexer>(node);
241 auto jsonValueArray = JsonUtil::CreateArray(true);
242 auto value = render->GetArrayValue();
243 uint32_t length = value.size();
244 if (length <= 0) {
245 return "";
246 }
247 for (uint32_t i = 0; i < length; i++) {
248 auto index = std::to_string(i);
249 jsonValueArray->Put(index.c_str(), StringUtils::Str16ToStr8(value[i]).c_str());
250 }
251 return jsonValueArray->ToString();
252 }
253
GetUsingPopup() const254 bool IndexerComposedElement::GetUsingPopup() const
255 {
256 auto node = GetInspectorNode(IndexerElement::TypeId());
257 if (!node) {
258 return false;
259 }
260 auto render = AceType::DynamicCast<RenderIndexer>(node);
261 return render ? render->GetBubbleEnabled() : false;
262 }
263
ConvertAlignStyleToString(AlignStyle alignStyle) const264 std::string IndexerComposedElement::ConvertAlignStyleToString(AlignStyle alignStyle) const
265 {
266 std::string result = "";
267 switch (alignStyle) {
268 case AlignStyle::RIGHT:
269 result = "AlignStyle.Right";
270 break;
271 case AlignStyle::LEFT:
272 result = "AlignStyle.Left";
273 break;
274 default:
275 break;
276 }
277 return result;
278 }
279
ConvertFontFamily(const std::vector<std::string> & fontFamily) const280 std::string IndexerComposedElement::ConvertFontFamily(const std::vector<std::string>& fontFamily) const
281 {
282 std::string result = "";
283 for (const auto& item : fontFamily) {
284 result += item;
285 result += ",";
286 }
287 if (!result.empty()) {
288 result = result.substr(0, result.size() - 1);
289 }
290 return result;
291 }
292 } // namespace OHOS::Ace::V2