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_MENU_MENU_LAYOUT_PROPERTY_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_MENU_MENU_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/layout/layout_property.h"
25 #include "core/components_ng/pattern/option/option_pattern.h"
26 #include "core/components_ng/pattern/select/select_pattern.h"
27 #include "core/components_ng/property/property.h"
28 #include "core/components_v2/inspector/utils.h"
29 #include "core/components_v2/list/list_properties.h"
30 #include "core/pipeline/pipeline_base.h"
31 #include "core/pipeline_ng/pipeline_context.h"
32 namespace OHOS::Ace::NG {
33 class InspectorFilter;
34 
35 enum class SubMenuExpandingMode { SIDE, EMBEDDED, STACK };
36 
37 struct MenuItemFontStyle {
38     ACE_DEFINE_PROPERTY_GROUP_ITEM(FontSize, Dimension);
39     ACE_DEFINE_PROPERTY_GROUP_ITEM(FontColor, Color);
40     ACE_DEFINE_PROPERTY_GROUP_ITEM(FontWeight, FontWeight);
41     ACE_DEFINE_PROPERTY_GROUP_ITEM(FontFamily, std::vector<std::string>);
42     ACE_DEFINE_PROPERTY_GROUP_ITEM(ItalicFontStyle, Ace::FontStyle);
43 };
44 
45 struct SelectMenuAlignOption {
46     ACE_DEFINE_PROPERTY_GROUP_ITEM(AlignType, MenuAlignType);
47     ACE_DEFINE_PROPERTY_GROUP_ITEM(Offset, DimensionOffset);
48 };
49 
50 class ACE_EXPORT MenuLayoutProperty : public LayoutProperty {
51     DECLARE_ACE_TYPE(MenuLayoutProperty, LayoutProperty);
52 
53 public:
54     MenuLayoutProperty() = default;
55 
56     ~MenuLayoutProperty() override = default;
57 
Clone()58     RefPtr<LayoutProperty> Clone() const override
59     {
60         auto value = MakeRefPtr<MenuLayoutProperty>();
61         value->LayoutProperty::UpdateLayoutProperty(DynamicCast<LayoutProperty>(this));
62         value->propIsRectInTarget_ = CloneIsRectInTarget();
63         value->propMenuOffset_ = CloneMenuOffset();
64         value->propTargetSize_ = CloneTargetSize();
65         value->propPositionOffset_ = ClonePositionOffset();
66         value->propMenuItemFontStyle_ = CloneMenuItemFontStyle();
67         value->propTitle_ = CloneTitle();
68         value->propMenuPlacement_ = CloneMenuPlacement();
69         value->propSelectMenuAlignOption_ = CloneSelectMenuAlignOption();
70         value->propBorderRadius_ = CloneBorderRadius();
71         value->propMenuWidth_ = CloneMenuWidth();
72         value->propShowInSubWindow_ = CloneShowInSubWindow();
73         value->propExpandingMode_ = CloneExpandingMode();
74         value->propItemDivider_ = CloneItemDivider();
75         value->propItemGroupDivider_ = CloneItemGroupDivider();
76         return value;
77     }
78 
Reset()79     void Reset() override
80     {
81         LayoutProperty::Reset();
82         ResetIsRectInTarget();
83         ResetMenuOffset();
84         ResetTargetSize();
85         ResetPositionOffset();
86         ResetMenuItemFontStyle();
87         ResetTitle();
88         ResetMenuPlacement();
89         ResetSelectMenuAlignOption();
90         ResetBorderRadius();
91         ResetMenuWidth();
92         ResetShowInSubWindow();
93         ResetExpandingMode();
94         ResetItemDivider();
95         ResetItemGroupDivider();
96     }
97 
98     // if is a rect in target frameNode
99     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(IsRectInTarget, bool, PROPERTY_UPDATE_MEASURE);
100     // target frameNode that this menu belongs to
101     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(MenuOffset, NG::OffsetF, PROPERTY_UPDATE_MEASURE);
102     // target frameNode size, null for click show menu
103     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(TargetSize, NG::SizeF, PROPERTY_UPDATE_MEASURE);
104     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(BorderRadius, NG::BorderRadiusProperty, PROPERTY_UPDATE_MEASURE);
105     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(MenuWidth, Dimension, PROPERTY_UPDATE_MEASURE);
106     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(ItemDivider, V2::ItemDivider, PROPERTY_UPDATE_MEASURE);
107     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(ItemGroupDivider, V2::ItemDivider, PROPERTY_UPDATE_MEASURE);
108 
109     // offset to cursor
110     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(PositionOffset, NG::OffsetF, PROPERTY_UPDATE_LAYOUT);
111 
112     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(Title, std::string, PROPERTY_UPDATE_LAYOUT);
113 
114     // placement to menu
115     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(MenuPlacement, Placement, PROPERTY_UPDATE_LAYOUT);
116 
117     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(SelectMenuModifiedWidth, float, PROPERTY_UPDATE_MEASURE);
118     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(SelectModifiedHeight, float, PROPERTY_UPDATE_MEASURE);
119     ACE_DEFINE_PROPERTY_GROUP(MenuItemFontStyle, MenuItemFontStyle);
120     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(MenuItemFontStyle, FontSize, Dimension, PROPERTY_UPDATE_MEASURE);
121     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(MenuItemFontStyle, FontColor, Color, PROPERTY_UPDATE_MEASURE);
122     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(MenuItemFontStyle, FontWeight, FontWeight, PROPERTY_UPDATE_MEASURE);
123     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(MenuItemFontStyle, FontFamily,
124         std::vector<std::string>, PROPERTY_UPDATE_MEASURE);
125     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(MenuItemFontStyle, ItalicFontStyle, Ace::FontStyle, PROPERTY_UPDATE_MEASURE);
126 
127     ACE_DEFINE_PROPERTY_GROUP(SelectMenuAlignOption, SelectMenuAlignOption);
128     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(SelectMenuAlignOption, AlignType, MenuAlignType, PROPERTY_UPDATE_MEASURE);
129     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(SelectMenuAlignOption, Offset, DimensionOffset, PROPERTY_UPDATE_MEASURE);
130 
131     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(ShowInSubWindow, bool, PROPERTY_UPDATE_MEASURE);
132     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(ExpandingMode, SubMenuExpandingMode, PROPERTY_UPDATE_MEASURE)
133 
134     void ToJsonValue(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const override;
135     void BindToJsonValue(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const;
136     void DividerToJsonValue(std::unique_ptr<JsonValue>& json) const;
137     ACE_DISALLOW_COPY_AND_MOVE(MenuLayoutProperty);
138 };
139 } // namespace OHOS::Ace::NG
140 
141 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_MENU_MENU_LAYOUT_PROPERTY_H
142