Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_AddonsPresetSubMenuComponent.c
Go to the documentation of this file.
1
6
8{
10
11 protected ref array<ref SCR_WorkshopAddonPreset> m_aPresets = {};
12 protected int m_iToFocusPreset;
13 protected ref array<SCR_AddonLinePresetComponent> m_aPresetLines = {};
14
15 protected ref SCR_WorkshopAddonPreset m_InteractivePreset;
16
17 // New temptorary preset
19 protected SCR_WorkshopAddonPreset m_CreatedPreset;
20
21 // Navigation buttons
26
27 //------------------------------------------------------------------------------------------------
28 override void OnMenuFocusGained()
29 {
30 super.OnMenuFocusGained();
32 }
33
34 //------------------------------------------------------------------------------------------------
35 override void HandlerAttached(Widget w)
36 {
37 super.HandlerAttached(w);
38 m_Widgets.Init(w);
39
40 // Setup create new button
41 m_Widgets.m_ButonNewPresetComponent.m_OnClicked.Insert(CreateNewPreset);
42 m_Widgets.m_ButonNewPresetComponent.m_OnFocus.Insert(OnNewPresetFocus);
43 m_Widgets.m_ButonNewPresetComponent.m_OnFocusLost.Insert(OnNewPresetFocusLost);
44 }
45
46 //------------------------------------------------------------------------------------------------
47 override void HandlerDeattached(Widget w)
48 {
49 super.HandlerDeattached(w);
50 GetGame().SaveUserSettings();
51 }
52
53 //------------------------------------------------------------------------------------------------
54 override void OnTabShow()
55 {
56 super.OnTabShow();
58
59 if (!GetGame().InPlayMode())
60 return;
61
63
64 //--- Ensures that there is always a focused element
65 GetGame().GetWorkspace().SetFocusedWidget(m_Widgets.m_ButonNewPreset);
66 }
67
68 //------------------------------------------------------------------------------------------------
69 override void OnTabCreate(Widget menuRoot, ResourceName buttonsLayout, int index)
70 {
71 super.OnTabCreate(menuRoot, buttonsLayout, index);
72 m_NavLoad = CreateNavigationButton("MenuSelect", "#AR-PauseMenu_Load", true);
73 m_NavLoad.m_OnActivated.Insert(OnLoadButton);
74 m_NavRename = CreateNavigationButton("MenuRename", "#AR-MainMenu_Rename", true);
75 m_NavRename.m_OnActivated.Insert(OnRenameButton);
76 m_NavDelete = CreateNavigationButton("MenuDelete", "#AR-Workshop_ButtonDelete", true);
77 m_NavDelete.m_OnActivated.Insert(OnDeleteButton);
78 m_NavOverride = CreateNavigationButton("MenuSave", "#AR-PauseMenu_Save", true);
79 m_NavOverride.m_OnActivated.Insert(OnOverrideButton);
80 }
81
82 //------------------------------------------------------------------------------------------------
83 // Display list
84 //------------------------------------------------------------------------------------------------
85 //------------------------------------------------------------------------------------------------
87 protected void UpdatePresetListbox()
88 {
89 if (!m_Widgets || !m_Widgets.m_ScrollPresetsComponent)
90 return;
91
92 SCR_ListBoxComponent lb = m_Widgets.m_ScrollPresetsComponent;
93 if (!lb)
94 return;
95
96 // Remove all items
97 while (lb.GetItemCount() > 0)
98 lb.RemoveItem(0);
99
100 m_aPresetLines.Clear();
101
102 // Read data
103 if (!GetGame().InPlayMode())
104 return;
105
107 m_aPresets = presetStorage.GetAllPresets();
108
109 // Add items
110 for (int i = m_aPresets.Count() - 1; i >= 0; i--)
111 {
112 SCR_WorkshopAddonPreset preset = m_aPresets[i];
113
115 int id = lb.AddItem(preset.GetName(), data);
116
117 // Items actions
118 Widget wLine = lb.GetElementComponent(id).GetRootWidget();
119 if (!wLine)
120 continue;
121
123 if (!line)
124 continue;
125
126 line.SetPreset(preset);
127 line.UpdateWidgets();
128
129 line.GetEventOnNameChanged().Insert(RenamePreset);
131 line.GetEventOnLoad().Insert(LoadPreset);
132 line.GetEventOnOverride().Insert(OverridePreset);
133 line.GetEventOnDelete().Insert(DeletePreset);
134 line.GetEventOnFocus().Insert(OnLineFocus);
136
137 line.ShowWarning(!HasAllPresetAddons(line));
138
139 m_aPresetLines.Insert(line);
140 }
141
143
144 HandleFocus();
145 }
146
147 //------------------------------------------------------------------------------------------------
150 {
151 SCR_WorkshopAddonPreset preset = line.GetPreset();
152 if (!preset)
153 return false;
154
155 array<ref SCR_WorkshopAddonPresetAddonMeta> addons = preset.GetAddons();
156
157 foreach (SCR_WorkshopAddonPresetAddonMeta meta : addons)
158 {
159 string guid = meta.GetGuid();
161
162 if (!item || !item.GetOffline())
163 return false;
164 }
165
166 return true;
167 }
168
169 //------------------------------------------------------------------------------------------------
171 protected bool CanCreatePreset(SCR_WorkshopAddonPreset preset)
172 {
173 if (!preset)
174 new SCR_WorkshopErrorDialog("#AR-Workshop_EmptyAddonPresetMsg");
175
176 return preset;
177 }
178
179 //------------------------------------------------------------------------------------------------
181 protected bool IsPresetAddonsListEmpty(SCR_WorkshopAddonPreset preset)
182 {
183 if (!preset.GetAddons().IsEmpty())
184 return true;
185
186 new SCR_WorkshopErrorDialog("#AR-Workshop_EmptyAddonPresetMsg");
187 return false;
188 }
189
190 //------------------------------------------------------------------------------------------------
192 protected bool IsAddonsListEmpty(array<ref SCR_WorkshopItem> items)
193 {
194 if (!items.IsEmpty())
195 return true;
196
197 new SCR_WorkshopErrorDialog("#AR-Workshop_EmptyAddonPresetMsg");
198 return false;
199 }
200
201 //------------------------------------------------------------------------------------------------
203 protected bool IsNameValid(string name)
204 {
205 if (name.IsEmpty())
206 {
207 new SCR_WorkshopErrorDialog("#AR-Workshop_EmptyNameAddonPresetMsg");
208 return false;
209 }
210
212 return true;
213
214 new SCR_WorkshopErrorDialog("#AR-Workshop_EmptyNameAddonPresetMsg");
215 return false;
216 }
217
218 //------------------------------------------------------------------------------------------------
219 protected void OnUsedPresetChanged(string name)
220 {
222 {
223 preset.SetSelected(preset.GetName() == name);
224 }
225 }
226
227 //------------------------------------------------------------------------------------------------
229 protected bool IsNameUnique(SCR_WorkshopAddonPreset preset, string name)
230 {
232 {
233 SCR_WorkshopPresetConfirmDialog dlg = SCR_WorkshopPresetConfirmDialog.CreateOverridePresetDialog(preset);
234 dlg.m_OnConfirm.Insert(Callback_OnConfirmOverride);
235 return false;
236 }
237
238 return true;
239 }
240
241 //------------------------------------------------------------------------------------------------
242 // Preset actions
243 //------------------------------------------------------------------------------------------------
244 //------------------------------------------------------------------------------------------------
246 protected void CreateNewPreset()
247 {
249
250 if (addonsCount == 0)
251 {
252 SCR_WorkshopAddonPreset empty = null;
253 if (!CanCreatePreset(empty))
254 return;
255 }
256
257 SCR_ListBoxComponent lb = m_Widgets.m_ScrollPresetsComponent;
258 if (!lb)
259 return;
260
261 int id = lb.AddItem("");
263
264 // Setup line
265 Widget wLine = lb.GetElementComponent(id).GetRootWidget();
266 if (!wLine)
267 return;
268
269 wLine.SetZOrder(-1);
270 m_InteractivePreset = null;
271
273 if (!line)
274 return;
275
276 // Display data
277 line.ShowModCount(addonsCount);
278 line.ShowWarning(false);
279
280 // Setup edit action
281 line.ShowDefaultName();
282 line.StartEditName();
283
285 }
286
287 //------------------------------------------------------------------------------------------------
289 {
291
292 SCR_WorkshopAddonPreset preset = SCR_AddonManager.GetInstance().CreatePresetFromEnabledAddons(name);
293
294 // Check states
295 if (!CanCreatePreset(preset) || !IsPresetAddonsListEmpty(preset) || !IsNameValid(name) || !IsNameUnique(preset, name))
296 return;
297
298 // All fine, save this preset, add item to listbox
301
302 m_Widgets.m_ScrollPresetsComponent.SetFocusOnFirstItem();
303 }
304
305 //------------------------------------------------------------------------------------------------
311
312 //------------------------------------------------------------------------------------------------
314 {
315 m_Widgets.m_ButonNewPresetComponent.SetEnabled(false);
317
321 }
322
323 //------------------------------------------------------------------------------------------------
325 {
326 m_Widgets.m_ButonNewPresetComponent.SetEnabled(true);
328
332 }
333
334 //------------------------------------------------------------------------------------------------
335 protected void SetExistingLinesEnabled(bool enabled)
336 {
338 {
339 line.SetEnabled(enabled);
340 }
341 }
342
343 //------------------------------------------------------------------------------------------------
346 {
347 SCR_WorkshopAddonPreset preset = line.GetPreset();
348 if (!preset)
349 return;
350
351 array<ref SCR_WorkshopAddonPresetAddonMeta> addonsNotFound = {};
352 SCR_AddonManager.GetInstance().SelectPreset(preset, addonsNotFound);
353
354 if (addonsNotFound.IsEmpty())
356 }
357
358 //------------------------------------------------------------------------------------------------
361 {
362 SCR_WorkshopAddonPreset preset = line.GetPreset();
363 if (!preset)
364 return;
365
367 array<ref SCR_WorkshopItem> enabledAddons = addonMgr.SelectItemsAnd(addonMgr.GetOfflineAddons(), EWorkshopItemQuery.ENABLED | EWorkshopItemQuery.ONLY_WORKSHOP_ITEM);
368
369 if (!IsAddonsListEmpty(enabledAddons))
370 return;
371
372 // Create confirmation dialog
373 SCR_WorkshopPresetConfirmDialog dlg = SCR_WorkshopPresetConfirmDialog.CreateOverridePresetDialog(preset);
374 dlg.m_OnConfirm.Insert(Callback_OnConfirmOverride);
375 SetToFocusPreset(line, true);
376 }
377
378 //------------------------------------------------------------------------------------------------
380 {
381 string prevName = "";
383 prevName = m_InteractivePreset.GetName();
384
385 SCR_WorkshopAddonPreset preset = SCR_AddonManager.GetInstance().CreatePresetFromEnabledAddons(dlg.m_Preset.GetName());
386 if (!preset)
387 return;
388
389 // Change name
390 if (!m_sNameOverride.IsEmpty())
391 {
393 preset.SetName(m_sNameOverride);
394 m_sNameOverride = "";
395 }
396
398
399 // Update LB, the displayed preset names might have changed
401 }
402
403 //------------------------------------------------------------------------------------------------
406 {
407 SCR_WorkshopAddonPreset preset = line.GetPreset();
408 if (!preset)
409 return;
410
411 SetToFocusPreset(line);
412 SCR_WorkshopPresetConfirmDialog dlg = SCR_WorkshopPresetConfirmDialog.CreateDeletePresetDialog(preset.GetName());
413 dlg.m_OnConfirm.Insert(Callback_OnConfirmDelete);
414 }
415
416 //------------------------------------------------------------------------------------------------
418 {
420
421 // Update LB, the displayed preset names might have changed
423 }
424
425 protected string m_sNameOverride;
426
427 //------------------------------------------------------------------------------------------------
429 protected void RenamePreset(SCR_AddonLinePresetComponent line, string name)
430 {
431 SetToFocusPreset(line, true);
432 SCR_WorkshopAddonPreset preset = line.GetPreset();
433 if (!preset)
434 return;
435
436 if (!IsNameValid(name))
437 return;
438
439 // Check if preset with same name is not unique
441 SCR_WorkshopAddonPreset presetCompare = storage.GetPreset(name);
442
443 m_sNameOverride = "";
444
445 if (presetCompare && presetCompare != preset)
446 {
447 m_sNameOverride = name;
448 SCR_WorkshopPresetConfirmDialog dlg = SCR_WorkshopPresetConfirmDialog.CreateOverridePresetDialog(preset);
449 dlg.m_OnConfirm.Insert(Callback_OnConfirmOverride);
450 return;
451 }
452
453 string prevName = preset.GetName();
454 preset.SetName(name);
455
456 storage.SavePreset(preset, prevName);
458 }
459
460 //------------------------------------------------------------------------------------------------
462 {
463 if (!line)
464 return;
465
467 }
468
469 //------------------------------------------------------------------------------------------------
471 {
472 if (!line)
473 return;
474
476 }
477
478 //------------------------------------------------------------------------------------------------
481 {
483 }
484
485 //------------------------------------------------------------------------------------------------
488 {
489 Widget focused = GetGame().GetWorkspace().GetFocusedWidget();
490 if (!focused)
491 return null;
492
493 return SCR_AddonLinePresetComponent.Cast(focused.FindHandler(SCR_AddonLinePresetComponent));
494 }
495
496 //------------------------------------------------------------------------------------------------
497 // Create new preset button callbacks
498 //------------------------------------------------------------------------------------------------
499
500 //------------------------------------------------------------------------------------------------
501 protected void OnNewPresetFocus()
502 {
503 if (m_NavLoad)
504 m_NavLoad.SetLabel("#AR-Workshop_CreateNewAddonPreset");
505
506 if (m_NavOverride)
507 m_NavOverride.SetEnabled(false);
508
509 if (m_NavDelete)
510 m_NavDelete.SetEnabled(false);
511
512 if (m_NavRename)
513 m_NavRename.SetEnabled(false);
514 }
515
516 //------------------------------------------------------------------------------------------------
517 protected void OnNewPresetFocusLost()
518 {
519 if (m_NavLoad)
520 m_NavLoad.SetLabel("#AR-PauseMenu_Load");
521
522 if (m_NavOverride)
523 m_NavOverride.SetEnabled(true);
524
525 if (m_NavDelete)
526 m_NavDelete.SetEnabled(true);
527
528 if (m_NavRename)
529 m_NavRename.SetEnabled(true);
530 }
531
532 //------------------------------------------------------------------------------------------------
533 // Nav buttons callbacks
534 //------------------------------------------------------------------------------------------------
535
536 //------------------------------------------------------------------------------------------------
537 protected void OnLoadButton()
538 {
540
541 if (focusedLine)
542 LoadPreset(focusedLine);
543 }
544
545 //------------------------------------------------------------------------------------------------
546 protected void OnOverrideButton()
547 {
549
550 if (focusedLine)
551 OverridePreset(focusedLine);
552 }
553
554 //------------------------------------------------------------------------------------------------
555 protected void OnRenameButton()
556 {
558
559 if (focusedLine)
560 focusedLine.StartEditName();
561 }
562
563 //------------------------------------------------------------------------------------------------
564 protected void OnDeleteButton()
565 {
567
568 if (focusedLine)
569 DeletePreset(focusedLine);
570 }
571 //------------------------------------------------------------------------------------------------
572 // When doing certain actions (eg: Delete) which pops up other Dialog
573 // Register the previous preset in the list, so when coming back to it
574 // Focus it, instead of add new preset button
575 protected void SetToFocusPreset(SCR_AddonLinePresetComponent line, bool maintainIndex = false)
576 {
577 int modifier = -1;
578 if (maintainIndex)
579 modifier = 0;
580 int lineIndex = m_aPresetLines.Find(line);
581 if (!lineIndex || lineIndex == 0)
582 m_iToFocusPreset = -1;
583 else
584 m_iToFocusPreset = lineIndex + modifier;
585 }
586
587 //------------------------------------------------------------------------------------------------
588 protected void HandleFocus()
589 {
590 Widget toFocusWidget = m_Widgets.m_ButonNewPreset;
591 // Try to find the focusable closer preset line
593 // If the first preset was deleted, but there are more preset, focus on the next first one
594 if (m_iToFocusPreset < 0 && m_aPresetLines.Count() > 0)
595 toFocusLine = m_aPresetLines.Get(0);
596 else if (m_iToFocusPreset >= 0 && m_aPresetLines.Count() > 0)
597 toFocusLine = m_aPresetLines.Get(m_iToFocusPreset);
598
599 if (toFocusLine)
600 toFocusWidget = toFocusLine.GetRootWidget();
601
602 GetGame().GetWorkspace().SetFocusedWidget(toFocusWidget);
603 }
604}
void SCR_WorkshopPresetConfirmDialog(SCR_WorkshopAddonPreset preset, string presetName, string dlgPreset)
ArmaReforgerScripted GetGame()
Definition game.c:1398
EWorkshopItemQuery
SCR_DestructionSynchronizationComponentClass ScriptComponentClass int index
Get all prefabs that have the spawner data
void SetPreset(SCR_WorkshopAddonPreset preset)
void StartEditName()
Show editbox instead of name to edit name string.
int CountOfEnabledAddons()
Return int count of all enabled mods.
void SelectPreset(SCR_WorkshopAddonPreset preset, notnull array< ref SCR_WorkshopAddonPresetAddonMeta > addonsNotFound)
SCR_WorkshopAddonPreset CreatePresetFromEnabledAddons(string presetName)
array< ref SCR_WorkshopItem > GetOfflineAddons()
Returns array with all offline addons.
map< string, ref SCR_WorkshopItem > GetItemsMap()
SCR_WorkshopAddonManagerPresetStorage GetPresetStorage()
static array< ref SCR_WorkshopItem > SelectItemsAnd(array< ref SCR_WorkshopItem > items, EWorkshopItemQuery query)
static SCR_AddonManager GetInstance()
void Callback_OnConfirmDelete(SCR_WorkshopPresetConfirmDialog dlg)
bool CanCreatePreset(SCR_WorkshopAddonPreset preset)
Show error if preset can't be created.
void Callback_OnConfirmOverride(SCR_WorkshopPresetConfirmDialog dlg)
void OnLineButtonClick(SCR_AddonLinePresetComponent line)
Call this when any inner buttons is clicked.
void RenamePreset(SCR_AddonLinePresetComponent line, string name)
Change name of given preset.
bool IsPresetAddonsListEmpty(SCR_WorkshopAddonPreset preset)
Show no mods enabled error is no mods is selected for preset.
ref array< ref SCR_WorkshopAddonPreset > m_aPresets
void SetupLineCreationState(SCR_AddonLinePresetComponent line)
void OverridePreset(SCR_AddonLinePresetComponent line)
Change mod setup of given preset.
ref array< SCR_AddonLinePresetComponent > m_aPresetLines
void CreateNewPreset()
Create new preset with curent mods.
SCR_AddonLinePresetComponent FocusedPresetLine()
Return addon preset line component of currently focused widget if has any.
bool HasAllPresetAddons(SCR_AddonLinePresetComponent line)
Return true if all mods are available offline.
void DeletePreset(SCR_AddonLinePresetComponent line)
Delete given preset.
bool IsAddonsListEmpty(array< ref SCR_WorkshopItem > items)
Show no mods enabled error is no mods is selected for preset.
void OnLineFocus(SCR_AddonLinePresetComponent line)
override void OnTabCreate(Widget menuRoot, ResourceName buttonsLayout, int index)
void Callback_OnNameNewPreset(SCR_AddonLinePresetComponent line, string name)
void ClearLineCreationState(SCR_AddonLinePresetComponent line)
void SetToFocusPreset(SCR_AddonLinePresetComponent line, bool maintainIndex=false)
bool IsNameUnique(SCR_WorkshopAddonPreset preset, string name)
Show override dialog if name is reapeted in addon preset list.
void OnNameEditStart(SCR_AddonLinePresetComponent line)
void LoadPreset(SCR_AddonLinePresetComponent line)
Activate mods of given preset.
void Callback_OnNewPresetFocusLost(SCR_AddonLinePresetComponent line)
bool IsNameValid(string name)
Show invalid name error dialog.
void UpdatePresetListbox()
Display list of current addon presets.
ref SCR_AddonsPresetSubMenuWidgets m_Widgets
SCR_ListBoxElementComponent GetElementComponent(int item)
int AddItem(string item, Managed data=null, ResourceName itemLayout=string.Empty)
static bool IsEmptyOrWhiteSpace(string input)
SCR_InputButtonComponent CreateNavigationButton(string actionName, string label, bool rightFooter=false, bool show=true)
void SavePreset(notnull SCR_WorkshopAddonPreset preset, string prevName="")
array< ref SCR_WorkshopAddonPreset > GetAllPresets()
SCR_WorkshopAddonPreset GetPreset(string name)
bool GetOffline()
True when we have the item on our local storage.