Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_AddonLineBaseComponent.c
Go to the documentation of this file.
1
6
8{
9 // Fields
11
12 protected ref SCR_WorkshopItem m_Item;
14
16
20
21 // Image effects
23
24 // Error flags
25 protected SCR_EAddonLineErrorFlags m_eAddonLineErrorFlags;
26
27 // --- Overrides ---
28 //------------------------------------------------------------------------------------------------
29 override void HandlerAttached(Widget w)
30 {
32 return;
33
34 m_Widgets.Init(w);
35
36 // Setup
37 m_aMouseButtons.Insert(m_Widgets.m_MoveLeftButtonComponent0);
38 m_aMouseButtons.Insert(m_Widgets.m_MoveRightButtonComponent0);
39 m_aMouseButtons.Insert(m_Widgets.m_DeleteButtonComponent0);
40
41 // Button callbacks
42 m_Widgets.m_DeleteButtonComponent0.m_OnClicked.Insert(OnDeleteButton);
43 m_Widgets.m_MoveRightButtonComponent0.m_OnClicked.Insert(OnEnableButton);
44 m_Widgets.m_MoveLeftButtonComponent0.m_OnClicked.Insert(OnDisableButton);
45
46 // Fix update
47 m_Widgets.m_UpdateButtonComponent0.m_OnClicked.Insert(OnUpdateButton);
48 m_Widgets.m_FixButtonComponent0.m_OnClicked.Insert(OnFixButton);
49
50 // Find button image effects
51 m_UpdateButtonIconColor = SCR_ButtonEffectColor.Cast(m_Widgets.m_UpdateButtonComponent0.FindEffect(SCR_ListEntryHelper.EFFECT_ICON_COLOR));
52
54 if (downloadManager)
55 {
56 downloadManager.m_OnNewDownload.Insert(OnAnyNewDownload);
57 downloadManager.m_OnDownloadFailed.Insert(OnAnyDownloadError);
58 downloadManager.m_OnDownloadCanceled.Insert(OnAnyDownloadCompleted);
59 downloadManager.m_OnDownloadComplete.Insert(OnAnyDownloadCompleted);
60 }
61
62 super.HandlerAttached(w);
63 }
64
65 //------------------------------------------------------------------------------------------------
66 override void HandlerDeattached(Widget w)
67 {
68 super.HandlerDeattached(w);
69
71 if (downloadManager)
72 {
73 downloadManager.m_OnNewDownload.Remove(OnAnyNewDownload);
74 downloadManager.m_OnDownloadFailed.Remove(OnAnyDownloadError);
75 downloadManager.m_OnDownloadCanceled.Remove(OnAnyDownloadCompleted);
76 downloadManager.m_OnDownloadComplete.Remove(OnAnyDownloadCompleted);
77 }
78
80 }
81
82 //------------------------------------------------------------------------------------------------
83 override bool OnFocus(Widget w, int x, int y)
84 {
85 bool result = super.OnFocus(w, x, y);
87
88 return result;
89 }
90
91 //------------------------------------------------------------------------------------------------
92 override bool OnFocusLost(Widget w, int x, int y)
93 {
94 bool result = super.OnFocusLost(w, x, y);
96
97 return result;
98 }
99
100 //------------------------------------------------------------------------------------------------
101 override void UpdateModularButtons()
102 {
103 super.UpdateModularButtons();
104
105 SCR_ListEntryHelper.UpdateMouseButtonColor(m_Widgets.m_MoveRightButtonComponent0, m_bUnavailable, m_bFocused);
106 }
107
108 //------------------------------------------------------------------------------------------------
110 {
111 super.OnTooltipShow(tooltip);
112
113 if (tooltip.IsValid("IncompatibleAddonVersion", m_Widgets.m_wIncompatibleButton))
115
116 else if (tooltip.IsValid("Update", m_Widgets.m_wUpdateButton))
117 OnUpdateTooltipShow(tooltip);
118
119 else if (tooltip.IsValid("MissingDependencies", m_Widgets.m_wFixButton))
121
122 else if (tooltip.IsValid("Corrupted", m_Widgets.m_wRepairButton))
124
125 else if (tooltip.IsValid("Disable", m_Widgets.m_wMoveLeftButton))
126 OnSideTooltipShow(tooltip);
127
128 else if (tooltip.IsValid("Enable", m_Widgets.m_wMoveRightButton))
129 OnSideTooltipShow(tooltip);
130 }
131
132 // --- Protected ---
133 //------------------------------------------------------------------------------------------------
135 protected void UpdateAllWidgets()
136 {
137 if (!m_Item)
138 return;
139
141
142 // Update name
143 m_Widgets.m_wNameText.SetText(m_Item.GetName());
144
145 // Show type
146 string imageType = "modIcon";
147 if (m_Item.IsWorldSave())
148 imageType = "save-published";
149
150 m_Widgets.m_wItemTypeImage.LoadImageFromSet(0, UIConstants.ICONS_IMAGE_SET, imageType);
151 }
152
153 //------------------------------------------------------------------------------------------------
154 protected void HandleDownloadChanges()
155 {
156 if (!m_Item)
157 return;
158
160
163
164 // Delete Button
165 SCR_ERevisionAvailability availability = SCR_AddonManager.ItemAvailability(m_Item.Internal_GetWorkshopItem());
166 m_Widgets.m_DeleteButtonComponent0.SetVisible(
168 m_bFocused &&
169 availability != SCR_ERevisionAvailability.ERA_DOWNLOAD_NOT_FINISHED &&
170 GetGame().GetInputManager().GetLastUsedInputDevice() == EInputDeviceType.MOUSE
171 );
172
173 // Dependencies Button
174 m_Widgets.m_FixButtonComponent0.SetVisible(RequiresDownloadingDependencies());
175
176 // Repair Button
177 WorkshopItem item = m_Item.GetWorkshopItem();
178 Revision itemRevision = item.GetActiveRevision();
179 m_Widgets.m_RepairButtonComponent0.SetVisible(itemRevision.IsCorrupted());
180
181 // Continuous update
184 else
186 }
187
188 //------------------------------------------------------------------------------------------------
189 protected void StartContinuousUpdate()
190 {
192 return;
193
194 GetGame().GetCallqueue().CallLater(ContinuousUpdate, SCR_WorkshopUiCommon.CONTINUOUS_UPDATE_DELAY, true);
195
197 }
198
199 //------------------------------------------------------------------------------------------------
200 protected void StopContinuousUpdate()
201 {
203 GetGame().GetCallqueue().Remove(ContinuousUpdate);
204
206 }
207
208 //------------------------------------------------------------------------------------------------
216
217 //------------------------------------------------------------------------------------------------
218 protected void HandleEnableButtons(bool addonEnabled, bool forceHidden = false)
219 {
220 // Left Panel
221 m_Widgets.m_wLeftSeparator.SetVisible(!addonEnabled || forceHidden);
222 m_Widgets.m_wSizeMoveRight.SetVisible(!addonEnabled && !forceHidden);
223 m_Widgets.m_MoveRightButtonComponent0.SetVisible(!addonEnabled && m_bFocused && !forceHidden);
224
225 // Right Panel
226 m_Widgets.m_wRightSeparator.SetVisible(addonEnabled || forceHidden);
227 m_Widgets.m_wSizeMoveLeft.SetVisible(addonEnabled || forceHidden);
228 m_Widgets.m_MoveLeftButtonComponent0.SetVisible(addonEnabled && m_bFocused && !forceHidden);
229 }
230
231 //------------------------------------------------------------------------------------------------
235 {
236 SCR_ERevisionAvailability availability = SCR_AddonManager.ItemAvailability(m_Item.Internal_GetWorkshopItem());
237
238 // Incompatible
239 bool showIncompatibility = availability != SCR_ERevisionAvailability.ERA_AVAILABLE &&
240 availability != SCR_ERevisionAvailability.ERA_UNKNOWN_AVAILABILITY;
241
242 m_Widgets.m_IncompatibleButtonComponent0.SetVisible(showIncompatibility);
243
244 if (showIncompatibility)
245 {
246 string texture = SCR_WorkshopUiCommon.GetRevisionAvailabilityErrorTexture(m_Item.Internal_GetWorkshopItem());
247 if (!texture.IsEmpty())
248 m_Widgets.m_IncompatibleButtonComponent1.SetImage(texture);
249 }
250
251 // Update
252 // Displaying button for update/cancel download
253 bool isDownloading = SCR_WorkshopUiCommon.IsDownloadingAddon(m_Item);
254 m_Widgets.m_UpdateButtonComponent0.SetVisible(isDownloading || m_Item.GetUpdateAvailable());
255
256 string texture = SCR_WorkshopUiCommon.ICON_UPDATE;
257 Color color = UIColors.CopyColor(UIColors.SLIGHT_WARNING);
258 if (isDownloading)
259 {
260 texture = SCR_WorkshopUiCommon.ICON_CANCEL_DOWNLOAD;
261 color = UIColors.CopyColor(UIColors.NEUTRAL_ACTIVE_STANDBY);
262 }
263
264 m_Widgets.m_UpdateButtonComponent1.SetImage(texture);
266 m_UpdateButtonIconColor.m_cDefault = color;
267
268 m_Widgets.m_UpdateButtonComponent0.InvokeAllEnabledEffects(true);
269 }
270
271 //------------------------------------------------------------------------------------------------
273 {
274 m_Widgets.m_wHorizontalState.SetVisible(SCR_WorkshopUiCommon.IsDownloadingAddon(m_Item));
275
276 if (!m_Widgets.m_wHorizontalState.IsVisible())
277 return;
278
280 string message = WidgetManager.Translate("%1 %2", SCR_WorkshopUiCommon.DOWNLOAD_STATE_DOWNLOADING, percentage);
281
282 m_Widgets.m_wStateText.SetText(message);
283 }
284
285 //------------------------------------------------------------------------------------------------
286 protected void UpdateIssueState()
287 {
289
290 if (!m_Item)
291 {
292 m_eAddonLineErrorFlags |= SCR_EAddonLineErrorFlags.ITEM_ISSUES;
293 return;
294 }
295
296 //TODO: unify with workshop tiles, as there's no reason to have separate state handling of what's just another representation of an addon
297
298 SCR_ERevisionAvailability availability = SCR_AddonManager.ItemAvailability(m_Item.Internal_GetWorkshopItem());
299 bool downloadIssue = availability == SCR_ERevisionAvailability.ERA_DOWNLOAD_NOT_FINISHED;
300 bool issues = HasItemAnyIssue();
301
302 m_bUnavailable = issues || downloadIssue;
303
304 // Update flags
305 if (issues)
306 m_eAddonLineErrorFlags |= SCR_EAddonLineErrorFlags.ITEM_ISSUES;
307
308 if (availability != SCR_ERevisionAvailability.ERA_AVAILABLE && !downloadIssue)
309 m_eAddonLineErrorFlags |= SCR_EAddonLineErrorFlags.REVISION_AVAILABILITY_ISSUE;
310
312 m_eAddonLineErrorFlags |= SCR_EAddonLineErrorFlags.MISSING_DEPENDENCIES;
313
314 if (downloadIssue)
315 m_eAddonLineErrorFlags |= SCR_EAddonLineErrorFlags.DOWNLOAD_ISSUES;
316 }
317
318 //------------------------------------------------------------------------------------------------
320 {
321 if (!m_Item)
322 return false;
323
324 array<ref SCR_WorkshopItem> dependencies = m_Item.GetLatestDependencies();
325
326 if (!dependencies.IsEmpty())
327 dependencies = SCR_AddonManager.SelectItemsOr(dependencies, EWorkshopItemQuery.NOT_OFFLINE | EWorkshopItemQuery.UPDATE_AVAILABLE);
328
329 return !dependencies.IsEmpty();
330 }
331
332 //------------------------------------------------------------------------------------------------
333 protected bool HasItemAnyIssue()
334 {
335 EWorkshopItemProblem problem = m_Item.GetHighestPriorityProblem();
336
337 bool hasIssue = (
338 problem == EWorkshopItemProblem.BROKEN ||
339 problem == EWorkshopItemProblem.DEPENDENCY_MISSING ||
340 problem == EWorkshopItemProblem.DEPENDENCY_OUTDATED
341 );
342
343 return hasIssue;
344 }
345
346 // --- Any downloads ---
347 // We need to update the progress bar and main action display if we start downloading this item or any of it's dependencies
348 //------------------------------------------------------------------------------------------------
353
354 //------------------------------------------------------------------------------------------------
359
360 //------------------------------------------------------------------------------------------------
365
366 // --- Callbacks ---
367 //------------------------------------------------------------------------------------------------
368 protected void OnWorkshopItemChange()
369 {
371 }
372
373 //------------------------------------------------------------------------------------------------
378
379 //------------------------------------------------------------------------------------------------
380 protected void OnActionButton()
381 {
382 if (!m_Item)
383 return;
384
386 }
387
388 //------------------------------------------------------------------------------------------------
389 protected void OnFixButton()
390 {
391 if (m_OnFixButton)
392 m_OnFixButton.Invoke(this);
393 }
394
395 //------------------------------------------------------------------------------------------------
397 {
398 if (!m_Item)
399 return;
400
402 }
403
404 //------------------------------------------------------------------------------------------------
406 {
407 if (!m_Item)
408 return;
409
411 }
412
413 //------------------------------------------------------------------------------------------------
415 {
416 if (!CanBeEnabled())
417 return;
418
419 // Enable
421 m_OnEnableButton.Invoke(this);
422
425 }
426
427 //------------------------------------------------------------------------------------------------
429 {
430 if (!m_Item)
431 return;
432
434 m_OnDisableButton.Invoke(this);
435
436 HandleEnableButtons(false);
438 }
439
440 // --- Tooltips ---
441 //------------------------------------------------------------------------------------------------
443 {
444 string message = SCR_WorkshopUiCommon.LABEL_UPDATE;
446 message = SCR_WorkshopUiCommon.LABEL_CANCEL;
447
449 if (content)
450 content.SetMessage(message);
451 }
452
453 //------------------------------------------------------------------------------------------------
455 {
456 SCR_ERevisionAvailability availability = SCR_AddonManager.ItemAvailability(m_Item.Internal_GetWorkshopItem());
457
459 if (!content)
460 return;
461
463 content.SetMessageColor(Color.FromInt(UIColors.WARNING.PackToInt()));
464 }
465
466 //------------------------------------------------------------------------------------------------
468 {
470 if (!content)
471 return;
472
473 if (!CanBeEnabled() && !IsEnabled())
474 {
475 content.SetMessageColor(Color.FromInt(UIColors.WARNING.PackToInt()));
476 content.SetActionColor(Color.FromInt(UIColors.IDLE_DISABLED.PackToInt()));
477 }
478 }
479
480 //------------------------------------------------------------------------------------------------
482 {
484 if (!content)
485 return;
486
487 content.SetMessageColor(Color.FromInt(UIColors.WARNING.PackToInt()));
488 }
489
490 // --- Public ---
491 //------------------------------------------------------------------------------------------------
492 bool IsEnabled();
493
494 //------------------------------------------------------------------------------------------------
497 {
498 m_Item = item;
499
500 if (m_Item)
501 {
502 m_Item.m_OnChanged.Insert(OnWorkshopItemChange);
503 m_Item.m_OnGetAsset.Insert(OnWorkshopItemChange);
504 m_Item.m_OnDependenciesLoaded.Insert(OnWorkshopItemChange);
505 if (!m_Item.GetDetailsLoaded())
506 m_Item.LoadDetails();
507 }
508
511 }
512
513 //------------------------------------------------------------------------------------------------
515 {
516 return m_Item;
517 }
518
519 //------------------------------------------------------------------------------------------------
520 SCR_EAddonLineErrorFlags GetErrorFlags()
521 {
523 }
524
525 //------------------------------------------------------------------------------------------------
526 // Addons with issues should not be enabled, except for availability issues since those only prevent online play
528 {
530
531 bool canBeEnabled =
532 m_Item &&
533 !(m_eAddonLineErrorFlags & SCR_EAddonLineErrorFlags.MISSING_DEPENDENCIES) &&
534 !(m_eAddonLineErrorFlags & SCR_EAddonLineErrorFlags.ITEM_ISSUES) &&
535 !(m_eAddonLineErrorFlags & SCR_EAddonLineErrorFlags.DOWNLOAD_ISSUES);
536
537 return canBeEnabled;
538 }
539
540 //------------------------------------------------------------------------------------------------
548
549 //------------------------------------------------------------------------------------------------
557
558 //------------------------------------------------------------------------------------------------
566}
567
568//TODO: unify error states, there's no reason this should have it's custom handling compared to workshop tiles or other UI reperesentations of mods
569enum SCR_EAddonLineErrorFlags
570{
571 MISSING_DEPENDENCIES = 1 << 0,
572 ITEM_ISSUES = 1 << 1,
574 DOWNLOAD_ISSUES = 1 << 3
575}
class RestAPIHelper< JsonApiStruct T > content
ArmaReforgerScripted GetGame()
Definition game.c:1398
SCR_AddonLineBaseComponent ITEM_ISSUES
SCR_AddonLineBaseComponent MISSING_DEPENDENCIES
Current revision is missing some dependencies and will not be allowed to be used (ENABLED and LOADED)...
SCR_AddonLineBaseComponent REVISION_AVAILABILITY_ISSUE
EWorkshopItemQuery
InputManager GetInputManager()
ScriptInvokerBase< ScriptInvokerScriptedWidgetComponentMethod > ScriptInvokerScriptedWidgetComponent
EWorkshopItemProblem
Definition Color.c:13
static ContentBrowserDetailsMenu OpenForWorkshopItem(SCR_WorkshopItem item)
Opens the menu for a given workshop item.
void OnSideTooltipShow(SCR_ScriptedWidgetTooltip tooltip)
override void HandlerDeattached(Widget w)
override bool OnFocus(Widget w, int x, int y)
ref SCR_WorkshopDownloadSequence m_DownloadRequest
override bool OnFocusLost(Widget w, int x, int y)
void OnAnyNewDownload(SCR_WorkshopItem item, SCR_WorkshopItemActionDownload action)
void OnAnyDownloadCompleted(SCR_WorkshopItemActionDownload action)
void UpdateAllWidgets()
Update vizual state of line.
ScriptInvokerScriptedWidgetComponent GetOnEnableButton()
void OnDependenciesTooltipShow(SCR_ScriptedWidgetTooltip tooltip)
ScriptInvokerScriptedWidgetComponent GetOnDisableButton()
void OnUpdateTooltipShow(SCR_ScriptedWidgetTooltip tooltip)
ref SCR_AddonLineBaseWidgets m_Widgets
void OnAnyDownloadError(SCR_WorkshopItemActionDownload action, int reason)
SCR_ButtonEffectColor m_UpdateButtonIconColor
override void OnTooltipShow(SCR_ScriptedWidgetTooltip tooltip)
override void HandlerAttached(Widget w)
void Init(SCR_WorkshopItem item)
Setup line.
void HandleEnableButtons(bool addonEnabled, bool forceHidden=false)
ref ScriptInvokerScriptedWidgetComponent m_OnFixButton
SCR_EAddonLineErrorFlags GetErrorFlags()
ref ScriptInvokerScriptedWidgetComponent m_OnDisableButton
ref ScriptInvokerScriptedWidgetComponent m_OnEnableButton
SCR_EAddonLineErrorFlags m_eAddonLineErrorFlags
void OnIncompatibleTooltipShow(SCR_ScriptedWidgetTooltip tooltip)
ScriptInvokerScriptedWidgetComponent GetOnFixButton()
static SCR_ERevisionAvailability ItemAvailability(notnull WorkshopItem item)
static array< ref SCR_WorkshopItem > SelectItemsOr(array< ref SCR_WorkshopItem > items, EWorkshopItemQuery query)
Effect which colorizes a widget with given name.
ref ScriptInvokerBase< ScriptInvoker_DownloadManagerActionError > m_OnDownloadFailed
static SCR_DownloadManager GetInstance()
ref ScriptInvoker m_OnNewDownload
ref ScriptInvokerBase< ScriptInvoker_DownloadManagerAction > m_OnDownloadComplete
static float GetItemDownloadActionsProgress(SCR_WorkshopItem item)
Returns overall download progress for all actions of a workshop item.
ref ScriptInvokerBase< ScriptInvoker_DownloadManagerAction > m_OnDownloadCanceled
static bool IsEditMode()
Definition Functions.c:1566
bool m_bUnavailable
SCR_ScriptedWidgetTooltip m_CurrentTooltip
bool m_bFocused
ref array< SCR_ModularButtonComponent > m_aMouseButtons
bool IsValid(string tag, Widget hoverWidget=null, ResourceName presets=string.Empty)
SCR_ScriptedWidgetTooltipContentBase GetContent()
static string GetRevisionAvailabilityErrorMessage(WorkshopItem item)
static string GetRevisionAvailabilityErrorTexture(WorkshopItem item)
static void ExecutePrimaryAction(notnull SCR_WorkshopItem item, out SCR_WorkshopDownloadSequence dlRequest, Revision revision=null)
static bool IsDownloadingAddon(SCR_WorkshopItem item)
static void OnDeleteAddonButton(SCR_WorkshopItem item)
Shows a confirmation dialog when unsubscribing an addon.
static int GetDownloadProgressPercentage(float progress)
static bool IsDownloadingAddonOrDependencies(SCR_WorkshopItem item)
Workshop Item instance.