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_TOAST_TOAST_LAYOUT_PROPERTY_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_TOAST_TOAST_LAYOUT_PROPERTY_H
18 
19 #include "base/geometry/dimension.h"
20 #include "core/components_ng/base/inspector_filter.h"
21 #include "core/components_ng/layout/layout_property.h"
22 #include "core/components_ng/property/property.h"
23 
24 namespace OHOS::Ace::NG {
25 enum class ToastShowMode {
26     DEFAULT = 0,
27     TOP_MOST = 1,
28     SYSTEM_TOP_MOST = 2,
29 };
30 
31 struct ToastInfo {
32     std::string message;
33     int32_t duration = 0;
34     std::string bottom;
35     bool isRightToLeft = false;
36     ToastShowMode showMode = ToastShowMode::DEFAULT;
37     int32_t alignment = 0;
38     std::optional<DimensionOffset> offset;
39     std::optional<Color> backgroundColor;
40     std::optional<Color> textColor;
41     std::optional<int32_t> backgroundBlurStyle;
42     std::optional<Shadow> shadow;
43     bool isTypeStyleShadow = true;
44     bool enableHoverMode = false;
45     HoverModeAreaType hoverModeArea = HoverModeAreaType::BOTTOM_SCREEN;
46 };
47 class ACE_EXPORT ToastLayoutProperty : public LayoutProperty {
48     DECLARE_ACE_TYPE(ToastLayoutProperty, LayoutProperty);
49 
50 public:
51     ToastLayoutProperty() = default;
52     ~ToastLayoutProperty() override = default;
53 
Clone()54     RefPtr<LayoutProperty> Clone() const override
55     {
56         auto props = MakeRefPtr<ToastLayoutProperty>();
57         props->LayoutProperty::UpdateLayoutProperty(DynamicCast<LayoutProperty>(this));
58         props->propBottom_ = CloneBottom();
59         props->propShowMode_ = CloneShowMode();
60         props->propEnableHoverMode_ = CloneEnableHoverMode();
61         props->propHoverModeArea_ = CloneHoverModeArea();
62         return props;
63     }
64 
Reset()65     void Reset() override
66     {
67         LayoutProperty::Reset();
68         ResetBottom();
69         ResetShowMode();
70         ResetEnableHoverMode();
71         ResetHoverModeArea();
72     }
73 
74     enum class SelectStatus {
75         OFF = 0,
76         ON,
77         NONE,
78     };
79 
GetSelectStatus()80     SelectStatus& GetSelectStatus()
81     {
82         return propStatus_;
83     }
84 
SetSelectStatus(const SelectStatus & status)85     void SetSelectStatus(const SelectStatus& status)
86     {
87         propStatus_ = status;
88     }
89 
90     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(ToastAlignment, Alignment, PROPERTY_UPDATE_MEASURE);
91     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(ToastOffset, DimensionOffset, PROPERTY_UPDATE_MEASURE);
92     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(Bottom, Dimension, PROPERTY_UPDATE_MEASURE);
93     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(ShowMode, ToastShowMode, PROPERTY_UPDATE_LAYOUT);
94     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(EnableHoverMode, bool, PROPERTY_UPDATE_LAYOUT);
95     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(HoverModeArea, HoverModeAreaType, PROPERTY_UPDATE_LAYOUT);
96 
ToJsonValue(std::unique_ptr<JsonValue> & json,const InspectorFilter & filter)97     void ToJsonValue(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const override
98     {
99         LayoutProperty::ToJsonValue(json, filter);
100         /* no fixed attr below, just return */
101         if (filter.IsFastFilter()) {
102             return;
103         }
104         json->PutExtAttr("Bottom", GetBottom()->ToString().c_str(), filter);
105         json->PutExtAttr("ToastShowMode",
106             GetShowModeValue(ToastShowMode::DEFAULT) == ToastShowMode::DEFAULT ? "DEFAULT" : "TOP_MOST", filter);
107         if (HasToastAlignment()) {
108             json->PutExtAttr("alignment", GetToastAlignmentValue(Alignment::BOTTOM_CENTER)
109                 .GetAlignmentStr(TextDirection::AUTO).c_str(), filter);
110         }
111         auto offsetValue = JsonUtil::Create(true);
112         offsetValue->Put("dX", propToastOffset_.value_or(DimensionOffset()).GetX().ConvertToVp());
113         offsetValue->Put("dY", propToastOffset_.value_or(DimensionOffset()).GetY().ConvertToVp());
114         json->PutExtAttr("offset", offsetValue, filter);
115         json->PutExtAttr("EnableHoverMode", propEnableHoverMode_.value_or(false) ? "true" : "false", filter);
116         json->PutExtAttr("HoverModeAreaType",
117             GetHoverModeAreaValue(HoverModeAreaType::BOTTOM_SCREEN) ==
118                 HoverModeAreaType::BOTTOM_SCREEN ? "BOTTOM_SCREEN" : "TOP_SCREEN", filter);
119     }
120 
121 private:
122     ACE_DISALLOW_COPY_AND_MOVE(ToastLayoutProperty);
123     SelectStatus propStatus_ = SelectStatus::NONE;
124 };
125 } // namespace OHOS::Ace::NG
126 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_TOAST_TOAST_LAYOUT_PROPERTY_H
127