1 /*
2  * Copyright (c) 2023 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_SCROLLABLE_PAINT_PROPERTY_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_SCROLLABLE_PAINT_PROPERTY_H
18 
19 #include "core/animation/curve.h"
20 #include "core/animation/curves.h"
21 #include "core/components/common/layout/constants.h"
22 #include "core/components/common/properties/color.h"
23 #include "core/components_ng/pattern/scroll/inner/scroll_bar.h"
24 #include "core/components_ng/render/paint_property.h"
25 
26 namespace OHOS::Ace::NG {
27 class InspectorFilter;
28 
29 struct ScrollBarProperty {
30     ACE_DEFINE_PROPERTY_GROUP_ITEM(ScrollBarMode, DisplayMode);
31     ACE_DEFINE_PROPERTY_GROUP_ITEM(ScrollBarWidth, Dimension);
32     ACE_DEFINE_PROPERTY_GROUP_ITEM(ScrollBarColor, Color);
33 };
34 struct FadingEdgeProperty {
35     ACE_DEFINE_PROPERTY_GROUP_ITEM(FadingEdge, bool);
36     ACE_DEFINE_PROPERTY_GROUP_ITEM(FadingEdgeLength, Dimension);
37 };
38 
39 enum class ContentClipMode {
40     CONTENT_ONLY, // area excluding margin & padding & SafeAreaPadding
41     BOUNDARY,     // corresponding to FrameRect, area excluding margin
42     SAFE_AREA,    // CONTENT_ONLY area + SafeAreaPadding (which can stack up with ancestor's SafeAreaPadding)
43     CUSTOM,       // inner enum, not present in frontend. Custom shape's offset is relative to FrameOffset.
44     DEFAULT,      // Different scrollable components have different default clip values.
45 };
46 using ContentClip = std::pair<ContentClipMode, RefPtr<ShapeRect>>;
47 
48 class ScrollablePaintProperty : public PaintProperty {
49     DECLARE_ACE_TYPE(ScrollablePaintProperty, PaintProperty)
50 
51 public:
52     ScrollablePaintProperty() = default;
53     ~ScrollablePaintProperty() override = default;
54 
55     RefPtr<PaintProperty> Clone() const override;
56 
57     /**
58      * @brief copy paint props from @c src
59      */
60     void CloneProps(const ScrollablePaintProperty* src);
61 
Reset()62     void Reset() override
63     {
64         ResetScrollBarProperty();
65         ResetFadingEdgeProperty();
66         PaintProperty::Reset();
67         ResetContentClip();
68     }
69 
70     void ToJsonValue(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const override;
71 
72     ACE_DEFINE_PROPERTY_GROUP(ScrollBarProperty, ScrollBarProperty);
73     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(ScrollBarProperty, ScrollBarMode, DisplayMode, PROPERTY_UPDATE_RENDER);
74     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(ScrollBarProperty, ScrollBarWidth, Dimension, PROPERTY_UPDATE_RENDER);
75     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(ScrollBarProperty, ScrollBarColor, Color, PROPERTY_UPDATE_RENDER);
76     ACE_DEFINE_PROPERTY_GROUP(FadingEdgeProperty, FadingEdgeProperty);
77     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FadingEdgeProperty, FadingEdge, bool, PROPERTY_UPDATE_RENDER);
78     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FadingEdgeProperty, FadingEdgeLength, Dimension, PROPERTY_UPDATE_RENDER);
79     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(ContentClip, ContentClip, PROPERTY_UPDATE_RENDER);
80     Dimension GetBarWidth() const;
81     Color GetBarColor() const;
82 
83     /**
84      * @brief Return the default content clip mode.
85      */
GetDefaultContentClip()86     virtual ContentClipMode GetDefaultContentClip() const
87     {
88         return ContentClipMode::CONTENT_ONLY;
89     }
90 
91 private:
92     std::string ContentClipToStr() const;
93     std::string GetBarStateString() const;
94 };
95 
96 class GridPaintProperty : public ScrollablePaintProperty {
97     DECLARE_ACE_TYPE(GridPaintProperty, ScrollablePaintProperty)
98 public:
99     RefPtr<PaintProperty> Clone() const override;
100 
GetDefaultContentClip()101     ContentClipMode GetDefaultContentClip() const override
102     {
103         return ContentClipMode::BOUNDARY;
104     }
105 };
106 
107 class ScrollPaintProperty : public ScrollablePaintProperty {
108     DECLARE_ACE_TYPE(ScrollPaintProperty, ScrollablePaintProperty)
109 public:
110     RefPtr<PaintProperty> Clone() const override;
111 
GetDefaultContentClip()112     ContentClipMode GetDefaultContentClip() const override
113     {
114         return ContentClipMode::BOUNDARY;
115     }
116 };
117 } // namespace OHOS::Ace::NG
118 
119 #endif
120