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