1 /* 2 * Copyright (c) 2022-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_PATTERN_GRID_GRID_EVENT_HUB_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_GRID_GRID_EVENT_HUB_H 18 19 #include <functional> 20 21 #include "core/components_ng/base/ui_node.h" 22 #include "core/components_ng/pattern/scrollable/scrollable_event_hub.h" 23 #include "core/components_v2/grid/grid_event.h" 24 25 namespace OHOS::Ace::NG { 26 27 using ScrollToIndexFunc = std::function<void(const BaseEventInfo*)>; 28 using ScrollBarUpdateFunc = std::function<std::pair<std::optional<float>, std::optional<float>>(int32_t, Dimension)>; 29 using ItemDragStartFunc = std::function<RefPtr<UINode>(const ItemDragInfo&, int32_t)>; 30 using ItemDragEnterFunc = std::function<void(const ItemDragInfo&)>; 31 using ItemDragMoveFunc = std::function<void(const ItemDragInfo&, int32_t, int32_t)>; 32 using ItemDragLeaveFunc = std::function<void(const ItemDragInfo&, int32_t)>; 33 using ItemDropFunc = std::function<void(const ItemDragInfo&, int32_t, int32_t, bool)>; 34 using ScrollIndexFunc = std::function<void(int32_t, int32_t)>; 35 36 class GridEventHub : public ScrollableEventHub { 37 DECLARE_ACE_TYPE(GridEventHub, ScrollableEventHub); 38 39 public: 40 GridEventHub() = default; 41 ~GridEventHub() override = default; 42 FireOnDisappear()43 void FireOnDisappear() override 44 { 45 EventHub::FireOnDisappear(); 46 HandleOnItemDragCancel(); 47 } 48 SetOnScrollToIndex(ScrollToIndexFunc && onScrollToIndex)49 void SetOnScrollToIndex(ScrollToIndexFunc&& onScrollToIndex) 50 { 51 onScrollToIndex_ = std::move(onScrollToIndex); 52 } 53 SetOnScrollBarUpdate(ScrollBarUpdateFunc && onScrollBarUpdate)54 void SetOnScrollBarUpdate(ScrollBarUpdateFunc&& onScrollBarUpdate) 55 { 56 onScrollBarUpdate_ = std::move(onScrollBarUpdate); 57 } 58 SetOnItemDragStart(ItemDragStartFunc && onItemDragStart)59 void SetOnItemDragStart(ItemDragStartFunc&& onItemDragStart) 60 { 61 onItemDragStart_ = std::move(onItemDragStart); 62 } 63 SetOnItemDragEnter(ItemDragEnterFunc && onItemDragEnter)64 void SetOnItemDragEnter(ItemDragEnterFunc&& onItemDragEnter) 65 { 66 onItemDragEnter_ = std::move(onItemDragEnter); 67 } 68 SetOnItemDragMove(ItemDragMoveFunc && onItemDragMove)69 void SetOnItemDragMove(ItemDragMoveFunc&& onItemDragMove) 70 { 71 onItemDragMove_ = std::move(onItemDragMove); 72 } 73 SetOnItemDragLeave(ItemDragLeaveFunc && onItemDragLeave)74 void SetOnItemDragLeave(ItemDragLeaveFunc&& onItemDragLeave) 75 { 76 onItemDragLeave_ = std::move(onItemDragLeave); 77 } 78 SetOnItemDrop(ItemDropFunc && onItemDrop)79 void SetOnItemDrop(ItemDropFunc&& onItemDrop) 80 { 81 onItemDrop_ = std::move(onItemDrop); 82 } 83 FireOnScrollToIndex(int32_t param)84 void FireOnScrollToIndex(int32_t param) const 85 { 86 if (onScrollToIndex_) { 87 V2::GridEventInfo info(param); 88 onScrollToIndex_(&info); 89 } 90 } 91 SetOnScrollIndex(ScrollIndexFunc && onScrollIndex)92 void SetOnScrollIndex(ScrollIndexFunc&& onScrollIndex) 93 { 94 onScrollIndexEvent_ = std::move(onScrollIndex); 95 } 96 GetOnScrollIndex()97 const ScrollIndexFunc& GetOnScrollIndex() const 98 { 99 return onScrollIndexEvent_; 100 } 101 SetJSFrameNodeOnGridScrollIndex(ScrollIndexFunc && onScroll)102 void SetJSFrameNodeOnGridScrollIndex(ScrollIndexFunc&& onScroll) 103 { 104 onJSFrameNodeScrollIndexEvent_ = std::move(onScroll); 105 } 106 ClearJSFrameNodeOnGridScrollIndex()107 void ClearJSFrameNodeOnGridScrollIndex() 108 { 109 if (onJSFrameNodeScrollIndexEvent_) { 110 onJSFrameNodeScrollIndexEvent_ = nullptr; 111 } 112 } 113 GetJSFrameNodeOnGridScrollIndex()114 const ScrollIndexFunc& GetJSFrameNodeOnGridScrollIndex() const 115 { 116 return onJSFrameNodeScrollIndexEvent_; 117 } 118 FireOnScrollBarUpdate(int32_t index,const Dimension & offset)119 std::pair<std::optional<float>, std::optional<float>> FireOnScrollBarUpdate(int32_t index, const Dimension& offset) 120 { 121 if (onScrollBarUpdate_) { 122 return onScrollBarUpdate_(index, offset); 123 } 124 return std::pair<std::optional<float>, std::optional<float>>(); 125 } 126 FireOnItemDragStart(const ItemDragInfo & dragInfo,int32_t itemIndex)127 RefPtr<UINode> FireOnItemDragStart(const ItemDragInfo& dragInfo, int32_t itemIndex) const 128 { 129 if (onItemDragStart_) { 130 return onItemDragStart_(dragInfo, itemIndex); 131 } 132 return nullptr; 133 } 134 135 void FireOnItemDragEnter(const ItemDragInfo& dragInfo); 136 137 void FireOnItemDragMove(const ItemDragInfo& dragInfo, int32_t itemIndex, int32_t insertIndex) const; 138 139 void FireOnItemDragLeave(const ItemDragInfo& dragInfo, int32_t itemIndex); 140 141 bool FireOnItemDrop(const ItemDragInfo& dragInfo, int32_t itemIndex, int32_t insertIndex, bool isSuccess); 142 HasOnItemDragMove()143 bool HasOnItemDragMove() override 144 { 145 return static_cast<bool>(onItemDragMove_); 146 } 147 HasOnItemDrop()148 bool HasOnItemDrop() override 149 { 150 return static_cast<bool>(onItemDrop_); 151 } 152 153 void InitItemDragEvent(const RefPtr<GestureEventHub>& gestureHub); 154 void HandleOnItemDragStart(const GestureEvent& info); 155 void HandleOnItemDragUpdate(const GestureEvent& info); 156 void HandleOnItemDragEnd(const GestureEvent& info); 157 void HandleOnItemDragCancel(); 158 int32_t GetGridItemIndex(const RefPtr<FrameNode>& frameNode); 159 bool CheckPostionInGrid(float x, float y); 160 int32_t GetInsertPosition(float x, float y); 161 int GetFrameNodeChildSize(); 162 163 private: 164 bool GetEditable() const; 165 void MoveItems(int32_t itemIndex, int32_t insertIndex) const; 166 167 ScrollToIndexFunc onScrollToIndex_; 168 ScrollBarUpdateFunc onScrollBarUpdate_; 169 ItemDragStartFunc onItemDragStart_; 170 ItemDragEnterFunc onItemDragEnter_; 171 ItemDragMoveFunc onItemDragMove_; 172 ItemDragLeaveFunc onItemDragLeave_; 173 ItemDropFunc onItemDrop_; 174 RefPtr<DragDropProxy> dragDropProxy_; 175 int32_t draggedIndex_ = 0; 176 RefPtr<FrameNode> draggingItem_; 177 178 ScrollIndexFunc onScrollIndexEvent_; 179 ScrollIndexFunc onJSFrameNodeScrollIndexEvent_; 180 }; 181 182 } // namespace OHOS::Ace::NG 183 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_GRID_GRID_EVENT_HUB_H