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 #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_SLIDER_SLIDER_RENDER_PROPERTY_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_SLIDER_SLIDER_RENDER_PROPERTY_H
18 
19 #include <string>
20 
21 #include "core/components_ng/base/inspector_filter.h"
22 #include "core/components_ng/pattern/slider/slider_style.h"
23 #include "core/components_ng/render/paint_property.h"
24 
25 namespace OHOS::Ace::NG {
26 // PaintProperty are used to set render properties.
27 class SliderPaintProperty : public PaintProperty {
28     DECLARE_ACE_TYPE(SliderPaintProperty, PaintProperty)
29 public:
30     SliderPaintProperty() = default;
31     ~SliderPaintProperty() override = default;
Clone()32     RefPtr<PaintProperty> Clone() const override
33     {
34         auto value = MakeRefPtr<SliderPaintProperty>();
35         value->PaintProperty::UpdatePaintProperty(DynamicCast<PaintProperty>(this));
36         value->propSliderPaintStyle_ = CloneSliderPaintStyle();
37         value->propSliderTipStyle_ = CloneSliderTipStyle();
38         return value;
39     }
40 
Reset()41     void Reset() override
42     {
43         PaintProperty::Reset();
44         ResetSliderPaintStyle();
45         ResetSliderTipStyle();
46     }
47 
ToJsonTrackBackgroundColor()48     std::string ToJsonTrackBackgroundColor() const
49     {
50         Gradient colors;
51         if (HasTrackBackgroundColor()) {
52             colors = GetTrackBackgroundColor().value();
53             if (GetTrackBackgroundIsResourceColor()) {
54                 return colors.GetColors()[0].GetLinearColor().ToColor().ColorToString();
55             }
56             return GradientToJson(colors);
57         }
58         auto pipeline = PipelineBase::GetCurrentContext();
59         CHECK_NULL_RETURN(pipeline, "");
60         auto theme = pipeline->GetTheme<SliderTheme>();
61         CHECK_NULL_RETURN(theme, "");
62         return theme->GetTrackBgColor().ColorToString();
63     }
64 
GradientToJson(Gradient colors)65     std::string GradientToJson(Gradient colors) const
66     {
67         auto jsonArray = JsonUtil::CreateArray(true);
68         for (size_t index = 0; index < colors.GetColors().size(); ++index) {
69             auto gradientColor = colors.GetColors()[index];
70             auto gradientColorJson = JsonUtil::Create(true);
71             gradientColorJson->Put("color", gradientColor.GetLinearColor().ToColor().ColorToString().c_str());
72             gradientColorJson->Put("offset", std::to_string(gradientColor.GetDimension().Value()).c_str());
73             jsonArray->Put(std::to_string(index).c_str(), gradientColorJson);
74         }
75         return jsonArray->ToString();
76     }
77 
InteractionModeToJson()78     std::string InteractionModeToJson() const
79     {
80         static const std::array<std::string, 3> SLIDER_INTERACTION_MODE_TO_STRING = {
81             "SliderInteraction.SLIDE_AND_CLICK",
82             "SliderInteraction.SLIDE_ONLY",
83             "SliderInteraction.SLIDE_AND_CLICK_UP",
84         };
85         auto interactionIndex =
86             static_cast<size_t>(GetSliderInteractionModeValue(SliderModelNG::SliderInteraction::SLIDE_AND_CLICK));
87         if (interactionIndex < SLIDER_INTERACTION_MODE_TO_STRING.size()) {
88             return SLIDER_INTERACTION_MODE_TO_STRING.at(interactionIndex);
89         }
90         return "";
91     }
92 
BlockTypeToJson()93     std::string BlockTypeToJson() const
94     {
95         static const std::array<std::string, 3> SLIDER_BLOCK_TYPE_TO_STRING = {
96             "BlockStyleType.DEFAULT",
97             "BlockStyleType.IMAGE",
98             "BlockStyleType.SHAPE",
99         };
100         auto blockTypeIndex = static_cast<size_t>(GetBlockTypeValue(SliderModelNG::BlockStyleType::DEFAULT));
101         if (blockTypeIndex < SLIDER_BLOCK_TYPE_TO_STRING.size()) {
102             return SLIDER_BLOCK_TYPE_TO_STRING.at(blockTypeIndex);
103         }
104         return "";
105     }
106 
ToJsonValue(std::unique_ptr<JsonValue> & json,const InspectorFilter & filter)107     void ToJsonValue(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const override
108     {
109         PaintProperty::ToJsonValue(json, filter);
110         /* no fixed attr below, just return */
111         if (filter.IsFastFilter()) {
112             if (GetCustomContent().has_value()) {
113                 json->PutFixedAttr("content", GetCustomContent().value().c_str(), filter, FIXED_ATTR_CONTENT);
114             }
115             return;
116         }
117         auto pipeline = PipelineBase::GetCurrentContext();
118         CHECK_NULL_VOID(pipeline);
119         auto theme = pipeline->GetTheme<SliderTheme>();
120         CHECK_NULL_VOID(theme);
121         auto jsonConstructor = JsonUtil::Create(true);
122         jsonConstructor->Put("value", std::to_string(GetValue().value_or(0.0f)).c_str());
123         jsonConstructor->Put("min", std::to_string(GetMin().value_or(0.0f)).c_str());
124         jsonConstructor->Put("max", std::to_string(GetMax().value_or(100.0f)).c_str());
125         jsonConstructor->Put("step", std::to_string(GetStep().value_or(1.0f)).c_str());
126         jsonConstructor->Put("reverse", GetReverse().value_or(false) ? "true" : "false");
127         jsonConstructor->Put("direction",
128             (GetDirection().value_or(Axis::HORIZONTAL)) == Axis::VERTICAL ? "Axis.Vertical" : "Axis.Horizontal");
129         json->PutExtAttr("constructor", jsonConstructor, filter);
130         json->PutExtAttr("blockColor",
131             GetBlockColor().value_or(theme->GetBlockColor()).ColorToString().c_str(), filter);
132         json->PutExtAttr("trackColor", ToJsonTrackBackgroundColor().c_str(), filter);
133         json->PutExtAttr("selectedColor",
134             GetSelectColor().value_or(theme->GetTrackSelectedColor()).ColorToString().c_str(), filter);
135         json->PutExtAttr("showSteps", GetShowSteps().value_or(false) ? "true" : "false", filter);
136         json->PutExtAttr("showTips", GetShowTips().value_or(false) ? "true" : "false", filter);
137         json->PutExtAttr("blockBorderColor",
138             GetBlockBorderColorValue(Color::TRANSPARENT).ColorToString().c_str(), filter);
139         json->PutExtAttr("blockBorderWidth", GetBlockBorderWidthValue(Dimension()).ToString().c_str(), filter);
140         json->PutExtAttr("stepColor", GetStepColorValue(theme->GetMarkerColor()).ColorToString().c_str(), filter);
141         if (GetTrackBorderRadius().has_value()) {
142             json->PutExtAttr("trackBorderRadius", GetTrackBorderRadius().value().ToString().c_str(), filter);
143         }
144         if (GetSelectedBorderRadius().has_value()) {
145             json->PutExtAttr("selectedBorderRadius", GetSelectedBorderRadius().value().ToString().c_str(), filter);
146         }
147         json->PutExtAttr("blockType", BlockTypeToJson().c_str(), filter);
148         json->PutExtAttr("stepSize", GetStepSizeValue(theme->GetMarkerSize()).ToString().c_str(), filter);
149         if (GetCustomContent().has_value()) {
150             json->PutFixedAttr("content", GetCustomContent().value().c_str(), filter, FIXED_ATTR_CONTENT);
151         }
152         json->PutExtAttr("sliderInteractionMode", InteractionModeToJson().c_str(), filter);
153         json->PutExtAttr("minResponsiveDistance",
154             std::to_string(GetMinResponsiveDistance().value_or(0.0f)).c_str(), filter);
155         auto slideRangeValues = GetValidSlideRange();
156         if (slideRangeValues.has_value() && slideRangeValues.value()->HasValidValues()) {
157             auto slideRange = JsonUtil::Create(true);
158             slideRange->Put("from", std::to_string(slideRangeValues.value()->GetFromValue()).c_str());
159             slideRange->Put("to", std::to_string(slideRangeValues.value()->GetToValue()).c_str());
160             json->PutExtAttr("slideRange", slideRange, filter);
161         }
162     }
163 
GetBlockSizeValue(const SizeF & defaultValue)164     SizeF GetBlockSizeValue(const SizeF& defaultValue)
165     {
166         auto& groupProperty = GetSliderPaintStyle();
167         if (groupProperty) {
168             if (groupProperty->HasBlockSize()) {
169                 return SizeF(groupProperty->GetBlockSizeValue().Width().ConvertToPx(),
170                     groupProperty->GetBlockSizeValue().Height().ConvertToPx());
171             }
172         }
173         return defaultValue;
174     }
175 
GetStepRatio()176     float GetStepRatio()
177     {
178         float min = GetMin().value_or(0.0f);
179         float max = GetMax().value_or(100.0f);
180         float step = GetStep().value_or(1.0f);
181         if (max == min) {
182             return 0.0f;
183         }
184         return step / (max - min);
185     }
186 
187     ACE_DEFINE_PROPERTY_GROUP(SliderPaintStyle, SliderPaintStyle)
188     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(SliderPaintStyle, Value, float, PROPERTY_UPDATE_RENDER)
189     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(SliderPaintStyle, Min, float, PROPERTY_UPDATE_RENDER)
190     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(SliderPaintStyle, Max, float, PROPERTY_UPDATE_RENDER)
191     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(SliderPaintStyle, Step, float, PROPERTY_UPDATE_RENDER)
192     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(SliderPaintStyle, MinResponsiveDistance, float, PROPERTY_UPDATE_RENDER)
193     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(SliderPaintStyle, Reverse, bool, PROPERTY_UPDATE_RENDER)
194     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(SliderPaintStyle, Direction, Axis, PROPERTY_UPDATE_RENDER)
195     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(SliderPaintStyle, BlockColor, Color, PROPERTY_UPDATE_RENDER)
196     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(SliderPaintStyle, TrackBackgroundColor, Gradient, PROPERTY_UPDATE_RENDER)
197     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(SliderPaintStyle, TrackBackgroundIsResourceColor, bool, PROPERTY_UPDATE_RENDER)
198     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(SliderPaintStyle, SelectColor, Color, PROPERTY_UPDATE_RENDER)
199     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(SliderPaintStyle, ShowSteps, bool, PROPERTY_UPDATE_RENDER)
200     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(
201         SliderPaintStyle, SliderInteractionMode, SliderModel::SliderInteraction, PROPERTY_UPDATE_RENDER)
202     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(SliderPaintStyle, BlockBorderColor, Color, PROPERTY_UPDATE_RENDER)
203     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(SliderPaintStyle, BlockBorderWidth, Dimension, PROPERTY_UPDATE_RENDER)
204     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(SliderPaintStyle, StepColor, Color, PROPERTY_UPDATE_RENDER)
205     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(SliderPaintStyle, TrackBorderRadius, Dimension, PROPERTY_UPDATE_RENDER)
206     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(SliderPaintStyle, SelectedBorderRadius, Dimension, PROPERTY_UPDATE_RENDER)
207     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(
208         SliderPaintStyle, BlockType, SliderModel::BlockStyleType, PROPERTY_UPDATE_RENDER)
209     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(SliderPaintStyle, BlockImage, std::string, PROPERTY_UPDATE_RENDER)
210     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(SliderPaintStyle, BlockImageBundleName, std::string, PROPERTY_UPDATE_RENDER)
211     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(SliderPaintStyle, BlockImageModuleName, std::string, PROPERTY_UPDATE_RENDER)
212     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(SliderPaintStyle, BlockShape, RefPtr<BasicShape>, PROPERTY_UPDATE_RENDER)
213     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(SliderPaintStyle, StepSize, Dimension, PROPERTY_UPDATE_RENDER)
214     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(SliderPaintStyle, SliderMode, SliderModel::SliderMode, PROPERTY_UPDATE_RENDER)
215     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(
216         SliderPaintStyle, ValidSlideRange, RefPtr<SliderModel::SliderValidRange>, PROPERTY_UPDATE_RENDER)
217     ACE_DEFINE_PROPERTY_GROUP(SliderTipStyle, SliderTipStyle)
218     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(SliderTipStyle, ShowTips, bool, PROPERTY_UPDATE_RENDER)
219     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(SliderTipStyle, Padding, Dimension, PROPERTY_UPDATE_RENDER)
220     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(SliderTipStyle, Content, std::string, PROPERTY_UPDATE_RENDER)
221     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(SliderTipStyle, FontSize, Dimension, PROPERTY_UPDATE_RENDER)
222     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(SliderTipStyle, TextColor, Color, PROPERTY_UPDATE_RENDER)
223     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(SliderTipStyle, TipColor, Color, PROPERTY_UPDATE_RENDER)
224     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(SliderTipStyle, CustomContent, std::string, PROPERTY_UPDATE_RENDER)
225 private:
226     ACE_DISALLOW_COPY_AND_MOVE(SliderPaintProperty);
227 };
228 
229 } // namespace OHOS::Ace::NG
230 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_SLIDER_SLIDER_RENDER_PROPERTY_H
231