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 std::string & src)28 void ImageModelImpl::SetAlt(const std::string& src)
29 {
30 auto image = AceType::DynamicCast<ImageComponent>(ViewStackProcessor::GetInstance()->GetMainComponent());
31 if (image) {
32 image->SetAlt(src);
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 std::string & src,bool noPixMap,RefPtr<PixelMap> & pixMap)121 void ImageModelImpl::Create(const std::string& src, bool noPixMap, RefPtr<PixelMap>& pixMap)
122 {
123 RefPtr<ImageComponent> image = AceType::MakeRefPtr<OHOS::Ace::ImageComponent>(src);
124 ViewStackProcessor::GetInstance()->ClaimElementId(image);
125 image->SetUseSkiaSvg(false);
126 ViewStackProcessor::GetInstance()->Push(image);
127 JSInteractableView::SetFocusable(false);
128 JSInteractableView::SetFocusNode(true);
129 if (noPixMap) {
130 return;
131 }
132
133 #if defined(PIXEL_MAP_SUPPORTED)
134 image->SetPixmap(pixMap);
135 #endif
136 }
137
SetImageSourceSize(const std::pair<Dimension,Dimension> & size)138 void ImageModelImpl::SetImageSourceSize(const std::pair<Dimension, Dimension>& size)
139 {
140 auto image = AceType::DynamicCast<ImageComponent>(ViewStackProcessor::GetInstance()->GetMainComponent());
141 image->SetImageSourceSize(size);
142 }
143
SetImageFill(const Color & color)144 void ImageModelImpl::SetImageFill(const Color& color)
145 {
146 auto image = AceType::DynamicCast<ImageComponent>(ViewStackProcessor::GetInstance()->GetMainComponent());
147 image->SetImageFill(color);
148 }
149
SetImageInterpolation(ImageInterpolation iterpolation)150 void ImageModelImpl::SetImageInterpolation(ImageInterpolation iterpolation)
151 {
152 auto image = AceType::DynamicCast<ImageComponent>(ViewStackProcessor::GetInstance()->GetMainComponent());
153 image->SetImageInterpolation(iterpolation);
154 }
155
SetImageRepeat(ImageRepeat imageRepeat)156 void ImageModelImpl::SetImageRepeat(ImageRepeat imageRepeat)
157 {
158 auto image = AceType::DynamicCast<ImageComponent>(ViewStackProcessor::GetInstance()->GetMainComponent());
159 image->SetImageRepeat(imageRepeat);
160 }
161
SetImageRenderMode(ImageRenderMode imageRenderMode)162 void ImageModelImpl::SetImageRenderMode(ImageRenderMode imageRenderMode)
163 {
164 auto image = AceType::DynamicCast<ImageComponent>(ViewStackProcessor::GetInstance()->GetMainComponent());
165 image->SetImageRenderMode(imageRenderMode);
166 }
167
IsSrcSvgImage()168 bool ImageModelImpl::IsSrcSvgImage()
169 {
170 auto image = AceType::DynamicCast<ImageComponent>(ViewStackProcessor::GetInstance()->GetMainComponent());
171 return image && image->IsSrcSvgImage();
172 }
173
SetAutoResize(bool autoResize)174 void ImageModelImpl::SetAutoResize(bool autoResize)
175 {
176 auto image = AceType::DynamicCast<ImageComponent>(ViewStackProcessor::GetInstance()->GetMainComponent());
177 if (image) {
178 image->SetAutoResize(autoResize);
179 }
180 }
181
SetSyncMode(bool syncMode)182 void ImageModelImpl::SetSyncMode(bool syncMode)
183 {
184 auto image = AceType::DynamicCast<ImageComponent>(ViewStackProcessor::GetInstance()->GetMainComponent());
185 if (image) {
186 image->SetSyncMode(syncMode);
187 }
188 }
189
SetColorFilterMatrix(const std::vector<float> & matrix)190 void ImageModelImpl::SetColorFilterMatrix(const std::vector<float>& matrix)
191 {
192 auto image = AceType::DynamicCast<ImageComponent>(ViewStackProcessor::GetInstance()->GetMainComponent());
193 if (image) {
194 image->SetColorFilterMatrix(matrix);
195 }
196 }
197
SetOnDragStart(NG::OnDragStartFunc && onDragStart)198 void ImageModelImpl::SetOnDragStart(NG::OnDragStartFunc&& onDragStart)
199 {
200 auto image = AceType::DynamicCast<ImageComponent>(ViewStackProcessor::GetInstance()->GetMainComponent());
201 if (image) {
202 image->SetOnDragStartId(ViewAbstractModelImpl::ToDragFunc(std::move(onDragStart)));
203 }
204 }
205
SetOnDragEnter(NG::OnDragDropFunc && onDragStartId)206 void ImageModelImpl::SetOnDragEnter(NG::OnDragDropFunc&& onDragStartId)
207 {
208 auto image = AceType::DynamicCast<ImageComponent>(ViewStackProcessor::GetInstance()->GetMainComponent());
209 if (image) {
210 image->SetOnDragEnterId(std::move(onDragStartId));
211 }
212 }
213
SetOnDragLeave(NG::OnDragDropFunc && onDragStartId)214 void ImageModelImpl::SetOnDragLeave(NG::OnDragDropFunc&& onDragStartId)
215 {
216 auto image = AceType::DynamicCast<ImageComponent>(ViewStackProcessor::GetInstance()->GetMainComponent());
217 if (image) {
218 image->SetOnDragLeaveId(std::move(onDragStartId));
219 }
220 }
221
SetOnDragMove(NG::OnDragDropFunc && onDragMoveId)222 void ImageModelImpl::SetOnDragMove(NG::OnDragDropFunc&& onDragMoveId)
223 {
224 auto image = AceType::DynamicCast<ImageComponent>(ViewStackProcessor::GetInstance()->GetMainComponent());
225 if (image) {
226 image->SetOnDragMoveId(std::move(onDragMoveId));
227 }
228 }
229
SetOnDrop(NG::OnDragDropFunc && onDropId)230 void ImageModelImpl::SetOnDrop(NG::OnDragDropFunc&& onDropId)
231 {
232 auto image = AceType::DynamicCast<ImageComponent>(ViewStackProcessor::GetInstance()->GetMainComponent());
233 if (image) {
234 image->SetOnDropId(std::move(onDropId));
235 }
236 }
237
SetCopyOption(const CopyOptions & copyOption)238 void ImageModelImpl::SetCopyOption(const CopyOptions& copyOption)
239 {
240 auto image = AceType::DynamicCast<ImageComponent>(ViewStackProcessor::GetInstance()->GetMainComponent());
241 if (image) {
242 image->SetCopyOption(copyOption);
243 }
244 }
245
UpdateDragItemInfo(DragItemInfo & itemInfo)246 bool ImageModelImpl::UpdateDragItemInfo(DragItemInfo& itemInfo)
247 {
248 auto component = ViewStackProcessor::GetInstance()->Finish();
249 if (!component) {
250 LOGE("Custom component is null.");
251 return false;
252 }
253 itemInfo.customComponent = component;
254 return true;
255 }
256
257 } // namespace OHOS::Ace::Framework
258