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_PATTERN_LIST_LIST_PAINT_METHOD_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_LIST_LIST_PAINT_METHOD_H 18 19 #include "core/components_ng/pattern/list/list_content_modifier.h" 20 #include "core/components_ng/pattern/scroll/inner/scroll_bar.h" 21 #include "core/components_ng/pattern/scroll/scroll_edge_effect.h" 22 #include "core/components_ng/render/node_paint_method.h" 23 #include "core/components_v2/list/list_properties.h" 24 25 namespace OHOS::Ace::NG { 26 struct DividerInfo { 27 float constrainStrokeWidth = 0.0f; 28 float mainSize = 0.0f; 29 float crossSize = 0.0f; 30 float mainPadding = 0.0f; 31 float crossPadding = 0.0f; 32 float startMargin = 0.0f; 33 float endMargin = 0.0f; 34 float space = 0.0f; 35 float laneGutter = 0.0f; 36 int32_t lanes = 1; 37 int32_t totalItemCount = 0; 38 Color color = Color::TRANSPARENT; 39 bool isVertical = true; 40 }; 41 42 class ACE_EXPORT ListPaintMethod : public NodePaintMethod { 43 DECLARE_ACE_TYPE(ListPaintMethod, NodePaintMethod) 44 public: 45 using PositionMap = ListLayoutAlgorithm::PositionMap; ListPaintMethod(const V2::ItemDivider & divider,bool vertical,int32_t lanes,float space)46 ListPaintMethod( 47 const V2::ItemDivider& divider, bool vertical, int32_t lanes, float space) 48 : divider_(divider), vertical_(vertical), lanes_(lanes), space_(space) 49 {} 50 ~ListPaintMethod() override = default; 51 52 CanvasDrawFunction GetForegroundDrawFunction(PaintWrapper* paintWrapper) override; 53 GetContentModifier(PaintWrapper * paintWrapper)54 RefPtr<Modifier> GetContentModifier(PaintWrapper* paintWrapper) override 55 { 56 return listContentModifier_; 57 } 58 59 void UpdateContentModifier(PaintWrapper* paintWrapper) override; 60 61 void UpdateDividerList(const DividerInfo& dividerInfo); 62 63 ListDivider HandleDividerList(int32_t index, bool lastIsGroup, int32_t laneIdx, const DividerInfo& dividerInfo); 64 ListDivider HandleLastLineIndex(int32_t index, int32_t laneIdx, const DividerInfo& dividerInfo); 65 66 void PaintEdgeEffect(PaintWrapper* paintWrapper, RSCanvas& canvas); 67 SetScrollBar(WeakPtr<ScrollBar> && scrollBar)68 void SetScrollBar(WeakPtr<ScrollBar>&& scrollBar) 69 { 70 scrollBar_ = scrollBar; 71 } 72 SetEdgeEffect(WeakPtr<ScrollEdgeEffect> && edgeEffect)73 void SetEdgeEffect(WeakPtr<ScrollEdgeEffect>&& edgeEffect) 74 { 75 edgeEffect_ = edgeEffect; 76 } 77 SetTotalItemCount(int32_t totalItemCount)78 void SetTotalItemCount(int32_t totalItemCount) 79 { 80 totalItemCount_ = totalItemCount; 81 } 82 SetDirection(bool isRTL)83 void SetDirection(bool isRTL) 84 { 85 isRTL_ = isRTL; 86 } 87 SetContentModifier(const RefPtr<ListContentModifier> & modify)88 void SetContentModifier(const RefPtr<ListContentModifier>& modify) 89 { 90 listContentModifier_ = modify; 91 } 92 SetItemsPosition(const PositionMap & positionMap,const std::set<int32_t> & pressedItem)93 void SetItemsPosition(const PositionMap& positionMap, const std::set<int32_t>& pressedItem) 94 { 95 itemPosition_ = positionMap; 96 if (!pressedItem.empty()) { 97 for (auto& child : itemPosition_) { 98 if (pressedItem.find(child.second.id) != pressedItem.end()) { 99 child.second.isPressed = true; 100 } 101 } 102 } 103 } 104 SetLaneGutter(float laneGutter)105 void SetLaneGutter(float laneGutter) 106 { 107 laneGutter_ = laneGutter; 108 } 109 GetLaneGutter()110 float GetLaneGutter() 111 { 112 return laneGutter_; 113 } 114 SetScrollBarOverlayModifier(WeakPtr<ScrollBarOverlayModifier> && scrollBarOverlayModifier)115 void SetScrollBarOverlayModifier(WeakPtr<ScrollBarOverlayModifier>&& scrollBarOverlayModifier) 116 { 117 scrollBarOverlayModifier_ = scrollBarOverlayModifier; 118 } 119 GetOverlayModifier(PaintWrapper * paintWrapper)120 RefPtr<Modifier> GetOverlayModifier(PaintWrapper* paintWrapper) override 121 { 122 return scrollBarOverlayModifier_.Upgrade(); 123 } 124 125 void UpdateOverlayModifier(PaintWrapper* paintWrapper) override; 126 127 private: 128 V2::ItemDivider divider_; 129 bool vertical_ = false; 130 int32_t lanes_ = 1; 131 int32_t totalItemCount_ = 0; 132 float space_; 133 float laneGutter_ = 0.0f; 134 PositionMap itemPosition_; 135 RefPtr<ListContentModifier> listContentModifier_; 136 137 WeakPtr<ScrollBar> scrollBar_; 138 WeakPtr<ScrollEdgeEffect> edgeEffect_; 139 WeakPtr<ScrollBarOverlayModifier> scrollBarOverlayModifier_; 140 bool isRTL_ = false; 141 }; 142 } // namespace OHOS::Ace::NG 143 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_LIST_LIST_PAINT_METHOD_H