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 #include "core/components_ng/pattern/badge/badge_model_ng.h"
17 
18 #include "base/utils/utils.h"
19 #include "core/components/badge/badge_theme.h"
20 #include "core/components/common/layout/constants.h"
21 #include "core/components/common/properties/color.h"
22 #include "core/components_ng/base/view_stack_processor.h"
23 #include "core/components_ng/pattern/badge/badge_pattern.h"
24 #include "core/components_ng/pattern/text/text_pattern.h"
25 #include "core/components_v2/inspector/inspector_constants.h"
26 #include "core/pipeline/pipeline_base.h"
27 
28 namespace OHOS::Ace::NG {
Create(BadgeParameters & badgeParameters)29 void BadgeModelNG::Create(BadgeParameters& badgeParameters)
30 {
31     auto* stack = ViewStackProcessor::GetInstance();
32     int32_t nodeId = (stack == nullptr ? 0 : stack->ClaimNodeId());
33     ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::BADGE_ETS_TAG, nodeId);
34     auto frameNode = FrameNode::GetOrCreateFrameNode(
35         V2::BADGE_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<BadgePattern>(); });
36     ViewStackProcessor::GetInstance()->Push(frameNode);
37 
38     auto pipeline = PipelineBase::GetCurrentContext();
39     CHECK_NULL_VOID(pipeline);
40     auto badgeTheme = pipeline->GetTheme<BadgeTheme>();
41 
42     auto layoutProperty = frameNode->GetLayoutProperty<BadgeLayoutProperty>();
43     layoutProperty->SetIsDefault(isDefaultFontSize_, isDefaultBadgeSize_);
44 
45     if (badgeParameters.badgeValue.has_value()) {
46         layoutProperty->UpdateBadgeValue(badgeParameters.badgeValue.value());
47     }
48     if (badgeParameters.badgeCount.has_value()) {
49         layoutProperty->UpdateBadgeCount(badgeParameters.badgeCount.value());
50     }
51     if (badgeParameters.badgeMaxCount.has_value()) {
52         layoutProperty->UpdateBadgeMaxCount(badgeParameters.badgeMaxCount.value());
53     } else {
54         layoutProperty->UpdateBadgeMaxCount(badgeTheme->GetMaxCount());
55     }
56 
57     if (badgeParameters.badgePosition.has_value()) {
58         auto badgePosition = static_cast<BadgePosition>(badgeParameters.badgePosition.value());
59         layoutProperty->UpdateBadgePosition(badgePosition);
60     } else {
61         layoutProperty->UpdateBadgePosition(badgeTheme->GetBadgePosition());
62     }
63     if (badgeParameters.badgePositionX.has_value()) {
64         layoutProperty->UpdateBadgePositionX(badgeParameters.badgePositionX.value());
65     } else {
66         layoutProperty->UpdateBadgePositionX(badgeTheme->GetBadgePositionX());
67     }
68     if (badgeParameters.badgePositionY.has_value()) {
69         layoutProperty->UpdateBadgePositionY(badgeParameters.badgePositionY.value());
70     } else {
71         layoutProperty->UpdateBadgePositionY(badgeTheme->GetBadgePositionY());
72     }
73     if (badgeParameters.isPositionXy.has_value()) {
74         layoutProperty->UpdateIsPositionXy(badgeParameters.isPositionXy.value());
75     } else {
76         layoutProperty->UpdateIsPositionXy(badgeTheme->GetIsPositionXy());
77     }
78     UpdateBadgeStyle(badgeParameters, frameNode);
79 }
80 
UpdateBadgeStyle(BadgeParameters & badgeParameters,const RefPtr<FrameNode> & frameNode)81 void BadgeModelNG::UpdateBadgeStyle(BadgeParameters& badgeParameters, const RefPtr<FrameNode>& frameNode)
82 {
83     auto pipeline = PipelineBase::GetCurrentContext();
84     CHECK_NULL_VOID(pipeline);
85     auto badgeTheme = pipeline->GetTheme<BadgeTheme>();
86     auto layoutProperty = frameNode->GetLayoutProperty<BadgeLayoutProperty>();
87     if (badgeParameters.badgeColor.has_value()) {
88         layoutProperty->UpdateBadgeColor(badgeParameters.badgeColor.value());
89     } else {
90         layoutProperty->UpdateBadgeColor(badgeTheme->GetBadgeColor());
91     }
92     if (badgeParameters.badgeTextColor.has_value()) {
93         layoutProperty->UpdateBadgeTextColor(badgeParameters.badgeTextColor.value());
94     } else {
95         layoutProperty->UpdateBadgeTextColor(badgeTheme->GetBadgeTextColor());
96     }
97     if (badgeParameters.badgeFontSize.has_value()) {
98         layoutProperty->UpdateBadgeFontSize(badgeParameters.badgeFontSize.value());
99     }
100     if (badgeParameters.badgeCircleSize.has_value()) {
101         layoutProperty->UpdateBadgeCircleSize(badgeParameters.badgeCircleSize.value());
102     }
103     if (badgeParameters.badgeBorderColor.has_value()) {
104         layoutProperty->UpdateBadgeBorderColor(badgeParameters.badgeBorderColor.value());
105     } else {
106         layoutProperty->UpdateBadgeBorderColor(badgeTheme->GetBadgeBorderColor());
107     }
108     if (badgeParameters.badgeBorderWidth.has_value()) {
109         layoutProperty->UpdateBadgeBorderWidth(badgeParameters.badgeBorderWidth.value());
110     } else {
111         layoutProperty->UpdateBadgeBorderWidth(badgeTheme->GetBadgeBorderWidth());
112     }
113     if (badgeParameters.badgeFontWeight.has_value()) {
114         layoutProperty->UpdateBadgeFontWeight(badgeParameters.badgeFontWeight.value());
115     } else {
116         layoutProperty->UpdateBadgeFontWeight(FontWeight::NORMAL);
117     }
118 }
119 
CreateFrameNode(int32_t nodeId)120 RefPtr<FrameNode> BadgeModelNG::CreateFrameNode(int32_t nodeId)
121 {
122     auto frameNode = FrameNode::CreateFrameNode(V2::BADGE_ETS_TAG, nodeId, AceType::MakeRefPtr<BadgePattern>());
123     CHECK_NULL_RETURN(frameNode, nullptr);
124     return frameNode;
125 }
126 
SetBadgeParam(FrameNode * frameNode,BadgeParameters & badgeParameters,bool isDefaultFontSize,bool isDefaultBadgeSize)127 void BadgeModelNG::SetBadgeParam(
128     FrameNode* frameNode, BadgeParameters& badgeParameters, bool isDefaultFontSize, bool isDefaultBadgeSize)
129 {
130     CHECK_NULL_VOID(frameNode);
131     auto pipeline = frameNode->GetContextRefPtr();
132     CHECK_NULL_VOID(pipeline);
133     auto badgeTheme = pipeline->GetTheme<BadgeTheme>();
134     CHECK_NULL_VOID(badgeTheme);
135     auto layoutProperty = frameNode->GetLayoutProperty<BadgeLayoutProperty>();
136     CHECK_NULL_VOID(layoutProperty);
137     layoutProperty->SetIsDefault(isDefaultFontSize, isDefaultBadgeSize);
138     if (badgeParameters.badgeValue.has_value()) {
139         layoutProperty->UpdateBadgeValue(badgeParameters.badgeValue.value());
140     } else {
141         layoutProperty->ResetBadgeValue();
142     }
143     if (badgeParameters.badgeCount.has_value()) {
144         layoutProperty->UpdateBadgeCount(badgeParameters.badgeCount.value());
145     }
146     if (badgeParameters.badgeMaxCount.has_value()) {
147         layoutProperty->UpdateBadgeMaxCount(badgeParameters.badgeMaxCount.value());
148     } else {
149         layoutProperty->UpdateBadgeMaxCount(badgeTheme->GetMaxCount());
150     }
151 
152     if (badgeParameters.badgePosition.has_value()) {
153         auto badgePosition = static_cast<BadgePosition>(badgeParameters.badgePosition.value());
154         layoutProperty->UpdateBadgePosition(badgePosition);
155     } else {
156         layoutProperty->UpdateBadgePosition(badgeTheme->GetBadgePosition());
157     }
158     if (badgeParameters.badgePositionX.has_value()) {
159         layoutProperty->UpdateBadgePositionX(badgeParameters.badgePositionX.value());
160     } else {
161         layoutProperty->UpdateBadgePositionX(badgeTheme->GetBadgePositionX());
162     }
163     if (badgeParameters.badgePositionY.has_value()) {
164         layoutProperty->UpdateBadgePositionY(badgeParameters.badgePositionY.value());
165     } else {
166         layoutProperty->UpdateBadgePositionY(badgeTheme->GetBadgePositionY());
167     }
168     if (badgeParameters.isPositionXy.has_value()) {
169         layoutProperty->UpdateIsPositionXy(badgeParameters.isPositionXy.value());
170     } else {
171         layoutProperty->UpdateIsPositionXy(badgeTheme->GetIsPositionXy());
172     }
173     UpdateBadgeStyle(badgeParameters, AceType::Claim(frameNode));
174 }
175 } // namespace OHOS::Ace::NG
176