1 /*
2  * Copyright (c) 2021-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_V2_LIST_LIST_COMPONENT_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_V2_LIST_LIST_COMPONENT_H
18 
19 #include <list>
20 
21 #include "base/geometry/axis.h"
22 #include "base/geometry/dimension.h"
23 #include "base/utils/macros.h"
24 #include "base/utils/noncopyable.h"
25 #include "core/components/common/properties/scroll_bar.h"
26 #include "core/components/scroll_bar/scroll_bar_proxy.h"
27 #include "core/components_v2/common/common_def.h"
28 #include "core/components_v2/list/list_item_group_component.h"
29 #include "core/components_v2/list/list_position_controller.h"
30 #include "core/components_v2/list/list_properties.h"
31 #include "core/pipeline/base/component_group.h"
32 
33 namespace OHOS::Ace::V2 {
34 
35 class ACE_EXPORT ListComponent : public ComponentGroup {
36     DECLARE_ACE_TYPE(V2::ListComponent, ComponentGroup)
37 
38 public:
39     ListComponent() = default;
40     ~ListComponent() override = default;
41 
42     RefPtr<RenderNode> CreateRenderNode() override;
43     RefPtr<Element> CreateElement() override;
44 
GetItemDivider()45     const std::unique_ptr<ItemDivider>& GetItemDivider() const
46     {
47         return itemDivider_;
48     }
SetItemDivider(std::unique_ptr<ItemDivider> && divider)49     void SetItemDivider(std::unique_ptr<ItemDivider>&& divider)
50     {
51         itemDivider_ = std::move(divider);
52     }
53 
54     ACE_DEFINE_COMPONENT_PROP(Space, Dimension, 0.0_vp);
55     ACE_DEFINE_COMPONENT_PROP(Direction, Axis, Axis::VERTICAL);
56     ACE_DEFINE_COMPONENT_PROP(EdgeEffect, EdgeEffect, EdgeEffect::SPRING);
57     ACE_DEFINE_COMPONENT_PROP(ScrollBar, DisplayMode, DisplayMode::OFF);
58     ACE_DEFINE_COMPONENT_PROP(InitialIndex, int32_t, 0);
59     ACE_DEFINE_COMPONENT_PROP(CachedCount, int32_t, 3);
60     ACE_DEFINE_COMPONENT_PROP(EditMode, bool, false);
61     ACE_DEFINE_COMPONENT_PROP(ScrollController, RefPtr<ListPositionController>);
62     ACE_DEFINE_COMPONENT_PROP(ScrollBarProxy, RefPtr<ScrollBarProxy>);
63     ACE_DEFINE_COMPONENT_PROP(ChainAnimation, bool, false);
64     ACE_DEFINE_COMPONENT_PROP(MultiSelectable, bool, false);
65     ACE_DEFINE_COMPONENT_PROP(HasHeight, bool, false);
66     ACE_DEFINE_COMPONENT_PROP(HasWidth, bool, false);
67     ACE_DEFINE_COMPONENT_PROP(Sticky, StickyStyle, StickyStyle::NONE);
68     ACE_DEFINE_COMPONENT_PROP(ContentStartOffset, float, 0.0f);
69     ACE_DEFINE_COMPONENT_PROP(ContentEndOffset, float, 0.0f);
70 
71     ACE_DEFINE_COMPONENT_EVENT(OnScroll, void(Dimension, ScrollState));
72     ACE_DEFINE_COMPONENT_EVENT(OnScrollIndex, void(int32_t, int32_t, int32_t));
73     ACE_DEFINE_COMPONENT_EVENT(OnReachStart, void());
74     ACE_DEFINE_COMPONENT_EVENT(OnReachEnd, void());
75     ACE_DEFINE_COMPONENT_EVENT(OnScrollStop, void());
76     ACE_DEFINE_COMPONENT_EVENT(OnItemDelete, bool(int32_t));
77     ACE_DEFINE_COMPONENT_EVENT(OnItemMove, bool(int32_t, int32_t));
78 
79     uint32_t Compare(const RefPtr<Component>& component) const override;
80 
GetOnItemDragStartId()81     OnItemDragStartFunc GetOnItemDragStartId() const
82     {
83         return onItemDragStartId_;
84     }
85 
SetOnItemDragStartId(const OnItemDragStartFunc & onItemDragStartId)86     void SetOnItemDragStartId(const OnItemDragStartFunc& onItemDragStartId)
87     {
88         onItemDragStartId_ = onItemDragStartId;
89     }
90 
GetOnItemDragEnterId()91     OnItemDragEnterFunc GetOnItemDragEnterId() const
92     {
93         return onItemDragEnterId_;
94     }
95 
SetOnItemDragEnterId(const OnItemDragEnterFunc & onItemDragEnterId)96     void SetOnItemDragEnterId(const OnItemDragEnterFunc& onItemDragEnterId)
97     {
98         onItemDragEnterId_ = onItemDragEnterId;
99     }
100 
GetOnItemDragMoveId()101     OnItemDragMoveFunc GetOnItemDragMoveId() const
102     {
103         return onItemDragMoveId_;
104     }
105 
SetOnItemDragMoveId(const OnItemDragMoveFunc & onItemDragMoveId)106     void SetOnItemDragMoveId(const OnItemDragMoveFunc& onItemDragMoveId)
107     {
108         onItemDragMoveId_ = onItemDragMoveId;
109     }
110 
GetOnItemDragLeaveId()111     OnItemDragLeaveFunc GetOnItemDragLeaveId() const
112     {
113         return onItemDragLeaveId_;
114     }
115 
SetOnItemDragLeaveId(const OnItemDragLeaveFunc & onItemDragLeaveId)116     void SetOnItemDragLeaveId(const OnItemDragLeaveFunc& onItemDragLeaveId)
117     {
118         onItemDragLeaveId_ = onItemDragLeaveId;
119     }
120 
GetOnItemDropId()121     OnItemDropFunc GetOnItemDropId() const
122     {
123         return onItemDropId_;
124     }
125 
SetOnItemDropId(const OnItemDropFunc & onItemDropId)126     void SetOnItemDropId(const OnItemDropFunc& onItemDropId)
127     {
128         onItemDropId_ = onItemDropId;
129     }
130 
ResetLaneContrain()131     void ResetLaneContrain()
132     {
133         laneContrain_ = std::nullopt;
134     }
135 
SetLaneConstrain(const Dimension & minLength,const Dimension & maxLength)136     void SetLaneConstrain(const Dimension& minLength, const Dimension& maxLength)
137     {
138         laneContrain_.emplace(minLength, maxLength);
139     }
140 
GetLaneConstrain()141     const std::optional<std::pair<Dimension, Dimension>>& GetLaneConstrain() const
142     {
143         return laneContrain_;
144     }
145 
SetLanes(int32_t lanes)146     void SetLanes(int32_t lanes)
147     {
148         ResetLaneContrain();
149         if (lanes <= 0) {
150             lanes_ = 1;
151             return;
152         }
153         lanes_ = lanes;
154     }
155 
GetLanes()156     int32_t GetLanes() const
157     {
158         return lanes_;
159     }
160 
SetListItemAlign(ListItemAlign listItemAlign)161     void SetListItemAlign(ListItemAlign listItemAlign)
162     {
163         listItemAlign_ = listItemAlign;
164     }
165 
GetAlignListItemAlign()166     ListItemAlign GetAlignListItemAlign() const
167     {
168         return listItemAlign_;
169     }
170 
SetOnScrollBegin(const ScrollBeginCallback & onScrollBegin)171     void SetOnScrollBegin(const ScrollBeginCallback& onScrollBegin)
172     {
173         onScrollBegin_ = onScrollBegin;
174     }
175 
GetOnScrollBegin()176     const ScrollBeginCallback& GetOnScrollBegin() const
177     {
178         return onScrollBegin_;
179     }
180 
181 private:
182     std::unique_ptr<ItemDivider> itemDivider_;
183 
184     ScrollBeginCallback onScrollBegin_;
185     OnItemDragStartFunc onItemDragStartId_;
186     OnItemDragEnterFunc onItemDragEnterId_;
187     OnItemDragMoveFunc onItemDragMoveId_;
188     OnItemDragLeaveFunc onItemDragLeaveId_;
189     OnItemDropFunc onItemDropId_;
190     ListItemAlign listItemAlign_ { ListItemAlign::START };
191     std::optional<std::pair<Dimension, Dimension>> laneContrain_;
192     int32_t lanes_ { -1 };
193 
194     ACE_DISALLOW_COPY_AND_MOVE(ListComponent);
195 };
196 
197 } // namespace OHOS::Ace::V2
198 
199 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_V2_LIST_LIST_COMPONENT_H
200