1 /* 2 * Copyright (c) 2024 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_MANAGER_SELECT_CONTENT_OVERLAY_SELECT_OVERLAY_CALLBACK_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_MANAGER_SELECT_CONTENT_OVERLAY_SELECT_OVERLAY_CALLBACK_H 18 19 #include "base/memory/ace_type.h" 20 #include "base/utils/utils.h" 21 #include "core/components_ng/event/gesture_info.h" 22 #include "core/components_ng/pattern/select_overlay/select_overlay_property.h" 23 #include "core/event/ace_events.h" 24 #include "core/event/touch_event.h" 25 26 namespace OHOS::Ace::NG { 27 28 struct TouchPointInfo { 29 std::optional<PointF> point; 30 int32_t id = -1; 31 Offset offset; 32 ResetTouchPointInfo33 void Reset() 34 { 35 point.reset(); 36 id = -1; 37 offset.Reset(); 38 } 39 40 operator bool() const 41 { 42 return point.has_value(); 43 } 44 IsAwayFromPointTouchPointInfo45 bool IsAwayFromPoint(const TouchEvent& point) 46 { 47 CHECK_NULL_RETURN(id == point.id, false); 48 auto deltaOffset = point.GetOffset() - offset; 49 auto deltaDistance = deltaOffset.GetDistance(); 50 return GreatNotEqual(deltaDistance, Dimension(5.0f, DimensionUnit::VP).ConvertToPx()); 51 } 52 }; 53 54 struct OverlayInfo : public virtual AceType { 55 DECLARE_ACE_TYPE(OverlayInfo, AceType); 56 57 public: 58 bool isSingleHandle = false; 59 bool isShowMenu = false; 60 bool isHiddenHandle = false; 61 CanBackPressedOverlayInfo62 bool CanBackPressed() 63 { 64 return isSingleHandle && !isShowMenu && isHiddenHandle; 65 } 66 }; 67 68 class ACE_EXPORT SelectOverlayCallback : public virtual AceType { 69 DECLARE_ACE_TYPE(SelectOverlayCallback, AceType); 70 71 public: 72 SelectOverlayCallback() = default; 73 ~SelectOverlayCallback() override = default; OnAfterSelectOverlayShow(bool isCreate)74 virtual void OnAfterSelectOverlayShow(bool isCreate) {} OnMenuItemAction(OptionMenuActionId id,OptionMenuType type)75 virtual void OnMenuItemAction(OptionMenuActionId id, OptionMenuType type) {} 76 OnOverlayTouchDown(const TouchEventInfo & event)77 virtual void OnOverlayTouchDown(const TouchEventInfo& event) {} OnOverlayTouchUp(const TouchEventInfo & event)78 virtual void OnOverlayTouchUp(const TouchEventInfo& event) {} OnOverlayTouchMove(const TouchEventInfo & event)79 virtual void OnOverlayTouchMove(const TouchEventInfo& event) {} OnOverlayClick(const GestureEvent & event,bool isClickCaret)80 virtual void OnOverlayClick(const GestureEvent& event, bool isClickCaret) {} OnHandleMouseEvent(const MouseInfo & event)81 virtual void OnHandleMouseEvent(const MouseInfo& event) {} IsRegisterTouchCallback()82 virtual bool IsRegisterTouchCallback() 83 { 84 return false; 85 } 86 OnHandleMoveStart(const GestureEvent & event,bool isFirst)87 virtual void OnHandleMoveStart(const GestureEvent& event, bool isFirst) {} OnHandleMove(const RectF & rect,bool isFirst)88 virtual void OnHandleMove(const RectF& rect, bool isFirst) {} OnHandleMoveDone(const RectF & rect,bool isFirst)89 virtual void OnHandleMoveDone(const RectF& rect, bool isFirst) {} OnHandleReverse(bool isReverse)90 virtual void OnHandleReverse(bool isReverse) {} IsRegisterHandleCallback()91 virtual bool IsRegisterHandleCallback() 92 { 93 return true; 94 } 95 virtual void OnCloseOverlay(OptionMenuType menuType, CloseReason reason, RefPtr<OverlayInfo> info = nullptr) {} 96 virtual bool CheckTouchInHostNode(const PointF& touchPoint) = 0; 97 virtual void OnHandleGlobalTouchEvent(SourceType sourceType, TouchType touchType, bool touchInside = true) {}; OnHandleGlobalEvent(const PointF & touchPoint,const PointF & localPoint,const TouchEvent & event)98 virtual void OnHandleGlobalEvent(const PointF& touchPoint, const PointF& localPoint, const TouchEvent& event) 99 { 100 bool touchInside = CheckTouchInHostNode(localPoint); 101 if (event.type == TouchType::DOWN) { 102 isIntercept_ = event.sourceType != SourceType::MOUSE && touchInside; 103 } 104 CHECK_NULL_VOID(!isIntercept_); 105 if (event.type == TouchType::UP) { 106 isIntercept_ = false; 107 } 108 if (event.sourceType == SourceType::MOUSE && event.type == TouchType::DOWN) { 109 OnHandleGlobalTouchEvent(SourceType::MOUSE, TouchType::DOWN, touchInside); 110 return; 111 } 112 if (event.sourceType == SourceType::TOUCH || event.sourceType == SourceType::TOUCH_PAD) { 113 if (event.type == TouchType::DOWN) { 114 downPointInfo_ = { touchPoint, event.id, event.GetOffset() }; 115 return; 116 } 117 if (event.type == TouchType::MOVE && downPointInfo_ && 118 downPointInfo_.IsAwayFromPoint(event)) { 119 downPointInfo_.Reset(); 120 return; 121 } 122 if (event.type == TouchType::UP && downPointInfo_) { 123 OnHandleGlobalTouchEvent(event.sourceType, TouchType::UP); 124 downPointInfo_.Reset(); 125 } 126 } 127 } 128 OnUnbind()129 void OnUnbind() 130 { 131 downPointInfo_.Reset(); 132 isIntercept_ = false; 133 } 134 OnHandleLevelModeChanged(HandleLevelMode mode)135 virtual void OnHandleLevelModeChanged(HandleLevelMode mode) {} CheckSwitchToMode(HandleLevelMode mode)136 virtual bool CheckSwitchToMode(HandleLevelMode mode) { 137 return true; 138 } OnHandleIsHidden()139 virtual void OnHandleIsHidden() {} 140 141 private: 142 bool isIntercept_ = false; 143 TouchPointInfo downPointInfo_; 144 ACE_DISALLOW_COPY_AND_MOVE(SelectOverlayCallback); 145 }; 146 } // namespace OHOS::Ace::NG 147 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_MANAGER_SELECT_CONTENT_OVERLAY_SELECT_OVERLAY_CALLBACK_H 148