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/image_model_impl.h"
17 
18 #include "bridge/declarative_frontend/jsview/models/view_abstract_model_impl.h"
19 #include "bridge/declarative_frontend/view_stack_processor.h"
20 #include "core/components/image/image_component.h"
21 #include "core/components/image/image_event.h"
22 #include "frameworks/bridge/declarative_frontend/jsview/js_interactable_view.h"
23 #include "frameworks/bridge/declarative_frontend/jsview/js_utils.h"
24 #include "frameworks/bridge/declarative_frontend/jsview/js_view_abstract.h"
25 
26 namespace OHOS::Ace::Framework {
27 
SetAlt(const ImageSourceInfo & src)28 void ImageModelImpl::SetAlt(const ImageSourceInfo& src)
29 {
30     auto image = AceType::DynamicCast<ImageComponent>(ViewStackProcessor::GetInstance()->GetMainComponent());
31     if (image) {
32         image->SetAlt(src.GetSrc());
33     }
34 }
35 
SetBorder(const Border & border)36 void ImageModelImpl::SetBorder(const Border& border)
37 {
38     auto box = ViewStackProcessor::GetInstance()->GetBoxComponent();
39     auto decoration = box->GetFrontDecoration();
40     if (!decoration) {
41         decoration = AceType::MakeRefPtr<Decoration>();
42         box->SetFrontDecoration(decoration);
43     }
44     decoration->SetBorder(border);
45     auto image = AceType::DynamicCast<ImageComponent>(ViewStackProcessor::GetInstance()->GetMainComponent());
46     if (image) {
47         image->SetBorder(border);
48     }
49 }
50 
SetBackBorder()51 void ImageModelImpl::SetBackBorder()
52 {
53     auto box = ViewStackProcessor::GetInstance()->GetBoxComponent();
54     auto decoration = box->GetBackDecoration();
55     if (!decoration) {
56         decoration = AceType::MakeRefPtr<Decoration>();
57         box->SetBackDecoration(decoration);
58     }
59     SetBorder(decoration->GetBorder());
60 }
61 
SetBlur(double blur)62 void ImageModelImpl::SetBlur(double blur)
63 {
64     auto image = AceType::DynamicCast<ImageComponent>(ViewStackProcessor::GetInstance()->GetMainComponent());
65     if (image) {
66         image->SetBlur(blur);
67     }
68 }
69 
SetImageFit(ImageFit value)70 void ImageModelImpl::SetImageFit(ImageFit value)
71 {
72     auto image = AceType::DynamicCast<ImageComponent>(ViewStackProcessor::GetInstance()->GetMainComponent());
73     if (image) {
74         image->SetImageFit(value);
75     }
76 }
77 
SetMatchTextDirection(bool value)78 void ImageModelImpl::SetMatchTextDirection(bool value)
79 {
80     auto image = AceType::DynamicCast<ImageComponent>(ViewStackProcessor::GetInstance()->GetMainComponent());
81     if (image) {
82         image->SetMatchTextDirection(value);
83     }
84 }
85 
SetFitOriginSize(bool value)86 void ImageModelImpl::SetFitOriginSize(bool value)
87 {
88     auto image = AceType::DynamicCast<ImageComponent>(ViewStackProcessor::GetInstance()->GetMainComponent());
89     if (image) {
90         image->SetFitMaxSize(!value);
91     }
92 }
93 
SetOnComplete(std::function<void (const LoadImageSuccessEvent & info)> && callback)94 void ImageModelImpl::SetOnComplete(std::function<void(const LoadImageSuccessEvent& info)>&& callback)
95 {
96     auto onCompleteEvent = EventMarker([func = std::move(callback)](const BaseEventInfo* info) {
97         auto eventInfo = TypeInfoHelper::DynamicCast<LoadImageSuccessEvent>(info);
98         func(*eventInfo);
99     });
100     auto image = AceType::DynamicCast<ImageComponent>(ViewStackProcessor::GetInstance()->GetMainComponent());
101     image->SetLoadSuccessEvent(onCompleteEvent);
102 }
103 
SetOnError(std::function<void (const LoadImageFailEvent & info)> && callback)104 void ImageModelImpl::SetOnError(std::function<void(const LoadImageFailEvent& info)>&& callback)
105 {
106     auto onErrorEvent = EventMarker([func = std::move(callback)](const BaseEventInfo* info) {
107         auto eventInfo = TypeInfoHelper::DynamicCast<LoadImageFailEvent>(info);
108         func(*eventInfo);
109     });
110     auto image = AceType::DynamicCast<ImageComponent>(ViewStackProcessor::GetInstance()->GetMainComponent());
111     image->SetLoadFailEvent(onErrorEvent);
112 }
113 
SetSvgAnimatorFinishEvent(std::function<void ()> && callback)114 void ImageModelImpl::SetSvgAnimatorFinishEvent(std::function<void()>&& callback)
115 {
116     auto onFinishEvent = EventMarker([func = std::move(callback)]() { func(); });
117     auto image = AceType::DynamicCast<ImageComponent>(ViewStackProcessor::GetInstance()->GetMainComponent());
118     image->SetSvgAnimatorFinishEvent(onFinishEvent);
119 }
120 
Create(const ImageInfoConfig & imageInfoConfig,RefPtr<PixelMap> & pixmap)121 void ImageModelImpl::Create(const ImageInfoConfig& imageInfoConfig, RefPtr<PixelMap>& pixmap)
122 {
123     RefPtr<ImageComponent> image =
124         AceType::MakeRefPtr<OHOS::Ace::ImageComponent>(imageInfoConfig.src ? *imageInfoConfig.src : "");
125     image->SetBundleInfo(imageInfoConfig.bundleName, imageInfoConfig.moduleName);
126     ViewStackProcessor::GetInstance()->ClaimElementId(image);
127     image->SetUseSkiaSvg(false);
128     ViewStackProcessor::GetInstance()->Push(image);
129     JSInteractableView::SetFocusable(false);
130     JSInteractableView::SetFocusNode(true);
131     if (!pixmap) {
132         return;
133     }
134 
135 #if defined(PIXEL_MAP_SUPPORTED)
136     image->SetPixmap(pixmap);
137 #endif
138 }
139 
SetImageSourceSize(const std::pair<Dimension,Dimension> & size)140 void ImageModelImpl::SetImageSourceSize(const std::pair<Dimension, Dimension>& size)
141 {
142     auto image = AceType::DynamicCast<ImageComponent>(ViewStackProcessor::GetInstance()->GetMainComponent());
143     image->SetImageSourceSize(size);
144 }
145 
SetImageFill(const Color & color)146 void ImageModelImpl::SetImageFill(const Color& color)
147 {
148     auto image = AceType::DynamicCast<ImageComponent>(ViewStackProcessor::GetInstance()->GetMainComponent());
149     image->SetImageFill(color);
150 }
151 
SetImageInterpolation(ImageInterpolation iterpolation)152 void ImageModelImpl::SetImageInterpolation(ImageInterpolation iterpolation)
153 {
154     auto image = AceType::DynamicCast<ImageComponent>(ViewStackProcessor::GetInstance()->GetMainComponent());
155     image->SetImageInterpolation(iterpolation);
156 }
157 
SetImageRepeat(ImageRepeat imageRepeat)158 void ImageModelImpl::SetImageRepeat(ImageRepeat imageRepeat)
159 {
160     auto image = AceType::DynamicCast<ImageComponent>(ViewStackProcessor::GetInstance()->GetMainComponent());
161     image->SetImageRepeat(imageRepeat);
162 }
163 
SetImageRenderMode(ImageRenderMode imageRenderMode)164 void ImageModelImpl::SetImageRenderMode(ImageRenderMode imageRenderMode)
165 {
166     auto image = AceType::DynamicCast<ImageComponent>(ViewStackProcessor::GetInstance()->GetMainComponent());
167     image->SetImageRenderMode(imageRenderMode);
168 }
169 
IsSrcSvgImage()170 bool ImageModelImpl::IsSrcSvgImage()
171 {
172     auto image = AceType::DynamicCast<ImageComponent>(ViewStackProcessor::GetInstance()->GetMainComponent());
173     return image && image->IsSrcSvgImage();
174 }
175 
SetAutoResize(bool autoResize)176 void ImageModelImpl::SetAutoResize(bool autoResize)
177 {
178     auto image = AceType::DynamicCast<ImageComponent>(ViewStackProcessor::GetInstance()->GetMainComponent());
179     if (image) {
180         image->SetAutoResize(autoResize);
181     }
182 }
183 
SetSyncMode(bool syncMode)184 void ImageModelImpl::SetSyncMode(bool syncMode)
185 {
186     auto image = AceType::DynamicCast<ImageComponent>(ViewStackProcessor::GetInstance()->GetMainComponent());
187     if (image) {
188         image->SetSyncMode(syncMode);
189     }
190 }
191 
SetColorFilterMatrix(const std::vector<float> & matrix)192 void ImageModelImpl::SetColorFilterMatrix(const std::vector<float>& matrix)
193 {
194     auto image = AceType::DynamicCast<ImageComponent>(ViewStackProcessor::GetInstance()->GetMainComponent());
195     if (image) {
196         image->SetColorFilterMatrix(matrix);
197     }
198 }
199 
SetOnDragStart(NG::OnDragStartFunc && onDragStart)200 void ImageModelImpl::SetOnDragStart(NG::OnDragStartFunc&& onDragStart)
201 {
202     auto image = AceType::DynamicCast<ImageComponent>(ViewStackProcessor::GetInstance()->GetMainComponent());
203     if (image) {
204         image->SetOnDragStartId(ViewAbstractModelImpl::ToDragFunc(std::move(onDragStart)));
205     }
206 }
207 
SetOnDragEnter(NG::OnDragDropFunc && onDragStartId)208 void ImageModelImpl::SetOnDragEnter(NG::OnDragDropFunc&& onDragStartId)
209 {
210     auto image = AceType::DynamicCast<ImageComponent>(ViewStackProcessor::GetInstance()->GetMainComponent());
211     if (image) {
212         image->SetOnDragEnterId(std::move(onDragStartId));
213     }
214 }
215 
SetOnDragLeave(NG::OnDragDropFunc && onDragStartId)216 void ImageModelImpl::SetOnDragLeave(NG::OnDragDropFunc&& onDragStartId)
217 {
218     auto image = AceType::DynamicCast<ImageComponent>(ViewStackProcessor::GetInstance()->GetMainComponent());
219     if (image) {
220         image->SetOnDragLeaveId(std::move(onDragStartId));
221     }
222 }
223 
SetOnDragMove(NG::OnDragDropFunc && onDragMoveId)224 void ImageModelImpl::SetOnDragMove(NG::OnDragDropFunc&& onDragMoveId)
225 {
226     auto image = AceType::DynamicCast<ImageComponent>(ViewStackProcessor::GetInstance()->GetMainComponent());
227     if (image) {
228         image->SetOnDragMoveId(std::move(onDragMoveId));
229     }
230 }
231 
SetOnDrop(NG::OnDragDropFunc && onDropId)232 void ImageModelImpl::SetOnDrop(NG::OnDragDropFunc&& onDropId)
233 {
234     auto image = AceType::DynamicCast<ImageComponent>(ViewStackProcessor::GetInstance()->GetMainComponent());
235     if (image) {
236         image->SetOnDropId(std::move(onDropId));
237     }
238 }
239 
SetCopyOption(const CopyOptions & copyOption)240 void ImageModelImpl::SetCopyOption(const CopyOptions& copyOption)
241 {
242     auto image = AceType::DynamicCast<ImageComponent>(ViewStackProcessor::GetInstance()->GetMainComponent());
243     if (image) {
244         image->SetCopyOption(copyOption);
245     }
246 }
247 
UpdateDragItemInfo(DragItemInfo & itemInfo)248 bool ImageModelImpl::UpdateDragItemInfo(DragItemInfo& itemInfo)
249 {
250     auto component = ViewStackProcessor::GetInstance()->Finish();
251     if (!component) {
252         LOGE("Custom component is null.");
253         return false;
254     }
255     itemInfo.customComponent = component;
256     return true;
257 }
258 
GetIsAnimation()259 bool ImageModelImpl::GetIsAnimation()
260 {
261     return false;
262 }
263 
264 } // namespace OHOS::Ace::Framework
265