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