1 /* 2 * Copyright (c) 2022 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_SWITCH_SWITCH_PAINT_PROPERTY_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_SWITCH_SWITCH_PAINT_PROPERTY_H 18 19 #include "core/components/checkable/checkable_theme.h" 20 #include "core/components/common/properties/color.h" 21 #include "core/components_ng/base/inspector_filter.h" 22 #include "core/components_ng/pattern/toggle/toggle_model.h" 23 #include "core/components_ng/property/property.h" 24 #include "core/components_ng/render/paint_property.h" 25 namespace OHOS::Ace::NG { 26 27 struct SwitchPaintParagraph { 28 ACE_DEFINE_PROPERTY_GROUP_ITEM(SelectedColor, Color); 29 ACE_DEFINE_PROPERTY_GROUP_ITEM(SwitchPointColor, Color); 30 ACE_DEFINE_PROPERTY_GROUP_ITEM(CurrentOffset, float); 31 ACE_DEFINE_PROPERTY_GROUP_ITEM(PointRadius, Dimension); 32 ACE_DEFINE_PROPERTY_GROUP_ITEM(UnselectedColor, Color); 33 ACE_DEFINE_PROPERTY_GROUP_ITEM(TrackBorderRadius, Dimension); 34 ToJsonValueSwitchPaintParagraph35 void ToJsonValue(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const 36 { 37 /* no fixed attr below, just return */ 38 if (filter.IsFastFilter()) { 39 return; 40 } 41 json->PutExtAttr("selectedColor", propSelectedColor.value_or(Color()).ColorToString().c_str(), filter); 42 json->PutExtAttr("switchPointColor", 43 propSwitchPointColor.value_or(Color()).ColorToString().c_str(), filter); 44 auto pipelineContext = PipelineBase::GetCurrentContext(); 45 CHECK_NULL_VOID(pipelineContext); 46 auto switchTheme = pipelineContext->GetTheme<SwitchTheme>(); 47 CHECK_NULL_VOID(switchTheme); 48 auto defaultHeight = (switchTheme->GetHeight() - switchTheme->GetHotZoneVerticalPadding() * 2); 49 auto defaultPointRadius = defaultHeight / 2 - 2.0_vp; // Get the default radius of the point. 50 if (propPointRadius.has_value()) { 51 json->PutExtAttr("pointRadius", propPointRadius.value().ToString().c_str(), filter); 52 } else { 53 json->PutExtAttr("pointRadius", defaultPointRadius.ToString().c_str(), filter); 54 } 55 json->PutExtAttr("unselectedColor", propUnselectedColor.value_or(Color()).ColorToString().c_str(), filter); 56 auto defaultTrackBorderRadius = defaultHeight / 2; // Get the default border radius of the track. 57 if (propTrackBorderRadius.has_value()) { 58 json->PutExtAttr("trackBorderRadius", propTrackBorderRadius.value().ToString().c_str(), filter); 59 } else { 60 json->PutExtAttr("trackBorderRadius", defaultTrackBorderRadius.ToString().c_str(), filter); 61 } 62 } 63 }; 64 65 struct SwitchAnimationStyle { 66 ACE_DEFINE_PROPERTY_GROUP_ITEM(Duration, int32_t); 67 ACE_DEFINE_PROPERTY_GROUP_ITEM(Curve, RefPtr<Curve>); 68 }; 69 70 // PaintProperty are used to set paint properties. 71 class SwitchPaintProperty : public PaintProperty { 72 DECLARE_ACE_TYPE(SwitchPaintProperty, PaintProperty) 73 public: 74 SwitchPaintProperty() = default; 75 ~SwitchPaintProperty() override = default; Clone()76 RefPtr<PaintProperty> Clone() const override 77 { 78 auto value = MakeRefPtr<SwitchPaintProperty>(); 79 value->PaintProperty::UpdatePaintProperty(DynamicCast<PaintProperty>(this)); 80 value->propSwitchPaintParagraph_ = CloneSwitchPaintParagraph(); 81 value->propIsOn_ = CloneIsOn(); 82 value->propSwitchAnimationStyle_ = CloneSwitchAnimationStyle(); 83 return value; 84 } 85 Reset()86 void Reset() override 87 { 88 PaintProperty::Reset(); 89 ResetSwitchPaintParagraph(); 90 ResetIsOn(); 91 ResetSwitchAnimationStyle(); 92 } 93 ToJsonValue(std::unique_ptr<JsonValue> & json,const InspectorFilter & filter)94 void ToJsonValue(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const override 95 { 96 ACE_PROPERTY_TO_JSON_VALUE(propSwitchPaintParagraph_, SwitchPaintParagraph); 97 /* no fixed attr below, just return */ 98 if (filter.IsFastFilter()) { 99 return; 100 } 101 json->PutExtAttr("type", "ToggleType.Switch", filter); 102 json->PutExtAttr("isOn", propIsOn_.value_or(false) ? "true" : "false", filter); 103 } 104 105 ACE_DEFINE_PROPERTY_GROUP(SwitchAnimationStyle, SwitchAnimationStyle); 106 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(SwitchAnimationStyle, Duration, int32_t, PROPERTY_UPDATE_RENDER); 107 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(SwitchAnimationStyle, Curve, RefPtr<Curve>, PROPERTY_UPDATE_RENDER); 108 109 ACE_DEFINE_PROPERTY_GROUP(SwitchPaintParagraph, SwitchPaintParagraph); 110 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(SwitchPaintParagraph, SelectedColor, Color, PROPERTY_UPDATE_RENDER); 111 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(SwitchPaintParagraph, SwitchPointColor, Color, PROPERTY_UPDATE_RENDER); 112 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(SwitchPaintParagraph, PointRadius, Dimension, PROPERTY_UPDATE_RENDER); 113 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(SwitchPaintParagraph, UnselectedColor, Color, PROPERTY_UPDATE_RENDER); 114 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(SwitchPaintParagraph, TrackBorderRadius, Dimension, PROPERTY_UPDATE_RENDER); 115 116 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(IsOn, bool, PROPERTY_UPDATE_MEASURE); 117 118 ACE_DISALLOW_COPY_AND_MOVE(SwitchPaintProperty); 119 }; 120 } // namespace OHOS::Ace::NG 121 122 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_SWITCH_SWITCH_PAINT_PROPERTY_H 123