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_LIST_LIST_EVENT_HUB_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_LIST_LIST_EVENT_HUB_H 18 19 #include <stdint.h> 20 21 #include "core/components/hyperlink/hyperlink_resources.h" 22 #include "core/components_ng/base/ui_node.h" 23 #include "core/components_ng/pattern/scrollable/scrollable_event_hub.h" 24 #include "core/components_v2/list/list_component.h" 25 26 namespace OHOS::Ace::NG { 27 constexpr int32_t INVALID_IDX = -1; 28 class ListEventHub : public ScrollableEventHub { 29 DECLARE_ACE_TYPE(ListEventHub, ScrollableEventHub) 30 31 public: 32 ListEventHub() = default; 33 ~ListEventHub() override = default; 34 SetOnScrollBegin(OnScrollBeginEvent && onScrollBegin)35 void SetOnScrollBegin(OnScrollBeginEvent&& onScrollBegin) 36 { 37 onScrollBeginEvent_ = std::move(onScrollBegin); 38 } 39 GetOnScrollBegin()40 const OnScrollBeginEvent& GetOnScrollBegin() const 41 { 42 return onScrollBeginEvent_; 43 } 44 SetOnScrollIndex(OnScrollIndexEvent && onScrollIndex)45 void SetOnScrollIndex(OnScrollIndexEvent&& onScrollIndex) 46 { 47 onScrollIndexEvent_ = std::move(onScrollIndex); 48 } 49 GetOnScrollIndex()50 const OnScrollIndexEvent& GetOnScrollIndex() const 51 { 52 return onScrollIndexEvent_; 53 } 54 SetOnScrollVisibleContentChange(OnScrollVisibleContentChangeEvent && onScrollVisibleContentChange)55 void SetOnScrollVisibleContentChange(OnScrollVisibleContentChangeEvent&& onScrollVisibleContentChange) 56 { 57 OnScrollVisibleContentChangeEvent_ = std::move(onScrollVisibleContentChange); 58 } 59 GetOnScrollVisibleContentChange()60 const OnScrollVisibleContentChangeEvent& GetOnScrollVisibleContentChange() const 61 { 62 return OnScrollVisibleContentChangeEvent_; 63 } 64 SetOnItemMove(OnItemMoveEvent && onItemMove)65 void SetOnItemMove(OnItemMoveEvent&& onItemMove) 66 { 67 onItemMoveEvent_ = std::move(onItemMove); 68 } 69 GetOnItemMove()70 const OnItemMoveEvent& GetOnItemMove() const 71 { 72 return onItemMoveEvent_; 73 } 74 SetOnItemDragStart(OnItemDragStartFunc && onItemDragStart)75 void SetOnItemDragStart(OnItemDragStartFunc&& onItemDragStart) 76 { 77 onItemDragStartEvent_ = std::move(onItemDragStart); 78 } 79 GetOnItemDragStart()80 const OnItemDragStartFunc& GetOnItemDragStart() const 81 { 82 return onItemDragStartEvent_; 83 } 84 SetOnItemDragEnter(OnItemDragEnterFunc && onItemDragEnter)85 void SetOnItemDragEnter(OnItemDragEnterFunc&& onItemDragEnter) 86 { 87 onItemDragEnterEvent_ = std::move(onItemDragEnter); 88 } 89 GetOnItemDragEnter()90 const OnItemDragEnterFunc& GetOnItemDragEnter() const 91 { 92 return onItemDragEnterEvent_; 93 } 94 SetOnItemDragLeave(OnItemDragLeaveFunc && onItemDragLeave)95 void SetOnItemDragLeave(OnItemDragLeaveFunc&& onItemDragLeave) 96 { 97 onItemDragLeaveEvent_ = std::move(onItemDragLeave); 98 } 99 GetOnItemDragLeave()100 const OnItemDragLeaveFunc& GetOnItemDragLeave() const 101 { 102 return onItemDragLeaveEvent_; 103 } 104 SetOnItemDragMove(OnItemDragMoveFunc && onItemDragMove)105 void SetOnItemDragMove(OnItemDragMoveFunc&& onItemDragMove) 106 { 107 onItemDragMoveEvent_ = std::move(onItemDragMove); 108 } 109 GetOnItemDragMove()110 const OnItemDragMoveFunc& GetOnItemDragMove() const 111 { 112 return onItemDragMoveEvent_; 113 } 114 SetOnItemDrop(OnItemDropFunc && onItemDrop)115 void SetOnItemDrop(OnItemDropFunc&& onItemDrop) 116 { 117 onItemDropEvent_ = std::move(onItemDrop); 118 } 119 GetOnItemDrop()120 const OnItemDropFunc& GetOnItemDrop() const 121 { 122 return onItemDropEvent_; 123 } 124 FireOnItemDragStart(const ItemDragInfo & dragInfo,int32_t itemIndex)125 RefPtr<UINode> FireOnItemDragStart(const ItemDragInfo& dragInfo, int32_t itemIndex) const 126 { 127 if (onItemDragStartEvent_) { 128 return AceType::DynamicCast<UINode>(onItemDragStartEvent_(dragInfo, itemIndex)); 129 } 130 return nullptr; 131 } 132 FireOnItemDragEnter(const ItemDragInfo & dragInfo)133 void FireOnItemDragEnter(const ItemDragInfo& dragInfo) const 134 { 135 if (onItemDragEnterEvent_) { 136 onItemDragEnterEvent_(dragInfo); 137 } 138 } 139 FireOnItemDragMove(const ItemDragInfo & dragInfo,int32_t itemIndex,int32_t insertIndex)140 void FireOnItemDragMove(const ItemDragInfo& dragInfo, int32_t itemIndex, int32_t insertIndex) const 141 { 142 if (onItemDragMoveEvent_) { 143 onItemDragMoveEvent_(dragInfo, itemIndex, insertIndex); 144 } 145 } 146 FireOnItemDragLeave(const ItemDragInfo & dragInfo,int32_t itemIndex)147 void FireOnItemDragLeave(const ItemDragInfo& dragInfo, int32_t itemIndex) const 148 { 149 if (onItemDragLeaveEvent_) { 150 onItemDragLeaveEvent_(dragInfo, itemIndex); 151 } 152 } 153 FireOnItemDrop(const ItemDragInfo & dragInfo,int32_t itemIndex,int32_t insertIndex,bool isSuccess)154 bool FireOnItemDrop(const ItemDragInfo& dragInfo, int32_t itemIndex, int32_t insertIndex, bool isSuccess) const 155 { 156 if (onItemDropEvent_) { 157 if (onItemMoveEvent_ && itemIndex >= 0 && insertIndex >= 0) { 158 isSuccess = onItemMoveEvent_(itemIndex, insertIndex); 159 } 160 onItemDropEvent_(dragInfo, itemIndex, insertIndex, isSuccess); 161 return true; 162 } 163 return false; 164 } 165 GetDragExtraParams(const std::string & extraInfo,const Point & point,DragEventType drag)166 std::string GetDragExtraParams(const std::string& extraInfo, const Point& point, DragEventType drag) override 167 { 168 auto json = JsonUtil::Create(true); 169 if (drag == DragEventType::DROP || drag == DragEventType::MOVE) { 170 int32_t index = GetListItemIndexByPosition(point.GetX(), point.GetY()); 171 json->Put("insertIndex", index); 172 } 173 if (!extraInfo.empty()) { 174 json->Put("extraInfo", extraInfo.c_str()); 175 } 176 return json->ToString(); 177 } 178 HasOnItemDragMove()179 bool HasOnItemDragMove() override 180 { 181 return static_cast<bool>(onItemDragMoveEvent_); 182 } 183 HasOnItemDrop()184 bool HasOnItemDrop() override 185 { 186 return static_cast<bool>(onItemDropEvent_); 187 } 188 189 void InitItemDragEvent(const RefPtr<GestureEventHub>& gestureHub); 190 void HandleOnItemDragStart(const GestureEvent& info); 191 void OnItemDragStart(const GestureEvent& info, const DragDropInfo& dragDropInfo); 192 void HandleOnItemDragUpdate(const GestureEvent& info); 193 void HandleOnItemDragEnd(const GestureEvent& info); 194 void HandleOnItemDragCancel(); 195 int32_t GetListItemIndexByPosition(float x, float y, bool strict = false); 196 private: 197 Axis GetDirection() const; 198 199 OnScrollBeginEvent onScrollBeginEvent_; 200 OnScrollIndexEvent onScrollIndexEvent_; 201 OnScrollVisibleContentChangeEvent OnScrollVisibleContentChangeEvent_; 202 OnItemMoveEvent onItemMoveEvent_; 203 OnItemDragStartFunc onItemDragStartEvent_; 204 OnItemDragEnterFunc onItemDragEnterEvent_; 205 OnItemDragLeaveFunc onItemDragLeaveEvent_; 206 OnItemDragMoveFunc onItemDragMoveEvent_; 207 OnItemDropFunc onItemDropEvent_; 208 209 RefPtr<DragDropProxy> dragDropProxy_; 210 int32_t draggedIndex_ = 0; 211 }; 212 213 } // namespace OHOS::Ace::NG 214 215 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_LIST_LIST_EVENT_HUB_H