• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2023 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_ng/pattern/slider/slider_model_ng.h"
17 
18 #include "core/common/resource/resource_parse_utils.h"
19 #include "core/components/slider/slider_theme.h"
20 #include "core/components_ng/base/view_stack_processor.h"
21 #include "core/components_ng/pattern/slider/slider_layout_property.h"
22 #include "core/components_ng/pattern/slider/slider_paint_property.h"
23 #include "core/components_ng/pattern/slider/slider_pattern.h"
24 #include "core/components_ng/pattern/slider/slider_custom_content_options.h"
25 #include "core/components_v2/inspector/inspector_constants.h"
26 #include "core/pipeline/pipeline_base.h"
27 #include "core/pipeline_ng/pipeline_context.h"
28 
29 namespace OHOS::Ace::NG {
30 const float DEFAULT_STEP = 1.0f;
31 const float DEFAULT_MIN_VALUE = 0.0f;
32 const float DEFAULT_MAX_VALUE = 100.0f;
33 constexpr uint32_t BLOCK_COLOR = 0xffffffff;
34 
Create(float value,float step,float min,float max)35 void SliderModelNG::Create(float value, float step, float min, float max)
36 {
37     auto* stack = ViewStackProcessor::GetInstance();
38     auto nodeId = stack->ClaimNodeId();
39     ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::SLIDER_ETS_TAG, nodeId);
40     auto frameNode = FrameNode::GetOrCreateFrameNode(
41         V2::SLIDER_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<SliderPattern>(); });
42     stack->Push(frameNode);
43     ACE_UPDATE_PAINT_PROPERTY(SliderPaintProperty, Step, step);
44     ACE_UPDATE_PAINT_PROPERTY(SliderPaintProperty, Min, min);
45     ACE_UPDATE_PAINT_PROPERTY(SliderPaintProperty, Max, max);
46     SetSliderValue(value);
47 }
48 
SetSliderValue(float value)49 void SliderModelNG::SetSliderValue(float value)
50 {
51     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
52     CHECK_NULL_VOID(frameNode);
53     auto pattern = frameNode->GetPattern<SliderPattern>();
54     CHECK_NULL_VOID(pattern);
55     pattern->UpdateValue(value);
56     auto sliderEventHub = frameNode->GetOrCreateEventHub<SliderEventHub>();
57     CHECK_NULL_VOID(sliderEventHub);
58     sliderEventHub->SetValue(value);
59 }
SetSliderMode(const SliderMode & value)60 void SliderModelNG::SetSliderMode(const SliderMode& value)
61 {
62     ACE_UPDATE_LAYOUT_PROPERTY(SliderLayoutProperty, SliderMode, value);
63     ACE_UPDATE_PAINT_PROPERTY(SliderPaintProperty, SliderMode, value);
64 }
SetDirection(Axis value)65 void SliderModelNG::SetDirection(Axis value)
66 {
67     ACE_UPDATE_LAYOUT_PROPERTY(SliderLayoutProperty, Direction, value);
68     ACE_UPDATE_PAINT_PROPERTY(SliderPaintProperty, Direction, value);
69 }
SetReverse(bool value)70 void SliderModelNG::SetReverse(bool value)
71 {
72     ACE_UPDATE_LAYOUT_PROPERTY(SliderLayoutProperty, Reverse, value);
73     ACE_UPDATE_PAINT_PROPERTY(SliderPaintProperty, Reverse, value);
74 }
SetBlockColor(const Color & value)75 void SliderModelNG::SetBlockColor(const Color& value)
76 {
77     ACE_UPDATE_PAINT_PROPERTY(SliderPaintProperty, BlockColor, value);
78     ACE_UPDATE_PAINT_PROPERTY(SliderPaintProperty, BlockColorSetByUser, true);
79 }
SetTrackBackgroundColor(const Gradient & value,bool isResourceColor)80 void SliderModelNG::SetTrackBackgroundColor(const Gradient& value, bool isResourceColor)
81 {
82     ACE_UPDATE_PAINT_PROPERTY(SliderPaintProperty, TrackBackgroundColor, value);
83     ACE_UPDATE_PAINT_PROPERTY(SliderPaintProperty, TrackBackgroundIsResourceColor, isResourceColor);
84     ACE_UPDATE_PAINT_PROPERTY(SliderPaintProperty, TrackBackgroundColorSetByUser, true);
85 }
SetSelectColor(const Color & value)86 void SliderModelNG::SetSelectColor(const Color& value)
87 {
88     ACE_UPDATE_PAINT_PROPERTY(SliderPaintProperty, SelectColor, value);
89     ACE_UPDATE_PAINT_PROPERTY(SliderPaintProperty, SelectColorSetByUser, true);
90 }
SetSelectColor(const Gradient & value,bool isResourceColor)91 void SliderModelNG::SetSelectColor(const Gradient& value, bool isResourceColor)
92 {
93     ACE_UPDATE_PAINT_PROPERTY(SliderPaintProperty, SelectGradientColor, value);
94     ACE_UPDATE_PAINT_PROPERTY(SliderPaintProperty, SelectIsResourceColor, isResourceColor);
95 }
SetMinLabel(float value)96 void SliderModelNG::SetMinLabel(float value)
97 {
98     ACE_UPDATE_PAINT_PROPERTY(SliderPaintProperty, Min, value);
99 }
SetMaxLabel(float value)100 void SliderModelNG::SetMaxLabel(float value)
101 {
102     ACE_UPDATE_PAINT_PROPERTY(SliderPaintProperty, Max, value);
103 }
SetMinResponsiveDistance(float value)104 void SliderModelNG::SetMinResponsiveDistance(float value)
105 {
106     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
107     CHECK_NULL_VOID(frameNode);
108     auto layoutProperty = frameNode->GetPaintProperty<SliderPaintProperty>();
109     CHECK_NULL_VOID(layoutProperty);
110     auto minResponse = 0.0f;
111     auto minValue = layoutProperty->GetMinValue(0.0f);
112     auto maxValue = layoutProperty->GetMaxValue(100.0f);
113     auto diff = maxValue - minValue;
114     if (LessOrEqual(value, diff) && GreatNotEqual(value, minResponse)) {
115         minResponse = value;
116     }
117     ACE_UPDATE_PAINT_PROPERTY(SliderPaintProperty, MinResponsiveDistance, minResponse);
118 }
119 
SetValidSlideRange(float from,float to)120 void SliderModelNG::SetValidSlideRange(float from, float to)
121 {
122     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
123     SliderModelNG::SetValidSlideRange(frameNode, from, to);
124 }
125 
SetShowSteps(bool value,const std::optional<SliderShowStepOptions> & options)126 void SliderModelNG::SetShowSteps(bool value, const std::optional<SliderShowStepOptions>& options)
127 {
128     ACE_UPDATE_PAINT_PROPERTY(SliderPaintProperty, ShowSteps, value);
129     if (value && options.has_value()) {
130         ACE_UPDATE_PAINT_PROPERTY(SliderPaintProperty, SliderShowStepOptions, options.value());
131     }
132 }
SetSliderInteractionMode(SliderInteraction mode)133 void SliderModelNG::SetSliderInteractionMode(SliderInteraction mode)
134 {
135     ACE_UPDATE_PAINT_PROPERTY(SliderPaintProperty, SliderInteractionMode, mode);
136 }
SetShowTips(bool value,const std::optional<std::string> & content)137 void SliderModelNG::SetShowTips(bool value, const std::optional<std::string>& content)
138 {
139     ACE_UPDATE_PAINT_PROPERTY(SliderPaintProperty, ShowTips, value);
140     if (content.has_value()) {
141         ACE_UPDATE_PAINT_PROPERTY(SliderPaintProperty, CustomContent, content.value());
142     } else {
143         ACE_RESET_PAINT_PROPERTY_WITH_FLAG(SliderPaintProperty, CustomContent, PROPERTY_UPDATE_RENDER);
144     }
145 }
SetThickness(const Dimension & value)146 void SliderModelNG::SetThickness(const Dimension& value)
147 {
148     if (value.IsNonPositive()) {
149         auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
150         CHECK_NULL_VOID(frameNode);
151         auto layoutProperty = frameNode->GetLayoutProperty<SliderLayoutProperty>();
152         CHECK_NULL_VOID(layoutProperty);
153         auto pipeline = frameNode->GetContext();
154         CHECK_NULL_VOID(pipeline);
155         auto theme = pipeline->GetTheme<SliderTheme>();
156         CHECK_NULL_VOID(theme);
157         auto sliderMode = layoutProperty->GetSliderModeValue(SliderModel::SliderMode::OUTSET);
158         Dimension themeTrackThickness;
159         if (sliderMode == SliderModel::SliderMode::OUTSET) {
160             themeTrackThickness = theme->GetOutsetTrackThickness();
161         } else if (sliderMode == SliderModel::SliderMode::INSET) {
162             themeTrackThickness = theme->GetInsetTrackThickness();
163         } else {
164             themeTrackThickness = theme->GetNoneTrackThickness();
165         }
166         ACE_UPDATE_LAYOUT_PROPERTY(SliderLayoutProperty, Thickness, themeTrackThickness);
167     } else {
168         ACE_UPDATE_LAYOUT_PROPERTY(SliderLayoutProperty, Thickness, value);
169     }
170 }
SetBlockBorderColor(const Color & value)171 void SliderModelNG::SetBlockBorderColor(const Color& value)
172 {
173     ACE_UPDATE_PAINT_PROPERTY(SliderPaintProperty, BlockBorderColor, value);
174     ACE_UPDATE_PAINT_PROPERTY(SliderPaintProperty, BlockBorderColorSetByUser, true);
175 }
SetBlockBorderWidth(const Dimension & value)176 void SliderModelNG::SetBlockBorderWidth(const Dimension& value)
177 {
178     ACE_UPDATE_PAINT_PROPERTY(SliderPaintProperty, BlockBorderWidth, value);
179 }
SetStepColor(const Color & value)180 void SliderModelNG::SetStepColor(const Color& value)
181 {
182     ACE_UPDATE_PAINT_PROPERTY(SliderPaintProperty, StepColor, value);
183     ACE_UPDATE_PAINT_PROPERTY(SliderPaintProperty, StepColorSetByUser, true);
184 }
SetTrackBorderRadius(const Dimension & value)185 void SliderModelNG::SetTrackBorderRadius(const Dimension& value)
186 {
187     ACE_UPDATE_PAINT_PROPERTY(SliderPaintProperty, TrackBorderRadius, value);
188 }
SetSelectedBorderRadius(const Dimension & value)189 void SliderModelNG::SetSelectedBorderRadius(const Dimension& value)
190 {
191     ACE_UPDATE_PAINT_PROPERTY(SliderPaintProperty, SelectedBorderRadius, value);
192 }
SetBlockSize(const Dimension & width,const Dimension & height)193 void SliderModelNG::SetBlockSize(const Dimension& width, const Dimension& height)
194 {
195     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
196     CHECK_NULL_VOID(frameNode);
197     auto layoutProperty = frameNode->GetLayoutProperty<SliderLayoutProperty>();
198     CHECK_NULL_VOID(layoutProperty);
199     auto pipeline = PipelineBase::GetCurrentContext();
200     CHECK_NULL_VOID(pipeline);
201     SizeT<Dimension> blockSize;
202     auto theme = pipeline->GetTheme<SliderTheme>();
203     if (theme != nullptr) {
204         auto mode = layoutProperty->GetSliderModeValue(SliderMode::OUTSET);
205         auto themeBlockSize = mode == SliderMode::OUTSET ? theme->GetOutsetBlockSize() : theme->GetInsetBlockSize();
206         blockSize = layoutProperty->GetBlockSizeValue(SizeT<Dimension>(themeBlockSize, themeBlockSize));
207     }
208 
209     if (LessOrEqual(width.Value(), 0.0) || LessOrEqual(height.Value(), 0.0)) {
210         ResetBlockSize();
211     } else {
212         blockSize.SetWidth(width);
213         blockSize.SetHeight(height);
214         ACE_UPDATE_LAYOUT_PROPERTY(SliderLayoutProperty, BlockSize, blockSize);
215     }
216 }
SetBlockType(BlockStyleType value)217 void SliderModelNG::SetBlockType(BlockStyleType value)
218 {
219     ACE_UPDATE_PAINT_PROPERTY(SliderPaintProperty, BlockType, value);
220 }
SetBlockImage(const std::string & value,const std::string & bundleName,const std::string & moduleName)221 void SliderModelNG::SetBlockImage(
222     const std::string& value, const std::string& bundleName, const std::string& moduleName)
223 {
224     ACE_UPDATE_PAINT_PROPERTY(SliderPaintProperty, BlockImage, value);
225     ACE_UPDATE_PAINT_PROPERTY(SliderPaintProperty, BlockImageBundleName, bundleName);
226     ACE_UPDATE_PAINT_PROPERTY(SliderPaintProperty, BlockImageModuleName, moduleName);
227 }
SetBlockShape(const RefPtr<BasicShape> & value)228 void SliderModelNG::SetBlockShape(const RefPtr<BasicShape>& value)
229 {
230     ACE_UPDATE_PAINT_PROPERTY(SliderPaintProperty, BlockShape, value);
231 }
SetStepSize(const Dimension & value)232 void SliderModelNG::SetStepSize(const Dimension& value)
233 {
234     ACE_UPDATE_PAINT_PROPERTY(SliderPaintProperty, StepSize, value);
235 }
SetPrefix(const RefPtr<UINode> & content,const NG::SliderPrefixOptions & options)236 void SliderModelNG::SetPrefix(const RefPtr<UINode>& content, const NG::SliderPrefixOptions& options)
237 {
238     auto* frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
239     CHECK_NULL_VOID(frameNode);
240     auto pattern = frameNode->GetPattern<SliderPattern>();
241     CHECK_NULL_VOID(pattern);
242     pattern->SetPrefix(content, options);
243 }
SetSuffix(const RefPtr<UINode> & content,const NG::SliderSuffixOptions & options)244 void SliderModelNG::SetSuffix(const RefPtr<UINode>& content, const NG::SliderSuffixOptions& options)
245 {
246     auto* frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
247     CHECK_NULL_VOID(frameNode);
248     auto pattern = frameNode->GetPattern<SliderPattern>();
249     CHECK_NULL_VOID(pattern);
250     pattern->SetSuffix(content, options);
251 }
SetPrefix(FrameNode * frameNode,const RefPtr<UINode> & content,const NG::SliderPrefixOptions & options)252 void SliderModelNG::SetPrefix(
253     FrameNode* frameNode, const RefPtr<UINode>& content, const NG::SliderPrefixOptions& options)
254 {
255     CHECK_NULL_VOID(frameNode);
256     auto pattern = frameNode->GetPattern<SliderPattern>();
257     CHECK_NULL_VOID(pattern);
258     pattern->SetPrefix(content, options);
259 }
SetSuffix(FrameNode * frameNode,const RefPtr<UINode> & content,const NG::SliderSuffixOptions & options)260 void SliderModelNG::SetSuffix(
261     FrameNode* frameNode, const RefPtr<UINode>& content, const NG::SliderSuffixOptions& options)
262 {
263     CHECK_NULL_VOID(frameNode);
264     auto pattern = frameNode->GetPattern<SliderPattern>();
265     CHECK_NULL_VOID(pattern);
266     pattern->SetSuffix(content, options);
267 }
268 #ifdef SUPPORT_DIGITAL_CROWN
SetDigitalCrownSensitivity(CrownSensitivity sensitivity)269 void SliderModelNG::SetDigitalCrownSensitivity(CrownSensitivity sensitivity)
270 {
271     ACE_UPDATE_PAINT_PROPERTY(SliderPaintProperty, DigitalCrownSensitivity, sensitivity);
272 }
273 #endif
SetOnChange(SliderOnChangeEvent && eventOnChange)274 void SliderModelNG::SetOnChange(SliderOnChangeEvent&& eventOnChange)
275 {
276     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
277     CHECK_NULL_VOID(frameNode);
278     auto eventHub = frameNode->GetOrCreateEventHub<SliderEventHub>();
279     CHECK_NULL_VOID(eventHub);
280     eventHub->SetOnChange(std::move(eventOnChange));
281 }
282 
SetOnChangeEvent(SliderOnValueChangeEvent && onChangeEvent)283 void SliderModelNG::SetOnChangeEvent(SliderOnValueChangeEvent&& onChangeEvent)
284 {
285     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
286     CHECK_NULL_VOID(frameNode);
287     auto eventHub = frameNode->GetOrCreateEventHub<SliderEventHub>();
288     CHECK_NULL_VOID(eventHub);
289     eventHub->SetOnChangeEvent(std::move(onChangeEvent));
290 }
291 
ResetBlockBorderColor()292 void SliderModelNG::ResetBlockBorderColor()
293 {
294     ACE_RESET_PAINT_PROPERTY_WITH_FLAG(SliderPaintProperty, BlockBorderColor, PROPERTY_UPDATE_RENDER);
295 }
296 
ResetBlockBorderWidth()297 void SliderModelNG::ResetBlockBorderWidth()
298 {
299     ACE_RESET_PAINT_PROPERTY_WITH_FLAG(SliderPaintProperty, BlockBorderWidth, PROPERTY_UPDATE_RENDER);
300 }
301 
ResetStepColor()302 void SliderModelNG::ResetStepColor()
303 {
304     ACE_RESET_PAINT_PROPERTY_WITH_FLAG(SliderPaintProperty, StepColor, PROPERTY_UPDATE_RENDER);
305 }
306 
ResetTrackBorderRadius()307 void SliderModelNG::ResetTrackBorderRadius()
308 {
309     ACE_RESET_PAINT_PROPERTY_WITH_FLAG(SliderPaintProperty, TrackBorderRadius, PROPERTY_UPDATE_RENDER);
310 }
311 
ResetSelectedBorderRadius()312 void SliderModelNG::ResetSelectedBorderRadius()
313 {
314     ACE_RESET_PAINT_PROPERTY_WITH_FLAG(SliderPaintProperty, SelectedBorderRadius, PROPERTY_UPDATE_RENDER);
315 }
316 
ResetBlockSize()317 void SliderModelNG::ResetBlockSize()
318 {
319     ACE_RESET_LAYOUT_PROPERTY_WITH_FLAG(SliderLayoutProperty, BlockSize, PROPERTY_UPDATE_MEASURE);
320 }
321 
ResetBlockType()322 void SliderModelNG::ResetBlockType()
323 {
324     ACE_RESET_PAINT_PROPERTY_WITH_FLAG(SliderPaintProperty, BlockType, PROPERTY_UPDATE_RENDER);
325 }
326 
ResetBlockImage()327 void SliderModelNG::ResetBlockImage()
328 {
329     ACE_RESET_PAINT_PROPERTY_WITH_FLAG(SliderPaintProperty, BlockImage, PROPERTY_UPDATE_RENDER);
330     ACE_RESET_PAINT_PROPERTY_WITH_FLAG(SliderPaintProperty, BlockImageBundleName, PROPERTY_UPDATE_RENDER);
331     ACE_RESET_PAINT_PROPERTY_WITH_FLAG(SliderPaintProperty, BlockImageModuleName, PROPERTY_UPDATE_RENDER);
332 }
333 
ResetBlockShape()334 void SliderModelNG::ResetBlockShape()
335 {
336     ACE_RESET_PAINT_PROPERTY_WITH_FLAG(SliderPaintProperty, BlockShape, PROPERTY_UPDATE_RENDER);
337 }
338 
ResetStepSize()339 void SliderModelNG::ResetStepSize()
340 {
341     ACE_RESET_PAINT_PROPERTY_WITH_FLAG(SliderPaintProperty, StepSize, PROPERTY_UPDATE_RENDER);
342 }
343 
ResetSliderInteractionMode()344 void SliderModelNG::ResetSliderInteractionMode()
345 {
346     ACE_RESET_PAINT_PROPERTY_WITH_FLAG(SliderPaintProperty, SliderInteractionMode, PROPERTY_UPDATE_RENDER);
347 }
348 
ResetMinResponsiveDistance()349 void SliderModelNG::ResetMinResponsiveDistance()
350 {
351     ACE_RESET_PAINT_PROPERTY_WITH_FLAG(SliderPaintProperty, MinResponsiveDistance, PROPERTY_UPDATE_RENDER);
352 }
353 
ResetValidSlideRange()354 void SliderModelNG::ResetValidSlideRange()
355 {
356     ACE_RESET_PAINT_PROPERTY_WITH_FLAG(SliderPaintProperty, ValidSlideRange, PROPERTY_UPDATE_RENDER);
357 }
358 
359 #ifdef SUPPORT_DIGITAL_CROWN
ResetDigitalCrownSensitivity()360 void SliderModelNG::ResetDigitalCrownSensitivity()
361 {
362     ACE_RESET_PAINT_PROPERTY_WITH_FLAG(SliderPaintProperty, DigitalCrownSensitivity, PROPERTY_UPDATE_RENDER);
363 }
364 
ResetDigitalCrownSensitivity(FrameNode * frameNode)365 void SliderModelNG::ResetDigitalCrownSensitivity(FrameNode* frameNode)
366 {
367     ACE_RESET_NODE_PAINT_PROPERTY_WITH_FLAG(
368         SliderPaintProperty, DigitalCrownSensitivity, PROPERTY_UPDATE_RENDER, frameNode);
369 }
370 #endif
371 
SetShowTips(FrameNode * frameNode,bool value,const std::optional<std::string> & content)372 void SliderModelNG::SetShowTips(FrameNode* frameNode, bool value, const std::optional<std::string>& content)
373 {
374     ACE_UPDATE_NODE_PAINT_PROPERTY(SliderPaintProperty, ShowTips, value, frameNode);
375     if (content.has_value()) {
376         ACE_UPDATE_NODE_PAINT_PROPERTY(SliderPaintProperty, CustomContent, content.value(), frameNode);
377     } else {
378         ACE_RESET_NODE_PAINT_PROPERTY_WITH_FLAG(SliderPaintProperty, CustomContent, PROPERTY_UPDATE_RENDER, frameNode);
379     }
380 }
381 
SetThickness(FrameNode * frameNode,const Dimension & value)382 void SliderModelNG::SetThickness(FrameNode* frameNode, const Dimension& value)
383 {
384     if (value.IsNonPositive()) {
385         CHECK_NULL_VOID(frameNode);
386         auto layoutProperty = frameNode->GetLayoutProperty<SliderLayoutProperty>();
387         CHECK_NULL_VOID(layoutProperty);
388         auto pipeline = frameNode->GetContext();
389         CHECK_NULL_VOID(pipeline);
390         auto theme = pipeline->GetTheme<SliderTheme>();
391         CHECK_NULL_VOID(theme);
392         auto sliderMode = layoutProperty->GetSliderModeValue(SliderModel::SliderMode::OUTSET);
393         Dimension themeTrackThickness;
394         if (sliderMode == SliderModel::SliderMode::OUTSET) {
395             themeTrackThickness = theme->GetOutsetTrackThickness();
396         } else if (sliderMode == SliderModel::SliderMode::INSET) {
397             themeTrackThickness = theme->GetInsetTrackThickness();
398         } else {
399             themeTrackThickness = theme->GetNoneTrackThickness();
400         }
401         ACE_UPDATE_NODE_LAYOUT_PROPERTY(SliderLayoutProperty, Thickness, themeTrackThickness, frameNode);
402     } else {
403         ACE_UPDATE_NODE_LAYOUT_PROPERTY(SliderLayoutProperty, Thickness, value, frameNode);
404     }
405 }
SetStepSize(FrameNode * frameNode,const Dimension & value)406 void SliderModelNG::SetStepSize(FrameNode* frameNode, const Dimension& value)
407 {
408     ACE_UPDATE_NODE_PAINT_PROPERTY(SliderPaintProperty, StepSize, value, frameNode);
409 }
SetBlockType(FrameNode * frameNode,BlockStyleType value)410 void SliderModelNG::SetBlockType(FrameNode* frameNode, BlockStyleType value)
411 {
412     ACE_UPDATE_NODE_PAINT_PROPERTY(SliderPaintProperty, BlockType, value, frameNode);
413 }
SetBlockShape(FrameNode * frameNode,const RefPtr<BasicShape> & value)414 void SliderModelNG::SetBlockShape(FrameNode* frameNode, const RefPtr<BasicShape>& value)
415 {
416     ACE_UPDATE_NODE_PAINT_PROPERTY(SliderPaintProperty, BlockShape, value, frameNode);
417 }
SetBlockSize(FrameNode * frameNode,const Dimension & width,const Dimension & height)418 void SliderModelNG::SetBlockSize(FrameNode* frameNode, const Dimension& width, const Dimension& height)
419 {
420     CHECK_NULL_VOID(frameNode);
421     auto layoutProperty = frameNode->GetLayoutProperty<SliderLayoutProperty>();
422     CHECK_NULL_VOID(layoutProperty);
423     auto pipeline = frameNode->GetContext();
424     CHECK_NULL_VOID(pipeline);
425     SizeT<Dimension> blockSize;
426     auto theme = pipeline->GetTheme<SliderTheme>();
427     if (theme != nullptr) {
428         auto mode = layoutProperty->GetSliderModeValue(SliderMode::OUTSET);
429         auto themeBlockSize = mode == SliderMode::OUTSET ? theme->GetOutsetBlockSize() : theme->GetInsetBlockSize();
430         blockSize = layoutProperty->GetBlockSizeValue(SizeT<Dimension>(themeBlockSize, themeBlockSize));
431     }
432 
433     if (LessOrEqual(width.Value(), 0.0) || LessOrEqual(height.Value(), 0.0)) {
434         ResetBlockSize(frameNode);
435     } else {
436         blockSize.SetWidth(width);
437         blockSize.SetHeight(height);
438         ACE_UPDATE_NODE_LAYOUT_PROPERTY(SliderLayoutProperty, BlockSize, blockSize, frameNode);
439     }
440 }
SetTrackBorderRadius(FrameNode * frameNode,const Dimension & value)441 void SliderModelNG::SetTrackBorderRadius(FrameNode* frameNode, const Dimension& value)
442 {
443     ACE_UPDATE_NODE_PAINT_PROPERTY(SliderPaintProperty, TrackBorderRadius, value, frameNode);
444 }
SetStepColor(FrameNode * frameNode,const Color & value)445 void SliderModelNG::SetStepColor(FrameNode* frameNode, const Color& value)
446 {
447     ACE_UPDATE_NODE_PAINT_PROPERTY(SliderPaintProperty, StepColor, value, frameNode);
448     ACE_UPDATE_NODE_PAINT_PROPERTY(SliderPaintProperty, StepColorSetByUser, true, frameNode);
449 }
SetBlockBorderColor(FrameNode * frameNode,const Color & value)450 void SliderModelNG::SetBlockBorderColor(FrameNode* frameNode, const Color& value)
451 {
452     ACE_UPDATE_NODE_PAINT_PROPERTY(SliderPaintProperty, BlockBorderColor, value, frameNode);
453     ACE_UPDATE_NODE_PAINT_PROPERTY(SliderPaintProperty, BlockBorderColorSetByUser, true, frameNode);
454 }
SetBlockBorderWidth(FrameNode * frameNode,const Dimension & value)455 void SliderModelNG::SetBlockBorderWidth(FrameNode* frameNode, const Dimension& value)
456 {
457     ACE_UPDATE_NODE_PAINT_PROPERTY(SliderPaintProperty, BlockBorderWidth, value, frameNode);
458 }
SetBlockColor(FrameNode * frameNode,const Color & value)459 void SliderModelNG::SetBlockColor(FrameNode* frameNode, const Color& value)
460 {
461     ACE_UPDATE_NODE_PAINT_PROPERTY(SliderPaintProperty, BlockColor, value, frameNode);
462     ACE_UPDATE_NODE_PAINT_PROPERTY(SliderPaintProperty, BlockColorSetByUser, true, frameNode);
463 }
SetTrackBackgroundColor(FrameNode * frameNode,const Gradient & value,bool isResourceColor)464 void SliderModelNG::SetTrackBackgroundColor(FrameNode* frameNode, const Gradient& value, bool isResourceColor)
465 {
466     ACE_UPDATE_NODE_PAINT_PROPERTY(SliderPaintProperty, TrackBackgroundColor, value, frameNode);
467     ACE_UPDATE_NODE_PAINT_PROPERTY(SliderPaintProperty, TrackBackgroundIsResourceColor, isResourceColor, frameNode);
468     ACE_UPDATE_NODE_PAINT_PROPERTY(SliderPaintProperty, TrackBackgroundColorSetByUser, true, frameNode);
469 }
SetSelectColor(FrameNode * frameNode,const Gradient & value,bool isResourceColor)470 void SliderModelNG::SetSelectColor(FrameNode* frameNode, const Gradient& value, bool isResourceColor)
471 {
472     ACE_UPDATE_NODE_PAINT_PROPERTY(SliderPaintProperty, SelectGradientColor, value, frameNode);
473     ACE_UPDATE_NODE_PAINT_PROPERTY(SliderPaintProperty, SelectIsResourceColor, isResourceColor, frameNode);
474     ACE_UPDATE_NODE_PAINT_PROPERTY(SliderPaintProperty, SelectColorSetByUser, true, frameNode);
475 }
SetShowSteps(FrameNode * frameNode,bool value,const std::optional<SliderShowStepOptions> & options)476 void SliderModelNG::SetShowSteps(
477     FrameNode* frameNode, bool value, const std::optional<SliderShowStepOptions>& options)
478 {
479     ACE_UPDATE_NODE_PAINT_PROPERTY(SliderPaintProperty, ShowSteps, value, frameNode);
480     if (value && options.has_value()) {
481         ACE_UPDATE_NODE_PAINT_PROPERTY(SliderPaintProperty, SliderShowStepOptions, options.value(), frameNode);
482     }
483 }
SetSliderInteractionMode(FrameNode * frameNode,SliderInteraction mode)484 void SliderModelNG::SetSliderInteractionMode(FrameNode* frameNode, SliderInteraction mode)
485 {
486     ACE_UPDATE_NODE_PAINT_PROPERTY(SliderPaintProperty, SliderInteractionMode, mode, frameNode);
487 }
SetMinResponsiveDistance(FrameNode * frameNode,float value)488 void SliderModelNG::SetMinResponsiveDistance(FrameNode* frameNode, float value)
489 {
490     CHECK_NULL_VOID(frameNode);
491     auto layoutProperty = frameNode->GetPaintProperty<SliderPaintProperty>();
492     CHECK_NULL_VOID(layoutProperty);
493     auto minResponse = 0.0f;
494     auto minValue = layoutProperty->GetMinValue(0.0f);
495     auto maxValue = layoutProperty->GetMaxValue(100.0f);
496     auto diff = maxValue - minValue;
497     if (LessOrEqual(value, diff) && GreatOrEqual(value, minResponse)) {
498         minResponse = value;
499     }
500     ACE_UPDATE_NODE_PAINT_PROPERTY(SliderPaintProperty, MinResponsiveDistance, minResponse, frameNode);
501 }
502 
503 #ifdef SUPPORT_DIGITAL_CROWN
SetDigitalCrownSensitivity(FrameNode * frameNode,CrownSensitivity sensitivity)504 void SliderModelNG::SetDigitalCrownSensitivity(FrameNode* frameNode, CrownSensitivity sensitivity)
505 {
506     ACE_UPDATE_NODE_PAINT_PROPERTY(SliderPaintProperty, DigitalCrownSensitivity, sensitivity, frameNode);
507 }
508 #endif
509 
SetBlockImage(FrameNode * frameNode,const std::string & value,const std::string & bundleName,const std::string & moduleName)510 void SliderModelNG::SetBlockImage(
511     FrameNode* frameNode, const std::string& value, const std::string& bundleName, const std::string& moduleName)
512 {
513     ACE_UPDATE_NODE_PAINT_PROPERTY(SliderPaintProperty, BlockImage, value, frameNode);
514     ACE_UPDATE_NODE_PAINT_PROPERTY(SliderPaintProperty, BlockImageBundleName, bundleName, frameNode);
515     ACE_UPDATE_NODE_PAINT_PROPERTY(SliderPaintProperty, BlockImageModuleName, moduleName, frameNode);
516 }
517 
ResetStepSize(FrameNode * frameNode)518 void SliderModelNG::ResetStepSize(FrameNode* frameNode)
519 {
520     ACE_RESET_NODE_PAINT_PROPERTY_WITH_FLAG(SliderPaintProperty, StepSize, PROPERTY_UPDATE_RENDER, frameNode);
521 }
522 
ResetBlockType(FrameNode * frameNode)523 void SliderModelNG::ResetBlockType(FrameNode* frameNode)
524 {
525     ACE_RESET_NODE_PAINT_PROPERTY(SliderPaintProperty, BlockType, frameNode);
526 }
527 
ResetBlockShape(FrameNode * frameNode)528 void SliderModelNG::ResetBlockShape(FrameNode* frameNode)
529 {
530     ACE_RESET_NODE_PAINT_PROPERTY_WITH_FLAG(SliderPaintProperty, BlockShape, PROPERTY_UPDATE_RENDER, frameNode);
531 }
532 
ResetBlockSize(FrameNode * frameNode)533 void SliderModelNG::ResetBlockSize(FrameNode* frameNode)
534 {
535     ACE_RESET_NODE_LAYOUT_PROPERTY_WITH_FLAG(SliderLayoutProperty, BlockSize, PROPERTY_UPDATE_MEASURE, frameNode);
536 }
537 
ResetTrackBorderRadius(FrameNode * frameNode)538 void SliderModelNG::ResetTrackBorderRadius(FrameNode* frameNode)
539 {
540     ACE_RESET_NODE_PAINT_PROPERTY_WITH_FLAG(SliderPaintProperty, TrackBorderRadius, PROPERTY_UPDATE_RENDER, frameNode);
541 }
542 
ResetStepColor(FrameNode * frameNode)543 void SliderModelNG::ResetStepColor(FrameNode* frameNode)
544 {
545     ACE_RESET_NODE_PAINT_PROPERTY_WITH_FLAG(SliderPaintProperty, StepColor, PROPERTY_UPDATE_RENDER, frameNode);
546 }
547 
ResetBlockBorderColor(FrameNode * frameNode)548 void SliderModelNG::ResetBlockBorderColor(FrameNode* frameNode)
549 {
550     ACE_RESET_NODE_PAINT_PROPERTY_WITH_FLAG(SliderPaintProperty, BlockBorderColor, PROPERTY_UPDATE_RENDER, frameNode);
551 }
552 
ResetBlockBorderWidth(FrameNode * frameNode)553 void SliderModelNG::ResetBlockBorderWidth(FrameNode* frameNode)
554 {
555     ACE_RESET_NODE_PAINT_PROPERTY_WITH_FLAG(SliderPaintProperty, BlockBorderWidth, PROPERTY_UPDATE_RENDER, frameNode);
556 }
557 
ResetBlockColor(FrameNode * frameNode)558 void SliderModelNG::ResetBlockColor(FrameNode* frameNode)
559 {
560     ACE_RESET_NODE_PAINT_PROPERTY_WITH_FLAG(SliderPaintProperty, BlockColor, PROPERTY_UPDATE_RENDER, frameNode);
561 }
562 
ResetBlockImage(FrameNode * frameNode)563 void SliderModelNG::ResetBlockImage(FrameNode* frameNode)
564 {
565     ACE_RESET_NODE_PAINT_PROPERTY_WITH_FLAG(
566         SliderPaintProperty, BlockImage, PROPERTY_UPDATE_RENDER, frameNode);
567     ACE_RESET_NODE_PAINT_PROPERTY_WITH_FLAG(
568         SliderPaintProperty, BlockImageBundleName, PROPERTY_UPDATE_RENDER, frameNode);
569     ACE_RESET_NODE_PAINT_PROPERTY_WITH_FLAG(
570         SliderPaintProperty, BlockImageModuleName, PROPERTY_UPDATE_RENDER, frameNode);
571 }
572 
ResetValidSlideRange(FrameNode * frameNode)573 void SliderModelNG::ResetValidSlideRange(FrameNode* frameNode)
574 {
575     ACE_RESET_NODE_PAINT_PROPERTY_WITH_FLAG(SliderPaintProperty, ValidSlideRange, PROPERTY_UPDATE_RENDER, frameNode);
576 }
577 
ResetPrefix(FrameNode * frameNode)578 void SliderModelNG::ResetPrefix(FrameNode* frameNode)
579 {
580     CHECK_NULL_VOID(frameNode);
581     auto pattern = frameNode->GetPattern<SliderPattern>();
582     CHECK_NULL_VOID(pattern);
583     pattern->ResetPrefix();
584 }
585 
ResetSuffix(FrameNode * frameNode)586 void SliderModelNG::ResetSuffix(FrameNode* frameNode)
587 {
588     CHECK_NULL_VOID(frameNode);
589     auto pattern = frameNode->GetPattern<SliderPattern>();
590     CHECK_NULL_VOID(pattern);
591     pattern->ResetSuffix();
592 }
593 
CreateFrameNode(int32_t nodeId)594 RefPtr<FrameNode> SliderModelNG::CreateFrameNode(int32_t nodeId)
595 {
596     auto frameNode = FrameNode::GetOrCreateFrameNode(
597         V2::SLIDER_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<SliderPattern>(); });
598 
599     SetMinLabel(AceType::RawPtr(frameNode), DEFAULT_MIN_VALUE);
600     SetMaxLabel(AceType::RawPtr(frameNode), DEFAULT_MAX_VALUE);
601     SetStep(AceType::RawPtr(frameNode), DEFAULT_STEP);
602     SetSliderValue(AceType::RawPtr(frameNode), DEFAULT_MIN_VALUE);
603 
604     return frameNode;
605 }
606 
SetOnChange(FrameNode * frameNode,SliderOnChangeEvent && eventOnChange)607 void SliderModelNG::SetOnChange(FrameNode* frameNode, SliderOnChangeEvent&& eventOnChange)
608 {
609     CHECK_NULL_VOID(frameNode);
610     auto eventHub = frameNode->GetOrCreateEventHub<SliderEventHub>();
611     CHECK_NULL_VOID(eventHub);
612     eventHub->SetOnChange(std::move(eventOnChange));
613 }
614 
SetSliderValue(FrameNode * frameNode,float value)615 void SliderModelNG::SetSliderValue(FrameNode* frameNode, float value)
616 {
617     CHECK_NULL_VOID(frameNode);
618     auto pattern = frameNode->GetPattern<SliderPattern>();
619     CHECK_NULL_VOID(pattern);
620     pattern->UpdateValue(value);
621 }
622 
SetMinLabel(FrameNode * frameNode,float value)623 void SliderModelNG::SetMinLabel(FrameNode* frameNode, float value)
624 {
625     ACE_UPDATE_NODE_PAINT_PROPERTY(SliderPaintProperty, Min, value, frameNode);
626 }
SetMaxLabel(FrameNode * frameNode,float value)627 void SliderModelNG::SetMaxLabel(FrameNode* frameNode, float value)
628 {
629     ACE_UPDATE_NODE_PAINT_PROPERTY(SliderPaintProperty, Max, value, frameNode);
630 }
631 
SetSliderMode(FrameNode * frameNode,const SliderMode & value)632 void SliderModelNG::SetSliderMode(FrameNode* frameNode, const SliderMode& value)
633 {
634     ACE_UPDATE_NODE_LAYOUT_PROPERTY(SliderLayoutProperty, SliderMode, value, frameNode);
635     ACE_UPDATE_NODE_PAINT_PROPERTY(SliderPaintProperty, SliderMode, value, frameNode);
636 }
SetDirection(FrameNode * frameNode,Axis value)637 void SliderModelNG::SetDirection(FrameNode* frameNode, Axis value)
638 {
639     ACE_UPDATE_NODE_LAYOUT_PROPERTY(SliderLayoutProperty, Direction, value, frameNode);
640     ACE_UPDATE_NODE_PAINT_PROPERTY(SliderPaintProperty, Direction, value, frameNode);
641 }
SetReverse(FrameNode * frameNode,bool value)642 void SliderModelNG::SetReverse(FrameNode* frameNode, bool value)
643 {
644     ACE_UPDATE_NODE_LAYOUT_PROPERTY(SliderLayoutProperty, Reverse, value, frameNode);
645     ACE_UPDATE_NODE_PAINT_PROPERTY(SliderPaintProperty, Reverse, value, frameNode);
646 }
SetStep(FrameNode * frameNode,float value)647 void SliderModelNG::SetStep(FrameNode* frameNode, float value)
648 {
649     ACE_UPDATE_NODE_PAINT_PROPERTY(SliderPaintProperty, Step, value, frameNode);
650 }
651 
SetValidSlideRange(FrameNode * frameNode,float from,float to)652 void SliderModelNG::SetValidSlideRange(FrameNode* frameNode, float from, float to)
653 {
654     if (std::isnan(from) || std::isnan(to)) {
655         return SliderModelNG::ResetValidSlideRange(frameNode);
656     }
657     CHECK_NULL_VOID(frameNode);
658     auto paintProperty = frameNode->GetPaintProperty<SliderPaintProperty>();
659     CHECK_NULL_VOID(paintProperty);
660     auto minValue = paintProperty->GetMinValue(0.0f);
661     auto maxValue = paintProperty->GetMaxValue(100.0f);
662     auto step = paintProperty->GetStepValue(1.0f);
663     float fromValue = minValue;
664     float toValue = maxValue;
665     if (std::isfinite(from)) {
666         fromValue = from;
667     }
668     if (std::isfinite(to)) {
669         toValue = to;
670     }
671     if (GreatOrEqual(fromValue, minValue) && LessOrEqual(toValue, maxValue) && LessOrEqual(fromValue, toValue) &&
672         GreatNotEqual(step, 0.0f)) {
673         auto toValueCorrection = NearEqual(toValue - step * std::floor(toValue / step), 0) ? 0 : 1;
674         fromValue = LessOrEqual(fromValue, minValue) ? minValue : std::floor(fromValue / step) * step;
675         toValue = GreatOrEqual(toValue, maxValue) ?
676                   maxValue : (std::floor(toValue / step) + toValueCorrection) * step;
677         auto sliderValue = std::clamp(paintProperty->GetValueValue(fromValue), fromValue, toValue);
678         RefPtr<SliderModel::SliderValidRange> rangeValue =
679             AceType::MakeRefPtr<SliderModel::SliderValidRange>(fromValue, toValue);
680         ACE_UPDATE_NODE_PAINT_PROPERTY(SliderPaintProperty, Value, sliderValue, frameNode);
681         ACE_UPDATE_NODE_PAINT_PROPERTY(SliderPaintProperty, ValidSlideRange, rangeValue, frameNode);
682     } else {
683         SliderModelNG::ResetValidSlideRange(frameNode);
684     }
685 }
686 
GetBlockColor(FrameNode * frameNode)687 Color SliderModelNG::GetBlockColor(FrameNode* frameNode)
688 {
689     Color value;
690     ACE_GET_NODE_PAINT_PROPERTY_WITH_DEFAULT_VALUE(
691         SliderPaintProperty, BlockColor, value, frameNode, Color(BLOCK_COLOR));
692     return value;
693 }
694 
GetTrackBackgroundColor(FrameNode * frameNode)695 Gradient SliderModelNG::GetTrackBackgroundColor(FrameNode* frameNode)
696 {
697     Gradient value;
698     CHECK_NULL_RETURN(frameNode, value);
699     auto pipelineContext = frameNode->GetContext();
700     CHECK_NULL_RETURN(pipelineContext, value);
701     auto theme = pipelineContext->GetTheme<SliderTheme>();
702     CHECK_NULL_RETURN(theme, value);
703     ACE_GET_NODE_PAINT_PROPERTY_WITH_DEFAULT_VALUE(
704         SliderPaintProperty, TrackBackgroundColor, value, frameNode,
705         SliderModelNG::CreateSolidGradient(Color(theme->GetTrackBgColor())));
706     return value;
707 }
708 
GetSelectColor(FrameNode * frameNode)709 Gradient SliderModelNG::GetSelectColor(FrameNode* frameNode)
710 {
711     Gradient value;
712     CHECK_NULL_RETURN(frameNode, value);
713     auto pipelineContext = frameNode->GetContext();
714     CHECK_NULL_RETURN(pipelineContext, value);
715     auto theme = pipelineContext->GetTheme<SliderTheme>();
716     CHECK_NULL_RETURN(theme, value);
717     ACE_GET_NODE_PAINT_PROPERTY_WITH_DEFAULT_VALUE(
718         SliderPaintProperty, SelectGradientColor, value, frameNode,
719         SliderModelNG::CreateSolidGradient(Color(theme->GetTrackSelectedColor())));
720     return value;
721 }
722 
GetShowSteps(FrameNode * frameNode)723 bool SliderModelNG::GetShowSteps(FrameNode* frameNode)
724 {
725     bool value = false;
726     ACE_GET_NODE_PAINT_PROPERTY_WITH_DEFAULT_VALUE(
727         SliderPaintProperty, ShowSteps, value, frameNode, false);
728     return value;
729 }
730 
GetBlockType(FrameNode * frameNode)731 SliderModel::BlockStyleType SliderModelNG::GetBlockType(FrameNode* frameNode)
732 {
733     SliderModel::BlockStyleType value = SliderModel::BlockStyleType::DEFAULT;
734     ACE_GET_NODE_PAINT_PROPERTY_WITH_DEFAULT_VALUE(
735         SliderPaintProperty, BlockType, value, frameNode, SliderModel::BlockStyleType::DEFAULT);
736     return value;
737 }
738 
GetSliderValue(FrameNode * frameNode)739 float SliderModelNG::GetSliderValue(FrameNode* frameNode)
740 {
741     float value = DEFAULT_MIN_VALUE;
742     ACE_GET_NODE_PAINT_PROPERTY_WITH_DEFAULT_VALUE(
743         SliderPaintProperty, Value, value, frameNode, DEFAULT_MIN_VALUE);
744     return value;
745 }
746 
GetMinLabel(FrameNode * frameNode)747 float SliderModelNG::GetMinLabel(FrameNode* frameNode)
748 {
749     float value = DEFAULT_MIN_VALUE;
750     ACE_GET_NODE_PAINT_PROPERTY_WITH_DEFAULT_VALUE(
751         SliderPaintProperty, Min, value, frameNode, DEFAULT_MIN_VALUE);
752     return value;
753 }
GetMaxLabel(FrameNode * frameNode)754 float SliderModelNG::GetMaxLabel(FrameNode* frameNode)
755 {
756     float value = DEFAULT_MAX_VALUE;
757     ACE_GET_NODE_PAINT_PROPERTY_WITH_DEFAULT_VALUE(
758         SliderPaintProperty, Max, value, frameNode, DEFAULT_MAX_VALUE);
759     return value;
760 }
761 
GetSliderMode(FrameNode * frameNode)762 SliderModel::SliderMode SliderModelNG::GetSliderMode(FrameNode* frameNode)
763 {
764     SliderModel::SliderMode value = SliderModel::SliderMode::OUTSET;
765     ACE_GET_NODE_PAINT_PROPERTY_WITH_DEFAULT_VALUE(
766         SliderPaintProperty, SliderMode, value, frameNode, SliderModel::SliderMode::OUTSET);
767     return value;
768 }
GetDirection(FrameNode * frameNode)769 OHOS::Ace::Axis SliderModelNG::GetDirection(FrameNode* frameNode)
770 {
771     OHOS::Ace::Axis value = OHOS::Ace::Axis::HORIZONTAL;
772     ACE_GET_NODE_PAINT_PROPERTY_WITH_DEFAULT_VALUE(
773         SliderPaintProperty, Direction, value, frameNode, OHOS::Ace::Axis::HORIZONTAL);
774     return value;
775 }
GetReverse(FrameNode * frameNode)776 bool SliderModelNG::GetReverse(FrameNode* frameNode)
777 {
778     bool value = false;
779     ACE_GET_NODE_PAINT_PROPERTY_WITH_DEFAULT_VALUE(
780         SliderPaintProperty, Reverse, value, frameNode, false);
781     return value;
782 }
GetStep(FrameNode * frameNode)783 float SliderModelNG::GetStep(FrameNode* frameNode)
784 {
785     float value = DEFAULT_STEP;
786     ACE_GET_NODE_PAINT_PROPERTY_WITH_DEFAULT_VALUE(
787         SliderPaintProperty, Step, value, frameNode, DEFAULT_STEP);
788     return value;
789 }
790 
GetBlockImageValue(FrameNode * frameNode)791 std::string SliderModelNG::GetBlockImageValue(FrameNode* frameNode)
792 {
793     std::string value = "";
794     ACE_GET_NODE_PAINT_PROPERTY_WITH_DEFAULT_VALUE(
795         SliderPaintProperty, BlockImage, value, frameNode, value);
796     return value;
797 }
798 
GetBlockShape(FrameNode * frameNode)799 RefPtr<BasicShape> SliderModelNG::GetBlockShape(FrameNode* frameNode)
800 {
801     RefPtr<BasicShape> value = AceType::MakeRefPtr<BasicShape>();
802     ACE_GET_NODE_PAINT_PROPERTY_WITH_DEFAULT_VALUE(SliderPaintProperty, BlockShape, value, frameNode, value);
803     return value;
804 }
805 
GetValidSlideRange(FrameNode * frameNode)806 RefPtr<SliderModel::SliderValidRange> SliderModelNG::GetValidSlideRange(FrameNode* frameNode)
807 {
808     RefPtr<SliderModel::SliderValidRange> value = AceType::MakeRefPtr<SliderModel::SliderValidRange>();
809     ACE_GET_NODE_PAINT_PROPERTY_WITH_DEFAULT_VALUE(SliderPaintProperty, ValidSlideRange, value, frameNode, value);
810     return value;
811 }
812 
813 #ifdef SUPPORT_DIGITAL_CROWN
GetDigitalCrownSensitivity(FrameNode * frameNode)814 CrownSensitivity SliderModelNG::GetDigitalCrownSensitivity(FrameNode* frameNode)
815 {
816     CrownSensitivity sensitivity = CrownSensitivity::MEDIUM;
817     ACE_GET_NODE_PAINT_PROPERTY_WITH_DEFAULT_VALUE(
818         SliderPaintProperty, DigitalCrownSensitivity, sensitivity, frameNode, sensitivity);
819     return sensitivity;
820 }
821 #endif
822 
CreateSolidGradient(Color value)823 Gradient SliderModelNG::CreateSolidGradient(Color value)
824 {
825     Gradient gradient;
826     GradientColor gradientColorBegin;
827     gradientColorBegin.SetLinearColor(LinearColor(value));
828     gradientColorBegin.SetDimension(Dimension(0.0f));
829     gradient.AddColor(gradientColorBegin);
830     OHOS::Ace::NG::GradientColor gradientColorEnd;
831     gradientColorEnd.SetLinearColor(LinearColor(value));
832     gradientColorEnd.SetDimension(Dimension(1.0f));
833     gradient.AddColor(gradientColorEnd);
834     return gradient;
835 }
836 
CreateWithColorResourceObj(const RefPtr<ResourceObject> & resObj,const SliderColorType sliderColorType)837 void SliderModelNG::CreateWithColorResourceObj(const RefPtr<ResourceObject>& resObj,
838     const SliderColorType sliderColorType)
839 {
840     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
841     CHECK_NULL_VOID(frameNode);
842     CreateWithColorResourceObj(frameNode, resObj, sliderColorType);
843 }
844 
UpdateComponentColor(FrameNode * frameNode,const SliderColorType sliderColorType)845 void SliderModelNG::UpdateComponentColor(FrameNode* frameNode, const SliderColorType sliderColorType)
846 {
847     CHECK_NULL_VOID(frameNode);
848     auto pipelineContext = frameNode->GetContext();
849     CHECK_NULL_VOID(pipelineContext);
850     if (pipelineContext->IsSystmColorChange()) {
851         switch (sliderColorType) {
852             case SliderColorType::BLOCK_COLOR:
853                 ResetBlockColor(frameNode);
854                 break;
855             case SliderColorType::TRACK_COLOR:
856                 ResetTrackColor(frameNode);
857                 break;
858             case SliderColorType::SELECT_COLOR:
859                 ResetSelectColor(frameNode);
860                 break;
861             case SliderColorType::BLOCK_BORDER_COLOR:
862                 ResetBlockBorderColor(frameNode);
863                 break;
864             case SliderColorType::STEP_COLOR:
865                 ResetStepColor(frameNode);
866                 break;
867             default:
868                 break;
869         }
870     }
871     if (frameNode->GetRerenderable()) {
872         frameNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF);
873     }
874 }
875 
CreateWithColorResourceObj(FrameNode * frameNode,const RefPtr<ResourceObject> & resObj,const SliderColorType sliderColorType)876 void SliderModelNG::CreateWithColorResourceObj(
877     FrameNode* frameNode, const RefPtr<ResourceObject>& resObj, const SliderColorType sliderColorType)
878 {
879     CHECK_NULL_VOID(frameNode);
880     auto pattern = frameNode->GetPattern<SliderPattern>();
881     CHECK_NULL_VOID(pattern);
882     std::string key = "slider" + ColorTypeToString(sliderColorType);
883     pattern->RemoveResObj(key);
884     CHECK_NULL_VOID(resObj);
885     auto&& updateFunc = [sliderColorType, weak = AceType::WeakClaim(frameNode)](const RefPtr<ResourceObject>& resObj) {
886         auto frameNode = weak.Upgrade();
887         CHECK_NULL_VOID(frameNode);
888         auto pattern = frameNode->GetPattern<SliderPattern>();
889         CHECK_NULL_VOID(pattern);
890         Color result;
891         if (!ResourceParseUtils::ParseResColor(resObj, result)) {
892             UpdateComponentColor(AceType::RawPtr(frameNode), sliderColorType);
893             return;
894         }
895         Gradient gradient = SliderModelNG::CreateSolidGradient(result);
896         pattern->UpdateSliderComponentColor(result, sliderColorType, gradient);
897     };
898     pattern->AddResObj(key, resObj, std::move(updateFunc));
899 }
900 
CreateWithMediaResourceObj(const RefPtr<ResourceObject> & resObj,const std::string & bundleName,const std::string & moduleName)901 void SliderModelNG::CreateWithMediaResourceObj(const RefPtr<ResourceObject>& resObj,
902     const std::string& bundleName, const std::string& moduleName)
903 {
904     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
905     CHECK_NULL_VOID(frameNode);
906     CreateWithMediaResourceObj(frameNode, resObj, bundleName, moduleName);
907 }
908 
CreateWithMediaResourceObj(FrameNode * frameNode,const RefPtr<ResourceObject> & resObj,const std::string & bundleName,const std::string & moduleName)909 void SliderModelNG::CreateWithMediaResourceObj(FrameNode* frameNode, const RefPtr<ResourceObject>& resObj,
910     const std::string& bundleName, const std::string& moduleName)
911 {
912     CHECK_NULL_VOID(frameNode);
913     auto pattern = frameNode->GetPattern<SliderPattern>();
914     CHECK_NULL_VOID(pattern);
915     std::string key = "sliderImage";
916     pattern->RemoveResObj(key);
917     CHECK_NULL_VOID(resObj);
918     auto&& updateFunc = [bundleName, moduleName, weak = AceType::WeakClaim(frameNode)](
919         const RefPtr<ResourceObject>& resObj) {
920         auto frameNode = weak.Upgrade();
921         CHECK_NULL_VOID(frameNode);
922         auto pattern = frameNode->GetPattern<SliderPattern>();
923         CHECK_NULL_VOID(pattern);
924         std::string result;
925         if (ResourceParseUtils::ParseResMedia(resObj, result)) {
926             ACE_UPDATE_NODE_PAINT_PROPERTY(SliderPaintProperty, BlockImage, result, frameNode);
927             ACE_UPDATE_NODE_PAINT_PROPERTY(SliderPaintProperty, BlockImageBundleName, bundleName, frameNode);
928             ACE_UPDATE_NODE_PAINT_PROPERTY(SliderPaintProperty, BlockImageModuleName, moduleName, frameNode);
929             pattern->UpdateSliderComponentMedia();
930         }
931     };
932     pattern->AddResObj(key, resObj, std::move(updateFunc));
933 }
934 
CreateWithStringResourceObj(const RefPtr<ResourceObject> & resObj,const bool isShowTips)935 void SliderModelNG::CreateWithStringResourceObj(const RefPtr<ResourceObject>& resObj, const bool isShowTips)
936 {
937     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
938     CHECK_NULL_VOID(frameNode);
939     CreateWithStringResourceObj(frameNode, resObj, isShowTips);
940 }
941 
CreateWithStringResourceObj(FrameNode * frameNode,const RefPtr<ResourceObject> & resObj,const bool isShowTips)942 void SliderModelNG::CreateWithStringResourceObj(FrameNode* frameNode, const RefPtr<ResourceObject>& resObj,
943     const bool isShowTips)
944 {
945     CHECK_NULL_VOID(frameNode);
946     auto pattern = frameNode->GetPattern<SliderPattern>();
947     CHECK_NULL_VOID(pattern);
948     std::string key = "sliderShowTips";
949     pattern->RemoveResObj(key);
950     CHECK_NULL_VOID(resObj);
951     auto&& updateFunc = [isShowTips, weak = AceType::WeakClaim(AceType::RawPtr(pattern))](
952         const RefPtr<ResourceObject>& resObj) {
953         auto pattern = weak.Upgrade();
954         CHECK_NULL_VOID(pattern);
955         std::string result;
956         if (ResourceParseUtils::ParseResString(resObj, result)) {
957             pattern->UpdateSliderComponentString(isShowTips, result);
958         }
959     };
960     pattern->AddResObj(key, resObj, std::move(updateFunc));
961 }
962 
ColorTypeToString(const SliderColorType sliderColorType)963 std::string SliderModelNG::ColorTypeToString(const SliderColorType sliderColorType)
964 {
965     std::string rst;
966     switch (sliderColorType) {
967         case SliderColorType::BLOCK_COLOR:
968             rst = "BlockColor";
969             break;
970         case SliderColorType::TRACK_COLOR:
971             rst = "TrackColor";
972             break;
973         case SliderColorType::SELECT_COLOR:
974             rst = "SelectColor";
975             break;
976         case SliderColorType::BLOCK_BORDER_COLOR:
977             rst = "BlockBorderColor";
978             break;
979         case SliderColorType::STEP_COLOR:
980             rst = "StepColor";
981             break;
982         default:
983             rst = "Unknown";
984             break;
985     }
986     return rst;
987 }
988 
SetBuilderFunc(FrameNode * frameNode,SliderMakeCallback && makeFunc)989 void SliderModelNG::SetBuilderFunc(FrameNode* frameNode, SliderMakeCallback&& makeFunc)
990 {
991     CHECK_NULL_VOID(frameNode);
992     auto pattern = frameNode->GetPattern<SliderPattern>();
993     CHECK_NULL_VOID(pattern);
994     pattern->SetBuilderFunc(std::move(makeFunc));
995 }
996 
SetChangeValue(FrameNode * frameNode,double value,int32_t mode)997 void SliderModelNG::SetChangeValue(FrameNode* frameNode, double value, int32_t mode)
998 {
999     auto pattern = frameNode->GetPattern<SliderPattern>();
1000     CHECK_NULL_VOID(pattern);
1001     pattern->SetSliderValue(value, mode);
1002 }
1003 
GetEnableHapticFeedback(FrameNode * frameNode)1004 bool SliderModelNG::GetEnableHapticFeedback(FrameNode* frameNode)
1005 {
1006     CHECK_NULL_RETURN(frameNode, true);
1007     auto sliderPattern = frameNode->GetPattern<SliderPattern>();
1008     CHECK_NULL_RETURN(sliderPattern, true);
1009     return sliderPattern->GetEnableHapticFeedback();
1010 }
1011 
SetEnableHapticFeedback(bool isEnableHapticFeedback)1012 void SliderModelNG::SetEnableHapticFeedback(bool isEnableHapticFeedback)
1013 {
1014     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1015     CHECK_NULL_VOID(frameNode);
1016     SetEnableHapticFeedback(frameNode, isEnableHapticFeedback);
1017 }
1018 
SetEnableHapticFeedback(FrameNode * frameNode,bool isEnableHapticFeedback)1019 void SliderModelNG::SetEnableHapticFeedback(FrameNode* frameNode, bool isEnableHapticFeedback)
1020 {
1021     CHECK_NULL_VOID(frameNode);
1022     auto sliderPattern = frameNode->GetPattern<SliderPattern>();
1023     CHECK_NULL_VOID(sliderPattern);
1024     sliderPattern->SetEnableHapticFeedback(isEnableHapticFeedback);
1025     ACE_UPDATE_PAINT_PROPERTY(SliderPaintProperty, EnableHapticFeedback, isEnableHapticFeedback);
1026 }
1027 
GetThickness(FrameNode * frameNode)1028 Dimension SliderModelNG::GetThickness(FrameNode* frameNode)
1029 {
1030     Dimension defaultTrackThickness = Dimension(0.0f);
1031     CHECK_NULL_RETURN(frameNode, defaultTrackThickness);
1032     auto layoutProperty = frameNode->GetLayoutProperty<SliderLayoutProperty>();
1033     CHECK_NULL_RETURN(layoutProperty, defaultTrackThickness);
1034     auto pipeline = frameNode->GetContext();
1035     CHECK_NULL_RETURN(pipeline, defaultTrackThickness);
1036     auto theme = pipeline->GetTheme<SliderTheme>();
1037     CHECK_NULL_RETURN(theme, defaultTrackThickness);
1038     auto sliderMode = layoutProperty->GetSliderModeValue(SliderModel::SliderMode::OUTSET);
1039     if (sliderMode == SliderModel::SliderMode::OUTSET) {
1040         defaultTrackThickness = theme->GetOutsetTrackThickness();
1041     } else if (sliderMode == SliderModel::SliderMode::INSET) {
1042         defaultTrackThickness = theme->GetInsetTrackThickness();
1043     } else {
1044         defaultTrackThickness = theme->GetNoneTrackThickness();
1045     }
1046 
1047     Dimension trackThickness = Dimension(0.0f);
1048     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(
1049         SliderLayoutProperty, Thickness, trackThickness, frameNode, defaultTrackThickness);
1050     return trackThickness;
1051 }
1052 
SetSelectedBorderRadius(FrameNode * frameNode,const Dimension & value)1053 void SliderModelNG::SetSelectedBorderRadius(FrameNode* frameNode, const Dimension& value)
1054 {
1055     ACE_UPDATE_NODE_PAINT_PROPERTY(SliderPaintProperty, SelectedBorderRadius, value, frameNode);
1056 }
1057 
ResetSelectedBorderRadius(FrameNode * frameNode)1058 void SliderModelNG::ResetSelectedBorderRadius(FrameNode* frameNode)
1059 {
1060     ACE_RESET_NODE_PAINT_PROPERTY_WITH_FLAG(
1061         SliderPaintProperty, SelectedBorderRadius, PROPERTY_UPDATE_RENDER, frameNode);
1062 }
1063 
ResetSliderInteractionMode(FrameNode * frameNode)1064 void SliderModelNG::ResetSliderInteractionMode(FrameNode* frameNode)
1065 {
1066     ACE_RESET_NODE_PAINT_PROPERTY_WITH_FLAG(
1067         SliderPaintProperty, SliderInteractionMode, PROPERTY_UPDATE_RENDER, frameNode);
1068 }
1069 
ResetMinResponsiveDistance(FrameNode * frameNode)1070 void SliderModelNG::ResetMinResponsiveDistance(FrameNode* frameNode)
1071 {
1072     ACE_RESET_NODE_PAINT_PROPERTY_WITH_FLAG(
1073         SliderPaintProperty, MinResponsiveDistance, PROPERTY_UPDATE_RENDER, frameNode);
1074 }
1075 
ResetBlockColor()1076 void SliderModelNG::ResetBlockColor()
1077 {
1078     ACE_RESET_PAINT_PROPERTY_WITH_FLAG(SliderPaintProperty, BlockColor, PROPERTY_UPDATE_RENDER);
1079 }
1080 
ResetSelectColor()1081 void SliderModelNG::ResetSelectColor()
1082 {
1083     ACE_RESET_PAINT_PROPERTY_WITH_FLAG(SliderPaintProperty, SelectColor, PROPERTY_UPDATE_RENDER);
1084     ACE_RESET_PAINT_PROPERTY_WITH_FLAG(SliderPaintProperty, SelectIsResourceColor, PROPERTY_UPDATE_RENDER);
1085     ACE_RESET_PAINT_PROPERTY_WITH_FLAG(SliderPaintProperty, SelectGradientColor, PROPERTY_UPDATE_RENDER);
1086 }
1087 
ResetSelectColor(FrameNode * frameNode)1088 void SliderModelNG::ResetSelectColor(FrameNode* frameNode)
1089 {
1090     ACE_RESET_NODE_PAINT_PROPERTY_WITH_FLAG(SliderPaintProperty, SelectColor,
1091         PROPERTY_UPDATE_RENDER, frameNode);
1092     ACE_RESET_NODE_PAINT_PROPERTY_WITH_FLAG(SliderPaintProperty,
1093         SelectIsResourceColor, PROPERTY_UPDATE_RENDER, frameNode);
1094     ACE_RESET_NODE_PAINT_PROPERTY_WITH_FLAG(SliderPaintProperty,
1095         SelectGradientColor, PROPERTY_UPDATE_RENDER, frameNode);
1096 }
1097 
ResetTrackColor()1098 void SliderModelNG::ResetTrackColor()
1099 {
1100     ACE_RESET_PAINT_PROPERTY_WITH_FLAG(SliderPaintProperty, TrackBackgroundColor, PROPERTY_UPDATE_RENDER);
1101     ACE_RESET_PAINT_PROPERTY_WITH_FLAG(SliderPaintProperty,
1102         TrackBackgroundIsResourceColor, PROPERTY_UPDATE_RENDER);
1103 }
1104 
ResetTrackColor(FrameNode * frameNode)1105 void SliderModelNG::ResetTrackColor(FrameNode* frameNode)
1106 {
1107     ACE_RESET_NODE_PAINT_PROPERTY_WITH_FLAG(SliderPaintProperty,
1108         TrackBackgroundColor, PROPERTY_UPDATE_RENDER, frameNode);
1109     ACE_RESET_NODE_PAINT_PROPERTY_WITH_FLAG(SliderPaintProperty,
1110         TrackBackgroundIsResourceColor, PROPERTY_UPDATE_RENDER, frameNode);
1111 }
1112 } // namespace OHOS::Ace::NG
1113