Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_BackendImageComponent.c
Go to the documentation of this file.
1// When enabled, the component will visualize debug information
2//#define BACKEND_IMAGE_DEBUG
3
8{
9 // Attributes
10 [Attribute("{04EB797EBF59CDEF}UI/Textures/Workshop/AddonThumbnails/workshop_defaultFallback_UI.edds", UIWidgets.ResourceNamePicker, desc: "Image used as fallback for addon image", params: "edds")]
12
13 [Attribute()]
14 protected string m_sImageWidgetName;
15
16 [Attribute("", UIWidgets.EditBox, "Widget from which we will be reading size of image widget. It can be detached from image widget, since its reported size can be different when wrapped into a scale widget.")]
17 protected string m_sImageSizeWidgetName;
18
19 [Attribute("1")]
20 protected bool m_bShowLoadingImage;
21
22 [Attribute("")]
23 protected string m_sLoadingOverlayName;
24
25 [Attribute("")]
26 protected string m_sDebugTextName;
27
28 // Widgets
33
34 // Other
37
39 protected int m_iPreferredWidth;
40
41 // Debugging
42 protected int m_iScreenWidth;
43
45
46 //----------------------------------------------------------------------------------
47 override void HandlerAttached(Widget w)
48 {
49 super.HandlerAttached(w);
50
51 if (!m_sImageWidgetName.IsEmpty())
52 m_wImage = ImageWidget.Cast(w.FindAnyWidget(m_sImageWidgetName));
53
54 if (!m_sImageSizeWidgetName.IsEmpty())
55 m_wImageSize = w.FindAnyWidget(m_sImageSizeWidgetName);
56
57 if (!m_sLoadingOverlayName.IsEmpty())
58 {
59 Widget wLoading = w.FindAnyWidget(m_sLoadingOverlayName);
60 if (wLoading)
61 m_LoadingOverlay = SCR_LoadingOverlay.Cast(wLoading.FindHandler(SCR_LoadingOverlay));
62 }
63
64 if (!m_sDebugTextName.IsEmpty())
65 {
66 m_wDebugText = TextWidget.Cast(w.FindAnyWidget(m_sDebugTextName));
67
68 if (m_wDebugText)
69 {
70 m_wDebugText.SetVisible(false);
71
72 // Debug
73 #ifdef BACKEND_IMAGE_DEBUG
74 m_wDebugText.SetVisible(true);
75 ShowDebugText("SCR_BackendImageComponent\nInitialized");
76 #endif
77 }
78 }
79 }
80
81 //----------------------------------------------------------------------------------
82 protected void CheckWidgetInitialized()
83 {
84 if (!m_wImageSize)
85 return;
86
87 // Get widget size instantly, related variables might be needed for debug text
88 float fWidth, fHeight;
89 m_wImageSize.GetScreenSize(fWidth, fHeight);
90
91 m_iScreenWidth = Math.Round(fWidth); // Store for debugging
92
93 // Wait untill the parent widget has been initialized
94 int preferredWidth = Math.Round(fWidth);
95 if (preferredWidth == 0)
96 {
98 {
100 GetGame().GetCallqueue().CallLater(CheckWidgetInitialized, 0, true);
101
103 }
104
105 #ifdef BACKEND_IMAGE_WIDGET_DEBUG
106 Debug.Error(string.Format("SCR_BackendImageComponent - IsWidgetReady() - widget has no size: %1 | %2", m_wRoot, m_wRoot.GetName()));
107 #endif
108
109 return;
110 }
111
112 GetGame().GetCallqueue().Remove(CheckWidgetInitialized);
113
114 m_iPreferredWidth = preferredWidth;
115
117
119 }
120
121 //------------------------------------------------------------------------------------------------
122 protected void TryDownloadImage()
123 {
124 ImageScale imageScale = m_BackendImage.GetScale(m_iPreferredWidth);
125 if (!imageScale)
126 {
128 return;
129 }
130
131 // Setup callback
135
136 m_DownloadImageCallback.m_Scale = imageScale;
137
138 // Dwonload
139 if (imageScale.Download(m_DownloadImageCallback))
140 {
141 // While we are downloading, try to get a smaller local scale and show the laoding overlay
142 ImageScale localImageScale = m_BackendImage.GetLocalScale(m_iPreferredWidth);
143 if (localImageScale)
144 ShowLoadingImage(localImageScale.Path());
145 else
147
148 // Debug
149 #ifdef BACKEND_IMAGE_DEBUG
150 ShowDebugText("Waiting");
151 #endif
152
153 return;
154 }
155
156 // Most likely we have already downloaded this
157 string imagePath = imageScale.Path();
158 if (!TryShowImage(imagePath))
160
161 // Debug
162 #ifdef BACKEND_IMAGE_DEBUG
163 string dbgtxt = string.Format("Local Image: %1x%2", imageScale.Width(), imageScale.Height());
164 ShowDebugText(dbgtxt);
165 #endif
166 }
167
168 //------------------------------------------------------------------------------------------------
173
174 //------------------------------------------------------------------------------------------------
176 {
177 if (!callback.m_Scale)
178 {
180 return;
181 }
182
183 string imgPath = callback.m_Scale.Path();
184 TryShowImage(imgPath);
185
186 // Debug
187 #ifdef BACKEND_IMAGE_DEBUG
188 string dbgtxt = string.Format("Received %1x%2", callback.m_Scale.Width(), callback.m_Scale.Height());
189 ShowDebugText(dbgtxt);
190 #endif
191 }
192
193 //------------------------------------------------------------------------------------------------
194 protected void TryLocalImage()
195 {
196 ImageScale localImageScale = m_BackendImage.GetLocalScale(m_iPreferredWidth);
197 if (localImageScale)
198 TryShowImage(localImageScale.Path());
199 else
201 }
202
203 //----------------------------------------------------------------------------------
204 protected bool TryShowImage(ResourceName imagePath)
205 {
206 if (imagePath.IsEmpty())
207 {
209 return false;
210 }
211
212 bool loaded = TryLoadImageTexture(imagePath);
213
214 if (!loaded)
216 else
217 m_wImage.SetVisible(true);
218
219 return loaded;
220 }
221
222 //----------------------------------------------------------------------------------
223 protected void ShowLoadingImage(ResourceName loadingImage = string.Empty)
224 {
225 if (!m_wImage)
226 return;
227
228 if (loadingImage.IsEmpty())
229 m_wImage.SetVisible(false);
230 else if (m_bShowLoadingImage)
231 TryShowImage(loadingImage);
232
234 m_LoadingOverlay.SetShown(true);
235 }
236
237 //----------------------------------------------------------------------------------
239 protected void ShowFallbackImage()
240 {
241 if (!m_wImage)
242 return;
243
244 if (m_sFallbackImage.IsEmpty())
245 {
246 m_wImage.SetVisible(false);
247
249 m_LoadingOverlay.SetShown(false);
250
252 m_OnImageSelected.Invoke();
253
254 return;
255 }
256
258 }
259
260 //----------------------------------------------------------------------------------
261 protected bool TryLoadImageTexture(ResourceName imagePath)
262 {
263 if (!m_wImage)
264 return false;
265
266 bool loaded = m_wImage.LoadImageTexture(0, imagePath, false, true);
267
268 int sx, sy;
269 m_wImage.GetImageSize(0, sx, sy);
270 m_wImage.SetSize(sx, sy);
271
273 m_LoadingOverlay.SetShown(false);
274
276 m_OnImageSelected.Invoke();
277
278 return loaded;
279 }
280
281 // --- PUBLIC ---
282 //----------------------------------------------------------------------------------
285 {
286 if (!image)
287 {
289
290 #ifdef BACKEND_IMAGE_DEBUG
291 ShowDebugText("Image unavailable\nShowing default image");
292 #endif
293
294 return;
295 }
296
297 m_BackendImage = image;
298
300 }
301
302 //----------------------------------------------------------------------------------
303 void SetImageSaturation(float saturation)
304 {
305 if (m_wImage)
306 m_wImage.SetSaturation(saturation);
307 }
308
309 //------------------------------------------------------------------------------------------------
317
318 // --- DEBUG ---
319 //----------------------------------------------------------------------------------
320 protected void ShowDebugText(string txt)
321 {
322 if (!m_wDebugText)
323 return;
324
325 string commotDebugData;
326
327 if (m_iPreferredWidth != 0)
328 commotDebugData = string.Format("Widget Screen Width: %1\nPrefered Width: %2\nScales in Backend:\n%3",
330
331 m_wDebugText.SetText(commotDebugData + "\n" + txt);
332 }
333
334 //----------------------------------------------------------------------------------
335 protected string FormatAvailableScales()
336 {
337 if (!m_BackendImage)
338 return string.Empty;
339
340 array<ImageScale> scales = {};
341 m_BackendImage.GetScales(scales);
342
343 string str;
344 string s;
345 int i;
346 foreach (ImageScale scale : scales)
347 {
348 if (scale)
349 s = string.Format("%1x%2 ", scale.Width(), scale.Height());
350 else
351 s = "null ";
352
353 i++;
354 if (i == 3)
355 {
356 s = s + "\n";
357 i = 0;
358 }
359
360 str = str + s;
361 }
362
363 return str;
364 }
365}
366
367// --- BACKEND IMAGE COMPONENT variants ---
369class SCR_WorkshopItemBackendImageComponent : SCR_BackendImageComponent
370{
372
373 //------------------------------------------------------------------------------------------------
376 {
377 m_Item = item;
378
379 if (m_Item)
381 else
382 m_sFallbackImage = SCR_WorkshopUiCommon.ADDON_DEFAULT_THUMBNAIL;
383
384 SetImage(image);
385 }
386
387 //------------------------------------------------------------------------------------------------
388 override void ShowLoadingImage(ResourceName loadingImage = string.Empty)
389 {
390 if (loadingImage.IsEmpty() && m_Item)
392
393 if (loadingImage.IsEmpty())
394 loadingImage = SCR_WorkshopUiCommon.ADDON_DEFAULT_THUMBNAIL_LOADING;
395
396 super.ShowLoadingImage(loadingImage);
397 }
398}
399
402{
403 //------------------------------------------------------------------------------------------------
404 override void ShowLoadingImage(ResourceName loadingImage = string.Empty)
405 {
406 if (loadingImage.IsEmpty())
407 loadingImage = SCR_WorkshopUiCommon.SCENARIO_SP_DEFAULT_THUMBNAIL;
408
409 super.ShowLoadingImage(loadingImage);
410 }
411}
vector scale
ArmaReforgerScripted GetGame()
Definition game.c:1398
ref array< string > scales
void SetWorkshopItemAndImage(SCR_WorkshopItem item, BackendImage image)
Sets reference to workshop item. Call this, then call SetImage as usual.
NewsFeedItem m_Item
UI Textures DeployMenu Briefing conflict_HintBanner_1_UI desc
ScriptInvokerBase< ScriptInvokerVoidMethod > ScriptInvokerVoid
Definition Debug.c:13
Definition Math.c:13
bool TryShowImage(ResourceName imagePath)
ref ScriptInvokerVoid m_OnImageSelected
void SetImageSaturation(float saturation)
void ShowLoadingImage(ResourceName loadingImage=string.Empty)
void Callback_DownloadImage_OnSuccess(SCR_WorkshopItemCallback_DownloadImage callback)
override void HandlerAttached(Widget w)
void SetImage(BackendImage image)
image can be null
bool TryLoadImageTexture(ResourceName imagePath)
void ShowFallbackImage()
If no fallback is set, the image widget will be hidden instead.
void Callback_DownloadImage_OnTimeoutError(SCR_WorkshopItemCallback_DownloadImage callback)
ref SCR_WorkshopItemCallback_DownloadImage m_DownloadImageCallback
Same as SCR_BackendImageComponent, but implements default image based on scenario.
static ResourceName GetDefaultAddonThumbnail(notnull SCR_WorkshopItem item)
SCR_FieldOfViewSettings Attribute