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