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