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_PATTERNS_SELECT_OVERLAY_NODE_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_SELECT_OVERLAY_NODE_H 18 19 #include <cstdint> 20 #include <memory> 21 22 #include "base/memory/referenced.h" 23 #include "base/utils/noncopyable.h" 24 #include "core/components_ng/base/frame_node.h" 25 #include "core/components_ng/pattern/select_overlay/select_overlay_property.h" 26 #include "core/components_ng/property/property.h" 27 28 namespace OHOS::Ace::NG { 29 30 struct OptionParam; 31 32 enum class FrameNodeType { 33 SELECTMENU, 34 EXTENSIONMENU, 35 BACKBUTTON, 36 MENUONLY 37 }; 38 39 enum class FrameNodeStatus { 40 VISIBLE, 41 VISIBLETOGONE, 42 GONE, 43 GONETOVISIBLE 44 }; 45 46 enum class FrameNodeTrigger { 47 SHOW, 48 SHOWN, 49 HIDE, 50 HIDDEN 51 }; 52 53 class ACE_EXPORT SelectOverlayNode : public FrameNode { 54 DECLARE_ACE_TYPE(SelectOverlayNode, FrameNode) 55 public: 56 explicit SelectOverlayNode(const RefPtr<Pattern>& pattern); 57 ~SelectOverlayNode() override = default; 58 59 static RefPtr<FrameNode> CreateSelectOverlayNode( 60 const std::shared_ptr<SelectOverlayInfo>& info, SelectOverlayMode mode = SelectOverlayMode::ALL); 61 RefPtr<FrameNode> CreateMoreSelectOverlayNode(const std::vector<MenuOptionsParam>& menuOptionItems, int32_t index); 62 63 void UpdateToolBar(bool menuItemChanged, bool noAnimation = false); 64 65 void UpdateMenuInner(const std::shared_ptr<SelectOverlayInfo>& info, bool noAnimation = false); 66 SetSelectInfo(const std::string & selectInfo)67 void SetSelectInfo(const std::string& selectInfo) 68 { 69 selectInfo_ = selectInfo; 70 } 71 GetSelectInfo()72 const std::string& GetSelectInfo() const 73 { 74 return selectInfo_; 75 } 76 77 void ChangeToolBar(bool isUseExtensionMenu); 78 79 void MoreOrBackAnimation(bool isMore, bool noAnimation = false); 80 81 bool IsInSelectedOrSelectOverlayArea(const PointF& point); 82 83 void SetClosedByGlobalEvent(bool closedByGlobalEvent); 84 GetAnimationStatus()85 bool GetAnimationStatus() 86 { 87 return isDoingAnimation_; 88 } 89 GetIsExtensionMenu()90 bool GetIsExtensionMenu() 91 { 92 return isExtensionMenu_; 93 } 94 95 void ShowSelectOverlay(bool animation); 96 97 void HideSelectOverlay(const std::function<void()>& callback); 98 void HideOrShowCirclesAndBackArrow(FrameNodeType type, float value); 99 100 void SwitchToOverlayMode(); 101 102 private: 103 void CreateToolBar(); 104 void SelectMenuAndInnerInitProperty(); 105 void AddMenuItemByCreateMenuCallback(const std::shared_ptr<SelectOverlayInfo>& info, float maxWidth); 106 static const std::vector<MenuItemParam> GetSystemMenuItemParams(const std::shared_ptr<SelectOverlayInfo>& info); 107 static const MenuItemParam GetSystemMenuItemParam(const std::string& menuId, const std::string& menuButton); 108 int32_t AddCreateMenuItems(const std::vector<NG::MenuOptionsParam>& menuItems, 109 const std::shared_ptr<SelectOverlayInfo>& info, float maxWidth); 110 bool AddSystemDefaultOptions(float maxWidth, float& allocatedSize); 111 void LandscapeMenuAddMenuOptions(const std::vector<MenuOptionsParam>& menuOptionItems, bool isDefaultOverMaxWidth, 112 float maxWidth, float allocatedSize, int32_t& extensionOptionStartIndex); 113 void ShowCut(float maxWidth, float& allocatedSize, std::shared_ptr<SelectOverlayInfo>& info); 114 void ShowCopy(float maxWidth, float& allocatedSize, std::shared_ptr<SelectOverlayInfo>& info); 115 void ShowPaste(float maxWidth, float& allocatedSize, std::shared_ptr<SelectOverlayInfo>& info); 116 void ShowCopyAll(float maxWidth, float& allocatedSize, std::shared_ptr<SelectOverlayInfo>& info); 117 void ShowShare(float maxWidth, float& allocatedSize, std::shared_ptr<SelectOverlayInfo>& info); 118 void ShowCamera(float maxWidth, float& allocatedSize, std::shared_ptr<SelectOverlayInfo>& info); 119 void ShowAIWrite(float maxWidth, float& allocatedSize, std::shared_ptr<SelectOverlayInfo>& info); 120 std::function<void()> GetDefaultOptionCallback(); 121 std::vector<OptionParam> GetDefaultOptionsParams(const std::shared_ptr<SelectOverlayInfo>& info); 122 void GetFlexibleOptionsParams( 123 const std::shared_ptr<SelectOverlayInfo>& info, std::vector<OptionParam>& params); 124 void addMenuOptionItemsParams( 125 std::vector<OptionParam>& params, const std::shared_ptr<SelectOverlayInfo>& info, int32_t index); 126 void AddExtensionMenuOptions(const std::shared_ptr<SelectOverlayInfo>& info, int32_t index); 127 void AddCreateMenuExtensionMenuOptions(const std::vector<MenuOptionsParam>& menuOptionItems, 128 const std::shared_ptr<SelectOverlayInfo>& info, int32_t startIndex); 129 void AddCreateMenuExtensionMenuParams(const std::vector<MenuOptionsParam>& menuOptionItems, 130 const std::shared_ptr<SelectOverlayInfo>& info, int32_t startIndex, std::vector<OptionParam>& params); 131 std::function<void()> CreateExtensionMenuOptionCallback(int32_t id, const OnMenuItemCallback& onCreateCallback, 132 const std::function<void()>& systemEvent, const MenuOptionsParam& item); 133 void CreatExtensionMenu(std::vector<OptionParam>&& params); 134 void GetDefaultButtonAndMenuWidth(float& maxWidth); 135 136 void MoreAnimation(bool noAnimation); 137 void BackAnimation(bool noAnimation); 138 139 void DispatchVisibleState(FrameNodeType type, FrameNodeTrigger trigger); 140 void DispatchVisibleToGoneState(FrameNodeType type, FrameNodeTrigger trigger); 141 void DispatchGoneState(FrameNodeType type, FrameNodeTrigger trigger); 142 void DispatchGoneToVisibleState(FrameNodeType type, FrameNodeTrigger trigger); 143 void ExecuteOverlayStatus(FrameNodeType type, FrameNodeTrigger trigger); 144 void SetFrameNodeStatus(FrameNodeType type, FrameNodeStatus status); 145 void SetFrameNodeVisibility(FrameNodeType type, VisibleType visibleType); 146 void SetFrameNodeOpacity(FrameNodeType type, float opacity); 147 void SetSelectMenuOpacity(float value); 148 void SetExtensionMenuOpacity(float value); 149 void SetBackButtonOpacity(float value); 150 void HideFrameNodeImmediately(FrameNodeType type); 151 void CreateCustomSelectOverlay(const std::shared_ptr<SelectOverlayInfo>& info); 152 void MenuOnlyStatusChange(const std::shared_ptr<SelectOverlayInfo>& info, bool noAnimation); 153 void HideMenuOnlyImmediately(); 154 void InitSelectMenuStatus( 155 SelectOverlayMode mode, const std::shared_ptr<SelectOverlayInfo>& info, bool changeOpacity = true); 156 SetAnimationStatus(bool toDoAnimation)157 void SetAnimationStatus(bool toDoAnimation) 158 { 159 isDoingAnimation_ = toDoAnimation; 160 } 161 162 static RefPtr<FrameNode> CreateMenuNode(const std::shared_ptr<SelectOverlayInfo>& info); 163 static std::pair<std::vector<MenuOptionsParam>, bool> HandleCollaborationMenuItem( 164 const std::vector<MenuOptionsParam>& params); 165 166 void NotifyUpdateToolBar(bool itemChanged); 167 void SetSelectMenuInnerSize(); 168 169 using ExecuteStateFunc = void (SelectOverlayNode::*)(FrameNodeType type, FrameNodeTrigger trigger); 170 171 /* Text selection menu node structure. 172 -rootNode 173 -selectOverlay 174 -selectMenu_ 175 -selectMenuInner_ 176 -backButton_ 177 -extensionMenu_ 178 Attention: 179 If the user-defined selection menu is bound by bindSelectionMenu, there will be only the selectMenu_. 180 Then, selectMenuInner_, backButton_, extensionMenu_ will be null. 181 Text selection menu node structure whill be like bellow: 182 -rootNode 183 -selectOverlay(menuWrapper) 184 -selectMenu_(menu) 185 -scroller 186 -customBuilderMenu 187 */ 188 RefPtr<FrameNode> selectMenu_; 189 RefPtr<FrameNode> selectMenuInner_; 190 RefPtr<FrameNode> extensionMenu_; 191 RefPtr<FrameNode> backButton_; 192 193 FrameNodeStatus selectMenuStatus_ = FrameNodeStatus::VISIBLE; 194 FrameNodeStatus extensionMenuStatus_ = FrameNodeStatus::GONE; 195 FrameNodeStatus backButtonStatus_ = FrameNodeStatus::GONE; 196 FrameNodeStatus menuOnlyStatus_ = FrameNodeStatus::VISIBLE; 197 198 std::map<FrameNodeStatus, ExecuteStateFunc> stateFuncs_; 199 200 std::string selectInfo_; 201 202 // Marks whether it is currently in the animated state. 203 bool isDoingAnimation_ = false; 204 205 // Controls that only default menus can be converted to extended menus, and extended menus can be converted to 206 // default menus. 207 bool isExtensionMenu_ = false; 208 209 // Label whether the menu default button needs to appear within the extended menu 210 bool isShowInDefaultMenu_[9] = { false }; 211 212 bool isDefaultBtnOverMaxWidth_ = false; 213 214 ACE_DISALLOW_COPY_AND_MOVE(SelectOverlayNode); 215 }; 216 217 } // namespace OHOS::Ace::NG 218 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_SELECT_OVERLAY_NODE_H 219