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 FireOnScrollBarUpdate(int32_t index,const Dimension & offset)102 std::pair<std::optional<float>, std::optional<float>> FireOnScrollBarUpdate(int32_t index, const Dimension& offset) 103 { 104 if (onScrollBarUpdate_) { 105 return onScrollBarUpdate_(index, offset); 106 } 107 return std::pair<std::optional<float>, std::optional<float>>(); 108 } 109 FireOnItemDragStart(const ItemDragInfo & dragInfo,int32_t itemIndex)110 RefPtr<UINode> FireOnItemDragStart(const ItemDragInfo& dragInfo, int32_t itemIndex) const 111 { 112 if (onItemDragStart_) { 113 return onItemDragStart_(dragInfo, itemIndex); 114 } 115 return nullptr; 116 } 117 118 void FireOnItemDragEnter(const ItemDragInfo& dragInfo); 119 120 void FireOnItemDragMove(const ItemDragInfo& dragInfo, int32_t itemIndex, int32_t insertIndex) const; 121 122 void FireOnItemDragLeave(const ItemDragInfo& dragInfo, int32_t itemIndex); 123 124 bool FireOnItemDrop(const ItemDragInfo& dragInfo, int32_t itemIndex, int32_t insertIndex, bool isSuccess); 125 HasOnItemDragMove()126 bool HasOnItemDragMove() override 127 { 128 return static_cast<bool>(onItemDragMove_); 129 } 130 HasOnItemDrop()131 bool HasOnItemDrop() override 132 { 133 return static_cast<bool>(onItemDrop_); 134 } 135 136 void InitItemDragEvent(const RefPtr<GestureEventHub>& gestureHub); 137 void HandleOnItemDragStart(const GestureEvent& info); 138 void HandleOnItemDragUpdate(const GestureEvent& info); 139 void HandleOnItemDragEnd(const GestureEvent& info); 140 void HandleOnItemDragCancel(); 141 int32_t GetGridItemIndex(const RefPtr<FrameNode>& frameNode); 142 bool CheckPostionInGrid(float x, float y); 143 int32_t GetInsertPosition(float x, float y); 144 int GetFrameNodeChildSize(); 145 146 private: 147 bool GetEditable() const; 148 void MoveItems(int32_t itemIndex, int32_t insertIndex) const; 149 150 ScrollToIndexFunc onScrollToIndex_; 151 ScrollBarUpdateFunc onScrollBarUpdate_; 152 ItemDragStartFunc onItemDragStart_; 153 ItemDragEnterFunc onItemDragEnter_; 154 ItemDragMoveFunc onItemDragMove_; 155 ItemDragLeaveFunc onItemDragLeave_; 156 ItemDropFunc onItemDrop_; 157 RefPtr<DragDropProxy> dragDropProxy_; 158 int32_t draggedIndex_ = 0; 159 RefPtr<FrameNode> draggingItem_; 160 161 ScrollIndexFunc onScrollIndexEvent_; 162 }; 163 164 } // namespace OHOS::Ace::NG 165 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_GRID_GRID_EVENT_HUB_H