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