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 "swiper_helper.h"
17 
18 #include "base/log/dump_log.h"
19 #include "core/components_ng/pattern/swiper_indicator/indicator_common/swiper_indicator_layout_property.h"
20 
21 namespace OHOS::Ace::NG {
InitSwiperController(const RefPtr<SwiperController> & controller,const WeakPtr<SwiperPattern> & weak)22 void SwiperHelper::InitSwiperController(const RefPtr<SwiperController>& controller, const WeakPtr<SwiperPattern>& weak)
23 {
24     controller->SetSwipeToImpl([weak](int32_t index, bool reverse) {
25         auto swiper = weak.Upgrade();
26         CHECK_NULL_VOID(swiper);
27         swiper->SwipeTo(index);
28     });
29 
30     controller->SetSwipeToWithoutAnimationImpl([weak](int32_t index) {
31         auto swiper = weak.Upgrade();
32         CHECK_NULL_VOID(swiper);
33         swiper->SwipeToWithoutAnimation(index);
34     });
35 
36     controller->SetShowNextImpl([weak]() {
37         auto swiper = weak.Upgrade();
38         CHECK_NULL_VOID(swiper);
39         auto swiperNode = swiper->GetHost();
40         CHECK_NULL_VOID(swiperNode);
41         TAG_LOGI(AceLogTag::ACE_SWIPER, "Swiper ShowNext, id:%{public}d", swiperNode->GetId());
42         swiper->ShowNext();
43     });
44 
45     controller->SetShowPrevImpl([weak]() {
46         auto swiper = weak.Upgrade();
47         CHECK_NULL_VOID(swiper);
48         auto swiperNode = swiper->GetHost();
49         CHECK_NULL_VOID(swiperNode);
50         TAG_LOGI(AceLogTag::ACE_SWIPER, "Swiper ShowPrevious, id:%{public}d", swiperNode->GetId());
51         swiper->ShowPrevious();
52     });
53 
54     controller->SetChangeIndexImpl([weak](int32_t index, bool useAnimation) {
55         auto swiper = weak.Upgrade();
56         CHECK_NULL_VOID(swiper);
57         TAG_LOGI(AceLogTag::ACE_SWIPER, "Swiper ChangeIndex %{public}d, useAnimation:%{public}d", index, useAnimation);
58         swiper->ChangeIndex(index, useAnimation);
59     });
60 
61     controller->SetFinishImpl([weak]() {
62         auto swiper = weak.Upgrade();
63         CHECK_NULL_VOID(swiper);
64         swiper->FinishAnimation();
65     });
66 
67     controller->SetPreloadItemsImpl([weak](const std::set<int32_t>& indexSet) {
68         auto swiper = weak.Upgrade();
69         CHECK_NULL_VOID(swiper);
70         swiper->PreloadItems(indexSet);
71     });
72 }
73 
SaveDigitIndicatorProperty(const RefPtr<FrameNode> & indicatorNode,SwiperPattern & swiper)74 void SwiperHelper::SaveDigitIndicatorProperty(const RefPtr<FrameNode>& indicatorNode, SwiperPattern& swiper)
75 {
76     CHECK_NULL_VOID(indicatorNode);
77     auto indicatorProps = indicatorNode->GetLayoutProperty<SwiperIndicatorLayoutProperty>();
78     CHECK_NULL_VOID(indicatorProps);
79     auto pipeline = PipelineBase::GetCurrentContext();
80     CHECK_NULL_VOID(pipeline);
81     const auto theme = pipeline->GetTheme<SwiperIndicatorTheme>();
82     const auto digitalParams = swiper.GetSwiperDigitalParameters();
83     CHECK_NULL_VOID(digitalParams);
84     indicatorProps->ResetIndicatorLayoutStyle();
85     if (digitalParams->dimLeft.has_value()) {
86         indicatorProps->UpdateLeft(digitalParams->dimLeft.value());
87     }
88     if (digitalParams->dimTop.has_value()) {
89         indicatorProps->UpdateTop(digitalParams->dimTop.value());
90     }
91     if (digitalParams->dimRight.has_value()) {
92         indicatorProps->UpdateRight(digitalParams->dimRight.value());
93     }
94     if (digitalParams->dimBottom.has_value()) {
95         indicatorProps->UpdateBottom(digitalParams->dimBottom.value());
96     }
97     indicatorProps->UpdateFontColor(
98         digitalParams->fontColor.value_or(theme->GetDigitalIndicatorTextStyle().GetTextColor()));
99     indicatorProps->UpdateSelectedFontColor(
100         digitalParams->selectedFontColor.value_or(theme->GetDigitalIndicatorTextStyle().GetTextColor()));
101     indicatorProps->UpdateFontSize(
102         digitalParams->fontSize.value_or(theme->GetDigitalIndicatorTextStyle().GetFontSize()));
103     indicatorProps->UpdateSelectedFontSize(
104         digitalParams->selectedFontSize.value_or(theme->GetDigitalIndicatorTextStyle().GetFontSize()));
105     indicatorProps->UpdateFontWeight(
106         digitalParams->fontWeight.value_or(theme->GetDigitalIndicatorTextStyle().GetFontWeight()));
107     indicatorProps->UpdateSelectedFontWeight(
108         digitalParams->selectedFontWeight.value_or(theme->GetDigitalIndicatorTextStyle().GetFontWeight()));
109     auto props = swiper.GetLayoutProperty<SwiperLayoutProperty>();
110     CHECK_NULL_VOID(props);
111     props->UpdateLeft(digitalParams->dimLeft.value_or(0.0_vp));
112     props->UpdateTop(digitalParams->dimTop.value_or(0.0_vp));
113     props->UpdateRight(digitalParams->dimRight.value_or(0.0_vp));
114     props->UpdateBottom(digitalParams->dimBottom.value_or(0.0_vp));
115     swiper.SetDigitStartAndEndProperty(indicatorNode);
116 }
117 
SaveDotIndicatorProperty(const RefPtr<FrameNode> & indicatorNode,SwiperPattern & swiper)118 void SwiperHelper::SaveDotIndicatorProperty(const RefPtr<FrameNode>& indicatorNode, SwiperPattern& swiper)
119 {
120     CHECK_NULL_VOID(indicatorNode);
121     auto indicatorProps = indicatorNode->GetLayoutProperty<SwiperIndicatorLayoutProperty>();
122     CHECK_NULL_VOID(indicatorProps);
123     const auto params = swiper.GetSwiperParameters();
124     CHECK_NULL_VOID(params);
125     indicatorProps->ResetIndicatorLayoutStyle();
126     if (params->dimLeft.has_value()) {
127         indicatorProps->UpdateLeft(params->dimLeft.value());
128     }
129     if (params->dimTop.has_value()) {
130         indicatorProps->UpdateTop(params->dimTop.value());
131     }
132     if (params->dimRight.has_value()) {
133         indicatorProps->UpdateRight(params->dimRight.value());
134     }
135     if (params->dimBottom.has_value()) {
136         indicatorProps->UpdateBottom(params->dimBottom.value());
137     }
138     const bool isRtl = swiper.GetNonAutoLayoutDirection() == TextDirection::RTL;
139     if (params->dimStart.has_value()) {
140         auto dimValue = params->dimStart.value();
141         isRtl ? indicatorProps->UpdateRight(dimValue) : indicatorProps->UpdateLeft(dimValue);
142     } else if (params->dimEnd.has_value()) {
143         auto dimValue = params->dimEnd.value();
144         isRtl ? indicatorProps->UpdateLeft(dimValue) : indicatorProps->UpdateRight(dimValue);
145     }
146 
147     swiper.UpdatePaintProperty(indicatorNode);
148 }
149 
150 namespace {
DumpPanDirection(const PanDirection & pan)151 void DumpPanDirection(const PanDirection& pan)
152 {
153     switch (pan.type) {
154         case PanDirection::NONE: {
155             DumpLog::GetInstance().AddDesc("PanDirection:NONE");
156             break;
157         }
158         case PanDirection::LEFT: {
159             DumpLog::GetInstance().AddDesc("PanDirection:LEFT");
160             break;
161         }
162         case PanDirection::RIGHT: {
163             DumpLog::GetInstance().AddDesc("PanDirection:RIGHT");
164             break;
165         }
166         case PanDirection::HORIZONTAL: {
167             DumpLog::GetInstance().AddDesc("PanDirection:HORIZONTAL");
168             break;
169         }
170         case PanDirection::UP: {
171             DumpLog::GetInstance().AddDesc("PanDirection:UP");
172             break;
173         }
174         case PanDirection::DOWN: {
175             DumpLog::GetInstance().AddDesc("PanDirection:DOWN");
176             break;
177         }
178         case PanDirection::VERTICAL: {
179             DumpLog::GetInstance().AddDesc("PanDirection:VERTICAL");
180             break;
181         }
182         case PanDirection::ALL: {
183             DumpLog::GetInstance().AddDesc("PanDirection:ALL");
184             break;
185         }
186         default: {
187             break;
188         }
189     }
190 }
191 
DumpDirection(Axis direction)192 void DumpDirection(Axis direction)
193 {
194     switch (direction) {
195         case Axis::NONE: {
196             DumpLog::GetInstance().AddDesc("Axis:NONE");
197             break;
198         }
199         case Axis::HORIZONTAL: {
200             DumpLog::GetInstance().AddDesc("Axis:HORIZONTAL");
201             break;
202         }
203         case Axis::FREE: {
204             DumpLog::GetInstance().AddDesc("Axis:FREE");
205             break;
206         }
207         case Axis::VERTICAL: {
208             DumpLog::GetInstance().AddDesc("Axis:VERTICAL");
209             break;
210         }
211         default: {
212             break;
213         }
214     }
215 }
216 
DumpIndicatorType(const std::optional<SwiperIndicatorType> & type)217 void DumpIndicatorType(const std::optional<SwiperIndicatorType>& type)
218 {
219     if (type.has_value()) {
220         switch (type.value()) {
221             case SwiperIndicatorType::DOT: {
222                 DumpLog::GetInstance().AddDesc("SwiperIndicatorType:DOT");
223                 break;
224             }
225             case SwiperIndicatorType::DIGIT: {
226                 DumpLog::GetInstance().AddDesc("SwiperIndicatorType:DIGIT");
227                 break;
228             }
229             default: {
230                 break;
231             }
232         }
233     } else {
234         DumpLog::GetInstance().AddDesc("lastSwiperIndicatorType:null");
235     }
236 }
237 
DumpItemPosition(const SwiperLayoutAlgorithm::PositionMap & positions)238 void DumpItemPosition(const SwiperLayoutAlgorithm::PositionMap& positions)
239 {
240     for (const auto& item : positions) {
241         DumpLog::GetInstance().AddDesc(std::string("id:")
242                                            .append(std::to_string(item.first))
243                                            .append(",startPos:")
244                                            .append(std::to_string(item.second.startPos))
245                                            .append(",endPos:" + std::to_string(item.second.endPos)));
246     }
247 }
248 } // namespace
249 
DumpAdvanceInfo(SwiperPattern & swiper)250 void SwiperHelper::DumpAdvanceInfo(SwiperPattern& swiper)
251 {
252     DumpInfoAddPositionDesc(swiper);
253     DumpInfoAddGestureDesc(swiper);
254     DumpIndicatorType(swiper.lastSwiperIndicatorType_);
255     DumpInfoAddAnimationDesc(swiper);
256     if (!swiper.itemPosition_.empty()) {
257         DumpLog::GetInstance().AddDesc("-----------start print itemPosition------------");
258         DumpItemPosition(swiper.itemPosition_);
259         DumpLog::GetInstance().AddDesc("-----------end print itemPosition------------");
260     }
261     if (!swiper.itemPositionInAnimation_.empty()) {
262         DumpLog::GetInstance().AddDesc("-----------start print itemPositionInAnimation------------");
263         DumpItemPosition(swiper.itemPositionInAnimation_);
264         DumpLog::GetInstance().AddDesc("-----------end print itemPositionInAnimation------------");
265     }
266     DumpPanDirection(swiper.panDirection_);
267     DumpDirection(swiper.direction_);
268 }
269 
DumpInfoAddPositionDesc(SwiperPattern & swiper)270 void SwiperHelper::DumpInfoAddPositionDesc(SwiperPattern& swiper)
271 {
272     swiper.crossMatchChild_ ? DumpLog::GetInstance().AddDesc("crossMatchChild:true")
273                             : DumpLog::GetInstance().AddDesc("crossMatchChild:false");
274     swiper.uiCastJumpIndex_.has_value()
275         ? DumpLog::GetInstance().AddDesc("uiCastJumpIndex:" + std::to_string(swiper.uiCastJumpIndex_.value()))
276         : DumpLog::GetInstance().AddDesc("uiCastJumpIndex:null");
277     swiper.jumpIndex_.has_value()
278         ? DumpLog::GetInstance().AddDesc("jumpIndex:" + std::to_string(swiper.jumpIndex_.value()))
279         : DumpLog::GetInstance().AddDesc("jumpIndex:null");
280     swiper.targetIndex_.has_value()
281         ? DumpLog::GetInstance().AddDesc("targetIndex:" + std::to_string(swiper.targetIndex_.value()))
282         : DumpLog::GetInstance().AddDesc("targetIndex:null");
283     swiper.preTargetIndex_.has_value()
284         ? DumpLog::GetInstance().AddDesc("preTargetIndex:" + std::to_string(swiper.preTargetIndex_.value()))
285         : DumpLog::GetInstance().AddDesc("preTargetIndex:null");
286     swiper.pauseTargetIndex_.has_value()
287         ? DumpLog::GetInstance().AddDesc("pauseTargetIndex:" + std::to_string(swiper.pauseTargetIndex_.value()))
288         : DumpLog::GetInstance().AddDesc("pauseTargetIndex:null");
289     DumpLog::GetInstance().AddDesc("currentIndex:" + std::to_string(swiper.currentIndex_));
290     DumpLog::GetInstance().AddDesc("oldIndex:" + std::to_string(swiper.oldIndex_));
291     DumpLog::GetInstance().AddDesc("currentOffset:" + std::to_string(swiper.currentOffset_));
292     DumpLog::GetInstance().AddDesc("fadeOffset:" + std::to_string(swiper.fadeOffset_));
293     DumpLog::GetInstance().AddDesc("touchBottomRate:" + std::to_string(swiper.touchBottomRate_));
294     DumpLog::GetInstance().AddDesc("currentIndexOffset:" + std::to_string(swiper.currentIndexOffset_));
295     DumpLog::GetInstance().AddDesc("gestureSwipeIndex:" + std::to_string(swiper.gestureSwipeIndex_));
296     DumpLog::GetInstance().AddDesc("currentFirstIndex:" + std::to_string(swiper.currentFirstIndex_));
297     DumpLog::GetInstance().AddDesc("startMainPos:" + std::to_string(swiper.startMainPos_));
298     DumpLog::GetInstance().AddDesc("endMainPos:" + std::to_string(swiper.endMainPos_));
299     DumpLog::GetInstance().AddDesc("contentMainSize:" + std::to_string(swiper.contentMainSize_));
300     DumpLog::GetInstance().AddDesc("contentCrossSize:" + std::to_string(swiper.contentCrossSize_));
301 }
302 
DumpInfoAddGestureDesc(SwiperPattern & swiper)303 void SwiperHelper::DumpInfoAddGestureDesc(SwiperPattern& swiper)
304 {
305     swiper.isLastIndicatorFocused_ ? DumpLog::GetInstance().AddDesc("isLastIndicatorFocused:true")
306                                    : DumpLog::GetInstance().AddDesc("isLastIndicatorFocused:false");
307     swiper.moveDirection_ ? DumpLog::GetInstance().AddDesc("moveDirection:true")
308                           : DumpLog::GetInstance().AddDesc("moveDirection:false");
309     swiper.indicatorDoingAnimation_ ? DumpLog::GetInstance().AddDesc("indicatorDoingAnimation:true")
310                                     : DumpLog::GetInstance().AddDesc("indicatorDoingAnimation:false");
311     swiper.hasVisibleChangeRegistered_ ? DumpLog::GetInstance().AddDesc("hasVisibleChangeRegistered:true")
312                                        : DumpLog::GetInstance().AddDesc("hasVisibleChangeRegistered:false");
313     swiper.isVisible_ ? DumpLog::GetInstance().AddDesc("isVisible:true")
314                       : DumpLog::GetInstance().AddDesc("isVisible:false");
315     swiper.isVisibleArea_ ? DumpLog::GetInstance().AddDesc("isVisibleArea:true")
316                           : DumpLog::GetInstance().AddDesc("isVisibleArea:false");
317     swiper.isWindowShow_ ? DumpLog::GetInstance().AddDesc("isWindowShow:true")
318                          : DumpLog::GetInstance().AddDesc("isWindowShow:false");
319     swiper.isCustomSize_ ? DumpLog::GetInstance().AddDesc("IsCustomSize:true")
320                          : DumpLog::GetInstance().AddDesc("IsCustomSize:false");
321     swiper.indicatorIsBoolean_ ? DumpLog::GetInstance().AddDesc("indicatorIsBoolean:true")
322                                : DumpLog::GetInstance().AddDesc("indicatorIsBoolean:false");
323     swiper.isAtHotRegion_ ? DumpLog::GetInstance().AddDesc("isAtHotRegion:true")
324                           : DumpLog::GetInstance().AddDesc("isAtHotRegion:false");
325     swiper.isDragging_ ? DumpLog::GetInstance().AddDesc("isDragging:true")
326                        : DumpLog::GetInstance().AddDesc("isDragging:false");
327     swiper.isTouchDown_ ? DumpLog::GetInstance().AddDesc("isTouchDown:true")
328                         : DumpLog::GetInstance().AddDesc("isTouchDown:false");
329     swiper.isIndicatorLongPress_ ? DumpLog::GetInstance().AddDesc("isIndicatorLongPress:true")
330                                  : DumpLog::GetInstance().AddDesc("isIndicatorLongPress:false");
331     swiper.preLoop_.has_value() ? DumpLog::GetInstance().AddDesc("preLoop:" + std::to_string(swiper.preLoop_.value()))
332                                 : DumpLog::GetInstance().AddDesc("preLoop:null");
333     swiper.indicatorId_.has_value()
334         ? DumpLog::GetInstance().AddDesc("indicatorId:" + std::to_string(swiper.indicatorId_.value()))
335         : DumpLog::GetInstance().AddDesc("indicatorId:null");
336     swiper.leftButtonId_.has_value()
337         ? DumpLog::GetInstance().AddDesc("leftButtonId:" + std::to_string(swiper.leftButtonId_.value()))
338         : DumpLog::GetInstance().AddDesc("leftButtonId:null");
339     swiper.rightButtonId_.has_value()
340         ? DumpLog::GetInstance().AddDesc("rightButtonId:" + std::to_string(swiper.rightButtonId_.value()))
341         : DumpLog::GetInstance().AddDesc("rightButtonId:null");
342 }
343 
DumpInfoAddAnimationDesc(SwiperPattern & swiper)344 void SwiperHelper::DumpInfoAddAnimationDesc(SwiperPattern& swiper)
345 {
346     swiper.isFinishAnimation_ ? DumpLog::GetInstance().AddDesc("isFinishAnimation:true")
347                               : DumpLog::GetInstance().AddDesc("isFinishAnimation:false");
348     swiper.mainSizeIsMeasured_ ? DumpLog::GetInstance().AddDesc("mainSizeIsMeasured:true")
349                                : DumpLog::GetInstance().AddDesc("mainSizeIsMeasured:false");
350     swiper.usePropertyAnimation_ ? DumpLog::GetInstance().AddDesc("usePropertyAnimation:true")
351                                  : DumpLog::GetInstance().AddDesc("usePropertyAnimation:false");
352     swiper.isUserFinish_ ? DumpLog::GetInstance().AddDesc("isUserFinish:true")
353                          : DumpLog::GetInstance().AddDesc("isUserFinish:false");
354     swiper.isVoluntarilyClear_ ? DumpLog::GetInstance().AddDesc("isVoluntarilyClear:true")
355                                : DumpLog::GetInstance().AddDesc("isVoluntarilyClear:false");
356     swiper.stopIndicatorAnimation_ ? DumpLog::GetInstance().AddDesc("stopIndicatorAnimation:true")
357                                    : DumpLog::GetInstance().AddDesc("stopIndicatorAnimation:false");
358     swiper.isTouchPad_ ? DumpLog::GetInstance().AddDesc("isTouchPad:true")
359                        : DumpLog::GetInstance().AddDesc("isTouchPad:false");
360     swiper.surfaceChangedCallbackId_.has_value()
361         ? DumpLog::GetInstance().AddDesc("surfaceChangedCallbackId:"
362         + std::to_string(swiper.surfaceChangedCallbackId_.value()))
363         : DumpLog::GetInstance().AddDesc("surfaceChangedCallbackId:null");
364     swiper.velocity_.has_value()
365         ? DumpLog::GetInstance().AddDesc("velocity:" + std::to_string(swiper.velocity_.value()))
366         : DumpLog::GetInstance().AddDesc("velocity:null");
367     swiper.GetCurveIncludeMotion()
368         ? DumpLog::GetInstance().AddDesc("curve:" + swiper.GetCurveIncludeMotion()->ToString())
369         : DumpLog::GetInstance().AddDesc("curve:null");
370     DumpLog::GetInstance().AddDesc("currentDelta:" + std::to_string(swiper.currentDelta_));
371     DumpLog::GetInstance().AddDesc("propertyAnimationIndex:" + std::to_string(swiper.propertyAnimationIndex_));
372     DumpLog::GetInstance().AddDesc("mainDeltaSum:" + std::to_string(swiper.mainDeltaSum_));
373 }
374 
GetDotIndicatorStyle(const std::shared_ptr<SwiperParameters> & params)375 std::string SwiperHelper::GetDotIndicatorStyle(const std::shared_ptr<SwiperParameters>& params)
376 {
377     CHECK_NULL_RETURN(params, "");
378     auto jsonValue = JsonUtil::Create(true);
379     jsonValue->Put("left", params->dimLeft.value_or(0.0_vp).ToString().c_str());
380     jsonValue->Put("top", params->dimTop.value_or(0.0_vp).ToString().c_str());
381     jsonValue->Put("right", params->dimRight.value_or(0.0_vp).ToString().c_str());
382     jsonValue->Put("bottom", params->dimBottom.value_or(0.0_vp).ToString().c_str());
383     jsonValue->Put("itemWidth", params->itemWidth.value_or(6.0_vp).ToString().c_str());
384     jsonValue->Put("itemHeight", params->itemHeight.value_or(6.0_vp).ToString().c_str());
385     jsonValue->Put("selectedItemWidth", params->selectedItemWidth.value_or(6.0_vp).ToString().c_str());
386     jsonValue->Put("selectedItemHeight", params->selectedItemHeight.value_or(6.0_vp).ToString().c_str());
387     jsonValue->Put(
388         "selectedColor", params->selectedColorVal.value_or(Color::FromString("#ff007dff")).ColorToString().c_str());
389     jsonValue->Put("color", params->colorVal.value_or(Color::FromString("#19182431")).ColorToString().c_str());
390     jsonValue->Put("mask", params->maskValue.value_or(false) ? "true" : "false");
391     jsonValue->Put(
392         "maxDisplayCount", (params->maxDisplayCountVal.has_value()) ? params->maxDisplayCountVal.value() : 0);
393     return jsonValue->ToString();
394 }
395 
GetDigitIndicatorStyle(const std::shared_ptr<SwiperDigitalParameters> & params)396 std::string SwiperHelper::GetDigitIndicatorStyle(const std::shared_ptr<SwiperDigitalParameters>& params)
397 {
398     CHECK_NULL_RETURN(params, "");
399     auto jsonValue = JsonUtil::Create(true);
400     auto pipeline = PipelineBase::GetCurrentContext();
401     CHECK_NULL_RETURN(pipeline, "");
402     auto theme = pipeline->GetTheme<SwiperIndicatorTheme>();
403     CHECK_NULL_RETURN(theme, "");
404     jsonValue->Put("left", params->dimLeft.value_or(0.0_vp).ToString().c_str());
405     jsonValue->Put("top", params->dimTop.value_or(0.0_vp).ToString().c_str());
406     jsonValue->Put("right", params->dimRight.value_or(0.0_vp).ToString().c_str());
407     jsonValue->Put("bottom", params->dimBottom.value_or(0.0_vp).ToString().c_str());
408     jsonValue->Put(
409         "fontSize", params->fontSize.value_or(theme->GetDigitalIndicatorTextStyle().GetFontSize()).ToString().c_str());
410     jsonValue->Put("fontColor",
411         params->fontColor.value_or(theme->GetDigitalIndicatorTextStyle().GetTextColor()).ColorToString().c_str());
412     jsonValue->Put(
413         "fontWeight", V2::ConvertWrapFontWeightToStirng(params->fontWeight.value_or(FontWeight::NORMAL)).c_str());
414     jsonValue->Put("selectedFontSize",
415         params->selectedFontSize.value_or(theme->GetDigitalIndicatorTextStyle().GetFontSize()).ToString().c_str());
416     jsonValue->Put(
417         "selectedFontColor", params->selectedFontColor.value_or(theme->GetDigitalIndicatorTextStyle().GetTextColor())
418                                  .ColorToString()
419                                  .c_str());
420     jsonValue->Put("selectedFontWeight",
421         V2::ConvertWrapFontWeightToStirng(params->selectedFontWeight.value_or(FontWeight::NORMAL)).c_str());
422     return jsonValue->ToString();
423 }
424 } // namespace OHOS::Ace::NG
425