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