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 #include "bridge/declarative_frontend/jsview/models/sliding_panel_model_impl.h"
17
18 #include "base/log/ace_scoring_log.h"
19 #include "bridge/declarative_frontend/jsview/js_view_abstract.h"
20 #include "bridge/declarative_frontend/view_stack_processor.h"
21 #include "core/components/panel/sliding_panel_component_v2.h"
22
23 namespace OHOS::Ace::Framework {
24
Create(bool isShow)25 void SlidingPanelModelImpl::Create(bool isShow)
26 {
27 auto slidingPanel = AceType::MakeRefPtr<SlidingPanelComponentV2>();
28 ViewStackProcessor::GetInstance()->ClaimElementId(slidingPanel);
29 slidingPanel->SetHasDragBar(true);
30 ViewStackProcessor::GetInstance()->Push(slidingPanel);
31 slidingPanel->SetVisible(isShow);
32 auto component = ViewStackProcessor::GetInstance()->GetDisplayComponent();
33 auto display = AceType::DynamicCast<DisplayComponent>(component);
34 if (!display) {
35 LOGE("display is null");
36 return;
37 }
38 display->SetVisible(isShow ? VisibleType::VISIBLE : VisibleType::GONE);
39 }
40
SetPanelMode(PanelMode mode)41 void SlidingPanelModelImpl::SetPanelMode(PanelMode mode)
42 {
43 auto component = ViewStackProcessor::GetInstance()->GetMainComponent();
44 auto panel = AceType::DynamicCast<SlidingPanelComponent>(component);
45 if (panel) {
46 panel->SetMode(mode);
47 }
48 }
49
SetPanelType(PanelType type)50 void SlidingPanelModelImpl::SetPanelType(PanelType type)
51 {
52 auto component = ViewStackProcessor::GetInstance()->GetMainComponent();
53 auto panel = AceType::DynamicCast<SlidingPanelComponent>(component);
54 if (panel) {
55 panel->SetType(type);
56 }
57 }
58
SetHasDragBar(bool hasDragBar)59 void SlidingPanelModelImpl::SetHasDragBar(bool hasDragBar)
60 {
61 auto component = ViewStackProcessor::GetInstance()->GetMainComponent();
62 auto panel = AceType::DynamicCast<SlidingPanelComponent>(component);
63 if (panel) {
64 panel->SetHasDragBar(hasDragBar);
65 }
66 }
67
SetMiniHeight(const Dimension & miniHeight)68 void SlidingPanelModelImpl::SetMiniHeight(const Dimension& miniHeight)
69 {
70 auto component = ViewStackProcessor::GetInstance()->GetMainComponent();
71 auto panel = AceType::DynamicCast<SlidingPanelComponent>(component);
72 if (panel) {
73 panel->SetMiniHeight(std::pair(miniHeight, true));
74 }
75 }
76
SetHalfHeight(const Dimension & halfHeight)77 void SlidingPanelModelImpl::SetHalfHeight(const Dimension& halfHeight)
78 {
79 auto component = ViewStackProcessor::GetInstance()->GetMainComponent();
80 auto panel = AceType::DynamicCast<SlidingPanelComponent>(component);
81 if (panel) {
82 panel->SetHalfHeight(std::pair(halfHeight, true));
83 }
84 }
85
SetFullHeight(const Dimension & fullHeight)86 void SlidingPanelModelImpl::SetFullHeight(const Dimension& fullHeight)
87 {
88 auto component = ViewStackProcessor::GetInstance()->GetMainComponent();
89 auto panel = AceType::DynamicCast<SlidingPanelComponent>(component);
90 if (panel) {
91 panel->SetFullHeight(std::pair(fullHeight, true));
92 }
93 }
94
SetIsShow(bool isShow)95 void SlidingPanelModelImpl::SetIsShow(bool isShow)
96 {
97 auto component = ViewStackProcessor::GetInstance()->GetDisplayComponent();
98 auto display = AceType::DynamicCast<DisplayComponent>(component);
99 if (!display) {
100 LOGE("display is null");
101 return;
102 }
103 display->SetVisible(isShow ? VisibleType::VISIBLE : VisibleType::GONE);
104 auto panelComponent = ViewStackProcessor::GetInstance()->GetMainComponent();
105 auto panel = AceType::DynamicCast<SlidingPanelComponent>(panelComponent);
106 if (!panel) {
107 LOGE("Panel is null");
108 return;
109 }
110 panel->SetVisible(isShow);
111 }
112
SetBackgroundMask(const Color & backgroundMask)113 void SlidingPanelModelImpl::SetBackgroundMask(const Color& backgroundMask)
114 {
115 auto component = ViewStackProcessor::GetInstance()->GetMainComponent();
116 auto panel = AceType::DynamicCast<SlidingPanelComponent>(component);
117 if (!panel) {
118 LOGE("Panel is null");
119 return;
120 }
121
122 auto displayComponent = ViewStackProcessor::GetInstance()->GetDisplayComponent();
123 auto display = AceType::DynamicCast<DisplayComponent>(displayComponent);
124 if (!display) {
125 LOGE("display is null");
126 return;
127 }
128 display->SetBackgroundMask(backgroundMask);
129 }
130
SetBackgroundColor(const Color & backgroundColor)131 void SlidingPanelModelImpl::SetBackgroundColor(const Color& backgroundColor)
132 {
133 auto component = ViewStackProcessor::GetInstance()->GetMainComponent();
134 auto panel = AceType::DynamicCast<SlidingPanelComponentV2>(component);
135 auto box = SlidingPanelModelImpl::GetPanelBox();
136 if (!panel || !box) {
137 LOGE("Not valid type for SlidingPanel");
138 return;
139 }
140 box->SetColor(backgroundColor);
141 panel->SetHasBgStyle(true);
142 panel->SetHasDecorationStyle(true);
143 }
144
SetOnSizeChange(std::function<void (const BaseEventInfo *)> && changeEvent)145 void SlidingPanelModelImpl::SetOnSizeChange(std::function<void(const BaseEventInfo*)>&& changeEvent)
146 {
147 auto onSizeChange = EventMarker(changeEvent);
148 auto component = ViewStackProcessor::GetInstance()->GetMainComponent();
149 auto panel = AceType::DynamicCast<SlidingPanelComponent>(component);
150 if (panel) {
151 panel->SetOnSizeChanged(onSizeChange);
152 }
153 }
154
SetOnHeightChange(std::function<void (const float)> && onHeightChange)155 void SlidingPanelModelImpl::SetOnHeightChange(std::function<void(const float)>&& onHeightChange)
156 {
157 auto component = ViewStackProcessor::GetInstance()->GetMainComponent();
158 auto panel = AceType::DynamicCast<SlidingPanelComponent>(component);
159 if (panel) {
160 panel->SetOnHeightChanged(onHeightChange);
161 }
162 }
163
Pop()164 void SlidingPanelModelImpl::Pop()
165 {
166 JSContainerBase::Pop();
167 }
168
SetBorderColor(const Color & borderColor)169 void SlidingPanelModelImpl::SetBorderColor(const Color& borderColor)
170 {
171 auto component = ViewStackProcessor::GetInstance()->GetMainComponent();
172 auto panel = AceType::DynamicCast<SlidingPanelComponentV2>(component);
173 auto decoration = SlidingPanelModelImpl::GetPanelDecoration();
174 if (!panel || !decoration) {
175 return;
176 }
177 auto border = decoration->GetBorder();
178 border.SetColor(borderColor);
179 decoration->SetBorder(border);
180 panel->SetHasBorderStyle(true);
181 panel->SetHasDecorationStyle(true);
182 }
183
SetBorderWidth(const Dimension & borderWidth)184 void SlidingPanelModelImpl::SetBorderWidth(const Dimension& borderWidth)
185 {
186 auto component = ViewStackProcessor::GetInstance()->GetMainComponent();
187 auto panel = AceType::DynamicCast<SlidingPanelComponentV2>(component);
188 auto decoration = SlidingPanelModelImpl::GetPanelDecoration();
189 if (!panel || !decoration) {
190 return;
191 }
192 auto border = decoration->GetBorder();
193 border.SetWidth(borderWidth);
194 decoration->SetBorder(border);
195 panel->SetHasBorderStyle(true);
196 panel->SetHasDecorationStyle(true);
197 }
198
SetBorderStyle(const BorderStyle & borderStyle)199 void SlidingPanelModelImpl::SetBorderStyle(const BorderStyle& borderStyle)
200 {
201 auto component = ViewStackProcessor::GetInstance()->GetMainComponent();
202 auto panel = AceType::DynamicCast<SlidingPanelComponentV2>(component);
203 auto decoration = SlidingPanelModelImpl::GetPanelDecoration();
204 if (!panel || !decoration) {
205 return;
206 }
207 auto border = decoration->GetBorder();
208 border.SetStyle(borderStyle);
209 decoration->SetBorder(border);
210 panel->SetHasBorderStyle(true);
211 panel->SetHasDecorationStyle(true);
212 }
213
SetBorder(const BorderStyle & borderStyle,const Dimension & borderWidth)214 void SlidingPanelModelImpl::SetBorder(const BorderStyle& borderStyle, const Dimension& borderWidth)
215 {
216 auto component = ViewStackProcessor::GetInstance()->GetMainComponent();
217 auto panel = AceType::DynamicCast<SlidingPanelComponentV2>(component);
218 if (!panel) {
219 LOGE("Panel is Null");
220 return;
221 }
222 auto decoration = SlidingPanelModelImpl::GetPanelDecoration();
223 auto border = decoration->GetBorder();
224 border.SetStyle(borderStyle);
225 border.SetWidth(borderWidth);
226 decoration->SetBorder(border);
227 panel->SetHasBorderStyle(true);
228 panel->SetHasDecorationStyle(true);
229 }
230
GetPanelBox()231 RefPtr<BoxComponent> SlidingPanelModelImpl::GetPanelBox()
232 {
233 auto component = ViewStackProcessor::GetInstance()->GetMainComponent();
234 auto panel = AceType::DynamicCast<SlidingPanelComponentV2>(component);
235 if (!panel) {
236 return nullptr;
237 }
238 if (panel->HasBoxStyle()) {
239 return panel->GetBoxStyle();
240 } else {
241 panel->SetHasBoxStyle(true);
242 auto box = AceType::MakeRefPtr<BoxComponent>();
243 panel->SetBoxStyle(box);
244 return box;
245 }
246 }
247
GetPanelDecoration()248 RefPtr<Decoration> SlidingPanelModelImpl::GetPanelDecoration()
249 {
250 auto box = SlidingPanelModelImpl::GetPanelBox();
251 if (!box) {
252 return nullptr;
253 }
254 auto decoration = box->GetBackDecoration();
255 if (!decoration) {
256 decoration = AceType::MakeRefPtr<Decoration>();
257 box->SetBackDecoration(decoration);
258 }
259 return decoration;
260 }
261 } // namespace OHOS::Ace::Framework