1 /* 2 * Copyright (c) 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_MENU_MENU_ITEM_LAYOUT_PROPERTY_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_MENU_MENU_ITEM_LAYOUT_PROPERTY_H 18 19 #include <string> 20 21 #include "base/utils/utils.h" 22 #include "core/components/select/select_theme.h" 23 #include "core/components_ng/base/frame_node.h" 24 #include "core/components_ng/base/inspector_filter.h" 25 #include "core/components_ng/layout/layout_property.h" 26 #include "core/components_ng/pattern/menu/menu_layout_property.h" 27 #include "core/components_ng/property/property.h" 28 #include "core/components_v2/inspector/utils.h" 29 #include "core/pipeline/pipeline_base.h" 30 #include "core/pipeline_ng/pipeline_context.h" 31 32 namespace OHOS::Ace::NG { 33 struct MenuItemLabelFontStyle { 34 ACE_DEFINE_PROPERTY_GROUP_ITEM(LabelFontSize, Dimension); 35 ACE_DEFINE_PROPERTY_GROUP_ITEM(LabelFontColor, Color); 36 ACE_DEFINE_PROPERTY_GROUP_ITEM(LabelFontWeight, FontWeight); 37 ACE_DEFINE_PROPERTY_GROUP_ITEM(LabelFontFamily, std::vector<std::string>); 38 ACE_DEFINE_PROPERTY_GROUP_ITEM(LabelItalicFontStyle, Ace::FontStyle); 39 }; 40 41 struct MenuItemSelectIconStyle { 42 ACE_DEFINE_PROPERTY_GROUP_ITEM(SelectIcon, bool); 43 ACE_DEFINE_PROPERTY_GROUP_ITEM(SelectIconSrc, std::string); 44 }; 45 46 class ACE_EXPORT MenuItemLayoutProperty : public LayoutProperty { 47 DECLARE_ACE_TYPE(MenuItemLayoutProperty, LayoutProperty); 48 49 private: 50 std::function<void(WeakPtr<NG::FrameNode>)> startSymbol_; 51 std::function<void(WeakPtr<NG::FrameNode>)> endSymbol_; 52 std::function<void(WeakPtr<NG::FrameNode>)> selectSymbol_; 53 54 public: 55 MenuItemLayoutProperty() = default; 56 ~MenuItemLayoutProperty() override = default; 57 Clone()58 RefPtr<LayoutProperty> Clone() const override 59 { 60 auto value = MakeRefPtr<MenuItemLayoutProperty>(); 61 value->LayoutProperty::UpdateLayoutProperty(DynamicCast<LayoutProperty>(this)); 62 value->propFontStyle_ = CloneFontStyle(); 63 value->propLabelFontStyle_ = CloneLabelFontStyle(); 64 value->propStartIcon_ = CloneStartIcon(); 65 value->propContent_ = CloneContent(); 66 value->propEndIcon_ = CloneEndIcon(); 67 value->propLabel_ = CloneLabel(); 68 value->propSelectIconStyle_ = CloneSelectIconStyle(); 69 value->propMenuWidth_ = CloneMenuWidth(); 70 return value; 71 } 72 Reset()73 void Reset() override 74 { 75 LayoutProperty::Reset(); 76 ResetFontStyle(); 77 ResetLabelFontStyle(); 78 ResetStartIcon(); 79 ResetContent(); 80 ResetEndIcon(); 81 ResetLabel(); 82 ResetSelectIconStyle(); 83 ResetMenuWidth(); 84 } 85 GetStartSymbol()86 std::function<void(WeakPtr<NG::FrameNode>)>& GetStartSymbol() 87 { 88 return startSymbol_; 89 } 90 SetStartSymbol(const std::function<void (WeakPtr<NG::FrameNode>)> & symbol)91 void SetStartSymbol(const std::function<void(WeakPtr<NG::FrameNode>)>& symbol) 92 { 93 startSymbol_ = symbol; 94 } 95 GetEndSymbol()96 std::function<void(WeakPtr<NG::FrameNode>)>& GetEndSymbol() 97 { 98 return endSymbol_; 99 } 100 SetEndSymbol(const std::function<void (WeakPtr<NG::FrameNode>)> & symbol)101 void SetEndSymbol(const std::function<void(WeakPtr<NG::FrameNode>)>& symbol) 102 { 103 endSymbol_ = symbol; 104 } 105 GetSelectSymbol()106 std::function<void(WeakPtr<NG::FrameNode>)>& GetSelectSymbol() 107 { 108 return selectSymbol_; 109 } 110 SetSelectSymbol(const std::function<void (WeakPtr<NG::FrameNode>)> & symbol)111 void SetSelectSymbol(const std::function<void(WeakPtr<NG::FrameNode>)>& symbol) 112 { 113 selectSymbol_ = symbol; 114 } 115 116 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(StartIcon, ImageSourceInfo, PROPERTY_UPDATE_MEASURE); 117 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(Content, std::string, PROPERTY_UPDATE_MEASURE); 118 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(EndIcon, ImageSourceInfo, PROPERTY_UPDATE_MEASURE); 119 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(Label, std::string, PROPERTY_UPDATE_MEASURE); 120 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(MenuWidth, Dimension, PROPERTY_UPDATE_MEASURE); 121 122 ACE_DEFINE_PROPERTY_GROUP(SelectIconStyle, MenuItemSelectIconStyle); 123 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(SelectIconStyle, SelectIcon, bool, PROPERTY_UPDATE_MEASURE); 124 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(SelectIconStyle, SelectIconSrc, std::string, PROPERTY_UPDATE_MEASURE); 125 126 ACE_DEFINE_PROPERTY_GROUP(FontStyle, MenuItemFontStyle); 127 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, FontSize, Dimension, PROPERTY_UPDATE_MEASURE); 128 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, FontColor, Color, PROPERTY_UPDATE_MEASURE); 129 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, FontWeight, FontWeight, PROPERTY_UPDATE_MEASURE); 130 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, FontFamily, std::vector<std::string>, PROPERTY_UPDATE_MEASURE); 131 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, ItalicFontStyle, Ace::FontStyle, PROPERTY_UPDATE_MEASURE); 132 133 ACE_DEFINE_PROPERTY_GROUP(LabelFontStyle, MenuItemLabelFontStyle); 134 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(LabelFontStyle, LabelFontSize, Dimension, PROPERTY_UPDATE_MEASURE); 135 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(LabelFontStyle, LabelFontColor, Color, PROPERTY_UPDATE_MEASURE); 136 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(LabelFontStyle, LabelFontWeight, FontWeight, PROPERTY_UPDATE_MEASURE); 137 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(LabelFontStyle, LabelFontFamily, std::vector<std::string>, 138 PROPERTY_UPDATE_MEASURE); 139 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(LabelFontStyle, LabelItalicFontStyle, Ace::FontStyle, PROPERTY_UPDATE_MEASURE); 140 ToJsonValue(std::unique_ptr<JsonValue> & json,const InspectorFilter & filter)141 void ToJsonValue(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const override 142 { 143 LayoutProperty::ToJsonValue(json, filter); 144 if (filter.IsFastFilter()) { 145 json->PutFixedAttr("content", GetContent().value_or("").c_str(), filter, FIXED_ATTR_CONTENT); 146 return; 147 } 148 if (GetStartIcon().has_value()) { 149 json->PutExtAttr("startIcon", GetStartIcon()->GetSrc().c_str(), filter); 150 } 151 json->PutFixedAttr("content", GetContent().value_or("").c_str(), filter, FIXED_ATTR_CONTENT); 152 json->PutExtAttr("labelInfo", GetLabel().value_or("").c_str(), filter); 153 if (GetEndIcon().has_value()) { 154 json->PutExtAttr("endIcon", GetEndIcon()->GetSrc().c_str(), filter); 155 } 156 auto selectIconShow = GetSelectIcon().value_or(false); 157 auto selectIconSrc = GetSelectIconSrc().value_or(""); 158 if (selectIconShow) { 159 json->PutExtAttr("selectIcon", selectIconSrc.empty() ? "true" : selectIconSrc.c_str(), filter); 160 } else { 161 json->PutExtAttr("selectIcon", "false", filter); 162 } 163 auto context = PipelineBase::GetCurrentContext(); 164 auto theme = context ? context->GetTheme<SelectTheme>() : nullptr; 165 auto defaultFontSize = theme ? theme->GetMenuFontSize() : Dimension(0, DimensionUnit::FP); 166 auto defaultFontColor = theme ? theme->GetMenuFontColor() : Color::BLACK; 167 auto contentFontJsonObject = JsonUtil::Create(true); 168 contentFontJsonObject->Put("size", GetFontSize().value_or(defaultFontSize).ToString().c_str()); 169 contentFontJsonObject->Put("weight", 170 V2::ConvertWrapFontWeightToStirng(GetFontWeight().value_or(FontWeight::REGULAR)).c_str()); 171 contentFontJsonObject->Put("style", 172 V2::ConvertWrapFontStyleToStirng(GetItalicFontStyle().value_or(Ace::FontStyle::NORMAL)).c_str()); 173 contentFontJsonObject->Put("family", V2::ConvertFontFamily(GetFontFamilyValue({})).c_str()); 174 json->PutExtAttr("contentFont", contentFontJsonObject, filter); 175 json->PutExtAttr("contentFontColor", 176 GetFontColor().value_or(defaultFontColor).ColorToString().c_str(), filter); 177 auto labelFontJsonObject = JsonUtil::Create(true); 178 labelFontJsonObject->Put("size", GetLabelFontSize().value_or(defaultFontSize).ToString().c_str()); 179 labelFontJsonObject->Put("weight", 180 V2::ConvertWrapFontWeightToStirng(GetLabelFontWeight().value_or(FontWeight::REGULAR)).c_str()); 181 labelFontJsonObject->Put("style", 182 V2::ConvertWrapFontStyleToStirng(GetLabelItalicFontStyle().value_or(Ace::FontStyle::NORMAL)).c_str()); 183 labelFontJsonObject->Put("family", V2::ConvertFontFamily(GetLabelFontFamilyValue({})).c_str()); 184 json->PutExtAttr("labelFont", labelFontJsonObject, filter); 185 auto defaultLabelFontColor = theme ? theme->GetSecondaryFontColor() : Color::GRAY; 186 json->PutExtAttr("labelFontColor", 187 GetLabelFontColor().value_or(defaultLabelFontColor).ColorToString().c_str(), filter); 188 json->PutFixedAttr("label", GetContent().value_or("").c_str(), filter, FIXED_ATTR_CONTENT); 189 } 190 191 ACE_DISALLOW_COPY_AND_MOVE(MenuItemLayoutProperty); 192 }; 193 } // namespace OHOS::Ace::NG 194 195 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_MENU_MENU_ITEM_LAYOUT_PROPERTY_H 196