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