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_EVENT_CLICK_EVENT_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_EVENT_CLICK_EVENT_H 18 19 #include <list> 20 21 #include "base/memory/ace_type.h" 22 #include "base/memory/referenced.h" 23 #include "base/utils/noncopyable.h" 24 #include "core/components_ng/event/gesture_event_actuator.h" 25 #include "core/components_ng/gestures/recognizers/click_recognizer.h" 26 27 namespace OHOS::Ace::NG { 28 29 class GestureEventHub; 30 31 class ClickEvent : public AceType { 32 DECLARE_ACE_TYPE(ClickEvent, AceType); 33 public: ClickEvent(GestureEventFunc && callback)34 explicit ClickEvent(GestureEventFunc&& callback) : callback_(std::move(callback)) {} 35 ~ClickEvent() override = default; 36 GetGestureEventFunc()37 const GestureEventFunc& GetGestureEventFunc() const 38 { 39 return callback_; 40 } 41 operator()42 void operator()(GestureEvent& info) const 43 { 44 if (callback_) { 45 callback_(info); 46 } 47 } 48 SetSysJudge(const GestureJudgeFunc & sysJudge)49 void SetSysJudge(const GestureJudgeFunc& sysJudge) 50 { 51 sysJudge_ = sysJudge; 52 } 53 HasSysGestureJudge()54 bool HasSysGestureJudge() const 55 { 56 return sysJudge_.has_value(); 57 } 58 GetSysJudge()59 std::optional<GestureJudgeFunc> GetSysJudge() const 60 { 61 if (sysJudge_.has_value()) { 62 return sysJudge_.value(); 63 } 64 return nullptr; 65 } 66 67 private: 68 GestureEventFunc callback_; 69 70 std::optional<GestureJudgeFunc> sysJudge_ = nullptr; 71 72 ACE_DISALLOW_COPY_AND_MOVE(ClickEvent); 73 }; 74 75 class ACE_EXPORT ClickEventActuator : public GestureEventActuator { 76 DECLARE_ACE_TYPE(ClickEventActuator, GestureEventActuator); 77 public: 78 explicit ClickEventActuator(const WeakPtr<GestureEventHub>& gestureEventHub); 79 ~ClickEventActuator() override = default; 80 SetUserCallback(GestureEventFunc && callback)81 void SetUserCallback(GestureEventFunc&& callback) 82 { 83 userCallback_ = MakeRefPtr<ClickEvent>(std::move(callback)); 84 } 85 ClearUserCallback()86 void ClearUserCallback() 87 { 88 // When the event param is undefined, it will clear the callback. 89 if (userCallback_) { 90 userCallback_.Reset(); 91 } 92 } 93 IsUserClickable()94 bool IsUserClickable() const 95 { 96 return userCallback_ != nullptr; 97 } 98 IsComponentClickable()99 bool IsComponentClickable() const 100 { 101 return !(clickEvents_.empty() && !clickAfterEvents_ && !userCallback_ && !jsFrameNodeCallback_); 102 } 103 AddClickEvent(const RefPtr<ClickEvent> & clickEvent)104 void AddClickEvent(const RefPtr<ClickEvent>& clickEvent) 105 { 106 if (clickEvents_.empty()) { 107 clickEvents_.emplace_back(clickEvent); 108 return; 109 } 110 if (std::find(clickEvents_.begin(), clickEvents_.end(), clickEvent) == clickEvents_.end()) { 111 clickEvents_.emplace_back(clickEvent); 112 } 113 } 114 AddDistanceThreshold(double distanceThreshold)115 void AddDistanceThreshold(double distanceThreshold) 116 { 117 distanceThreshold_ = Dimension( 118 Dimension(distanceThreshold, DimensionUnit::PX).ConvertToVp(), DimensionUnit::VP); 119 if (distanceThreshold_.ConvertToPx() <= 0) { 120 distanceThreshold_ = Dimension(std::numeric_limits<double>::infinity(), DimensionUnit::PX); 121 } 122 } 123 AddDistanceThreshold(Dimension distanceThreshold)124 void AddDistanceThreshold(Dimension distanceThreshold) 125 { 126 distanceThreshold_ = distanceThreshold; 127 if (distanceThreshold_.ConvertToPx() <= 0) { 128 distanceThreshold_ = Dimension(std::numeric_limits<double>::infinity(), DimensionUnit::PX); 129 } 130 } 131 RemoveClickEvent(const RefPtr<ClickEvent> & clickEvent)132 void RemoveClickEvent(const RefPtr<ClickEvent>& clickEvent) 133 { 134 clickEvents_.remove(clickEvent); 135 } 136 IsClickEventsEmpty()137 bool IsClickEventsEmpty() const 138 { 139 return clickEvents_.empty(); 140 } 141 AddClickAfterEvent(const RefPtr<ClickEvent> & clickEvent)142 void AddClickAfterEvent(const RefPtr<ClickEvent>& clickEvent) 143 { 144 clickAfterEvents_ = std::move(clickEvent); 145 } 146 ClearClickAfterEvent()147 void ClearClickAfterEvent() 148 { 149 // When the event param is undefined, it will clear the callback. 150 if (clickAfterEvents_) { 151 clickAfterEvents_.Reset(); 152 } 153 } 154 155 void OnCollectTouchTarget(const OffsetF& coordinateOffset, const TouchRestrict& touchRestrict, 156 const GetEventTargetImpl& getEventTargetImpl, TouchTestResult& result, 157 ResponseLinkResult& responseLinkResult) override; 158 159 GestureEventFunc GetClickEvent(); 160 std::optional<GestureJudgeFunc> GetSysJudgeFunc() const; 161 GetClickRecognizer()162 const RefPtr<ClickRecognizer>& GetClickRecognizer() 163 { 164 if (!clickRecognizer_) { 165 clickRecognizer_ = MakeRefPtr<ClickRecognizer>(); 166 } 167 return clickRecognizer_; 168 } 169 SetJSFrameNodeCallback(GestureEventFunc && callback)170 void SetJSFrameNodeCallback(GestureEventFunc&& callback) 171 { 172 if (jsFrameNodeCallback_) { 173 jsFrameNodeCallback_.Reset(); 174 } 175 jsFrameNodeCallback_ = MakeRefPtr<ClickEvent>(std::move(callback)); 176 if (!clickRecognizer_) { 177 clickRecognizer_ = MakeRefPtr<ClickRecognizer>(); 178 } 179 } 180 ClearJSFrameNodeCallback()181 void ClearJSFrameNodeCallback() 182 { 183 // When the event param is undefined, it will clear the callback. 184 if (jsFrameNodeCallback_) { 185 jsFrameNodeCallback_.Reset(); 186 } 187 } 188 CopyClickEvent(const RefPtr<ClickEventActuator> & clickEventActuator)189 void CopyClickEvent(const RefPtr<ClickEventActuator>& clickEventActuator) 190 { 191 clickEvents_ = clickEventActuator->clickEvents_; 192 userCallback_ = clickEventActuator->userCallback_; 193 jsFrameNodeCallback_ = clickEventActuator->jsFrameNodeCallback_; 194 if (clickEventActuator->clickRecognizer_) { 195 clickRecognizer_ = MakeRefPtr<ClickRecognizer>(); 196 } 197 } 198 199 private: 200 WeakPtr<GestureEventHub> gestureEventHub_; 201 std::list<RefPtr<ClickEvent>> clickEvents_; 202 RefPtr<ClickEvent> clickAfterEvents_; 203 RefPtr<ClickEvent> userCallback_; 204 RefPtr<ClickEvent> jsFrameNodeCallback_; 205 RefPtr<ClickRecognizer> clickRecognizer_; 206 Dimension distanceThreshold_ = Dimension(std::numeric_limits<double>::infinity(), DimensionUnit::PX); 207 208 ACE_DISALLOW_COPY_AND_MOVE(ClickEventActuator); 209 }; 210 211 } // namespace OHOS::Ace::NG 212 213 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_EVENT_CLICK_EVENT_H 214