Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_LayersEditorUIComponent.c
Go to the documentation of this file.
1
5{
6 //SFX
7 [Attribute(SCR_SoundEvent.SOUND_E_LAYER_EDIT_START, UIWidgets.EditBox, "")]
8 protected string m_sSfxStartLayerEditing;
9
10 [Attribute(SCR_SoundEvent.SOUND_E_LAYER_EDIT_END, UIWidgets.EditBox, "")]
11 protected string m_sSfxStopLayerEditing;
12
13 [Attribute(SCR_SoundEvent.SOUND_E_LAYER_DEEPER, UIWidgets.EditBox, "")]
14 protected string m_sSfxGoLayerDeeper;
15
16 [Attribute(SCR_SoundEvent.SOUND_E_LAYER_BACK, UIWidgets.EditBox, "")]
17 protected string m_sSfxGoLayerBack;
18
19 //Widget References
20 [Attribute()]
21 protected string m_sLayerElementHolder;
22
24
25 [Attribute()]
26 protected string m_sExitLayerButton;
27
28 [Attribute()]
29 protected string m_sLayerEditorOverlayName;
30
32
33 [Attribute("LayerEditorOverlay")]
34 protected string m_sParentWidgetName;
35
37
39
40 //References
42 protected ref array<SCR_EditableEntityComponent> m_aCurrentSelectedLayers = {};
48
49 //Settings
50 [Attribute(defvalue: "0", desc: "Layers shown after WorldRoot but before Dropdown")]
52
53 [Attribute(defvalue: "1", desc: "Layers shown before current but after Dropdown")]
55
56 //Prefabs
57 [Attribute()]
59
60 [Attribute()]
62
63 [Attribute()]
65
66 [Attribute()]
68
69 [Attribute()]
71
72 [Attribute()]
74
75 //State
76 protected bool m_bUsesGamepad;
77
79
80 //======================== ON MENU UPDATE ========================\\
81
82 //------------------------------------------------------------------------------------------------
83 protected void OnMenuUpdate(float tDelta)
84 {
86 if (m_InputManager && !mapShown)
87 m_InputManager.ActivateContext("EditorEditModeContext");
88 }
89
90 //------------------------------------------------------------------------------------------------
92 {
94
95 if (m_mButtonReferences.Find(button, layer))
96 m_LayersManager.SetCurrentLayer(layer);
97 }
98
99 //~ToDo: Check is gamepad is used and show controlles for it: GetGame().OnInputDeviceIsGamepadInvoker(). Hide L1 + Right button hint if no children. Check if input can be displayed dynamicly
100 //======================== CREATE LAYER UI ========================\\
101
102 //------------------------------------------------------------------------------------------------
103 //On Layer changed recreate layer menu
105 {
106 m_SelectedLayer = currentLayer;
107
108 //If currentLayer is not null then menu should be shown
109 if (m_SelectedLayer)
110 {
112 }
113 //No current Layer so set UI invisible
114 else
115 {
116 //Clear UI
118 SetVisible(false);
119 }
120
121 if (!prevLayer && !currentLayer) //~ Safty, No layer thus return
122 return;
123 else if (!prevLayer && currentLayer) //~ Start Layer editing
125 else if (prevLayer && !currentLayer) //~ Stop Layer editing
127 else if (currentLayer.GetParentEntity() == prevLayer) //~ Go layer deeper
128 SCR_UISoundEntity.SoundEvent(m_sSfxGoLayerDeeper, true);
129 else //~ Go layer back
130 SCR_UISoundEntity.SoundEvent(m_sSfxGoLayerBack, true);
131 }
132
133 //On input change
134
135 //------------------------------------------------------------------------------------------------
136 protected void OnInputDeviceIsGamepad(bool isGamepad)
137 {
138 m_bUsesGamepad = isGamepad;
139
141 }
142
143 //======================== PARENT ENTITY CHANGED ========================\\
144
145 //---- REFACTOR NOTE START: Confusing use of hasMoreAfterRootIndicator
146
147 //------------------------------------------------------------------------------------------------
148 protected void RefreshLayerUI()
149 {
150 if (m_SelectedLayer == null)
151 return;
152
153 //~Todo: Figure out what is setting the UI disabled
154 m_parentWidget.SetEnabled(true);
155
156 //Clear UI
158
159 //Add the world root
161
162 //Get Layer List
164 m_SelectedLayer.GetParentEntities(m_aCurrentSelectedLayers);
166 int totalLayerCount = m_aCurrentSelectedLayers.Count();
167 bool hasMoreAfterRootIndicator = false;
168
169 //Go over each layer and display them properly (In reverse order)
170 for (int i = totalLayerCount -1; i > -1; i--)
171 {
172 //Place layers after World Root or after More indicator
173 if (totalLayerCount - i <= m_iLayersShownAfterRoot || i <= m_iLayersShownBeforeCurrent)
174 {
175 //Create UI elements
178 }
179 //Layers are hidden
180 else if (!hasMoreAfterRootIndicator)
181 {
182 hasMoreAfterRootIndicator = true;
185 }
186 }
187
188 //Set UI visible
189 SetVisible(true);
190 }
191
192 //---- REFACTOR NOTE END ----
193
194 //======================== CHECK IF CHANGED ========================\\
195
196 //------------------------------------------------------------------------------------------------
201 {
202 //If given entity is not null
203 if (entity)
204 {
205 //Go through array and check if given entity changed
206 for (int i = 0, count = m_aCurrentSelectedLayers.Count(); i < count; i++)
207 {
208 if (m_aCurrentSelectedLayers[i] == entity)
209 return true;
210 }
211 }
212
213 return false;
214 }
215
216 //======================== PARENT ENTITY CHANGED ========================\\
217
218 //------------------------------------------------------------------------------------------------
224 {
226 {
228 return;
229 }
230
231 if (CheckIfSelectedLayerHierarchyChanged(parentEntity))
232 {
234 return;
235 }
236
237 if (CheckIfSelectedLayerHierarchyChanged(parentEntityPrev))
238 {
240 return;
241 }
242 }
243
244 //======================== ENTITY STATE CHANGED ========================\\
245
246 //------------------------------------------------------------------------------------------------
247 protected void OnEntityStateChanged(EEditableEntityState state, set<SCR_EditableEntityComponent> entitiesInsert, set<SCR_EditableEntityComponent> entitiesRemove)
248 {
249 //Inserted Entities state changed, check if in Hierarchy, if true: Refresh UI
250 if (entitiesInsert)
251 {
252 for (int i = 0, count = entitiesInsert.Count(); i < count; i++)
253 {
254 if (CheckIfSelectedLayerHierarchyChanged(entitiesInsert[i]))
255 {
257 return;
258 }
259 }
260 }
261
262 //Inserted Entities state changed, check if in Hierarchy, if true: Refresh UI
263 if (entitiesRemove)
264 {
265 for (int i = 0, count = entitiesRemove.Count(); i < count; i++)
266 {
267 if (CheckIfSelectedLayerHierarchyChanged(entitiesRemove[i]))
268 {
270 return;
271 }
272 }
273 }
274 }
275
276 //======================== CREATE LAYER ELEMENTS ========================\\
277 //------------------------ Layer Element in ------------------------\\
278
279 //---- REFACTOR NOTE START: Hardcoded search for button widget
280
281 //------------------------------------------------------------------------------------------------
282 protected void CreateLayerElement(SCR_EditableEntityComponent layerEntity, bool isLast)
283 {
284 Widget elementWidget;
285
286 //Spawn Widget
287 if (m_bUsesGamepad || isLast)
288 {
289 elementWidget = GetGame().GetWorkspace().CreateWidgets(m_LayerElementPrefab, m_LayerElementHolder);
290 if (!elementWidget)
291 return;
292 }
293 else
294 {
295 elementWidget = GetGame().GetWorkspace().CreateWidgets(m_LayerElementButtonPrefab, m_LayerElementHolder);
296
297 if (!elementWidget)
298 return;
299
300 Widget button = elementWidget.FindAnyWidget("Button");
301
302 if (!button)
303 return;
304
305 SCR_ButtonBaseComponent buttonComponent = SCR_ButtonBaseComponent.Cast(button.FindHandler(SCR_ButtonBaseComponent));
306
307 if (!buttonComponent)
308 return;
309
310 m_mButtonReferences.Insert(buttonComponent, layerEntity);
311 buttonComponent.m_OnClicked.Insert(OnLayerButtonPressed);
312 }
313
315 if (!toolbarItem)
316 {
317 elementWidget.RemoveFromHierarchy();
318 return;
319 }
320
321 toolbarItem.InitToolbarItem(elementWidget);
322
324
325 if (linkedEntityComponent)
326 linkedEntityComponent.SetLinkedEntity(layerEntity);
327
329 if (entityItem)
330 entityItem.SetEntity(layerEntity, elementWidget, m_SlotManager);
331 }
332
333 //---- REFACTOR NOTE END ----
334
335 //------------------------ Next Layer Indicator ------------------------\\
336
337 //------------------------------------------------------------------------------------------------
339 {
340 Widget nextLayerIndicator = GetGame().GetWorkspace().CreateWidgets(m_NextLayerIndicatorPrefab, m_LayerElementHolder);
341 }
342
343 //------------------------ Drop menu creator ------------------------\\
344
345 //------------------------------------------------------------------------------------------------
347 {
348 Widget moreLayersIndicator = GetGame().GetWorkspace().CreateWidgets(m_MoreLayersIndicatorPrefab, m_LayerElementHolder);
349 }
350
351 //------------------------ Children Indicator ------------------------\\
352
353 //---- REFACTOR NOTE START: Hardcoded search for button widget
354
355 //------------------------------------------------------------------------------------------------
356 protected void CreateWorldRootLayer()
357 {
358 Widget elementWidget;
359
360 //Spawn Widget
361 if (m_bUsesGamepad)
362 {
363 elementWidget = GetGame().GetWorkspace().CreateWidgets(m_LayerWorldPrefab, m_LayerElementHolder);
364 }
365 else
366 {
367 elementWidget = GetGame().GetWorkspace().CreateWidgets(m_LayerWorldButtonPrefab, m_LayerElementHolder);
368 if (!elementWidget)
369 return;
370
371 Widget button = elementWidget.FindAnyWidget("Button");
372
373 if (!button)
374 return;
375
376 SCR_ButtonBaseComponent buttonComponent = SCR_ButtonBaseComponent.Cast(button.FindHandler(SCR_ButtonBaseComponent));
377
378 if (!buttonComponent)
379 return;
380
381 m_mButtonReferences.Insert(buttonComponent, null);
382 buttonComponent.m_OnClicked.Insert(OnLayerButtonPressed);
383 }
384 }
385
386 //---- REFACTOR NOTE END ----
387
388 //======================== MENU VISIBILITY ========================\\
389
390 //------------------------------------------------------------------------------------------------
393 protected void SetVisible(bool show)
394 {
395 if (!m_parentWidget)
396 return;
397
398 if (m_parentWidget.IsVisible() != show)
399 {
400 m_parentWidget.SetVisible(show);
401
403 m_LayerEditorOverlay.SetVisible(show);
404
405 if (!show)
407 }
408 }
409
410 //======================== CLEAR UI ========================\\
411
412 //------------------------------------------------------------------------------------------------
414 protected void ClearLayerElements()
415 {
416 Widget child = m_LayerElementHolder.GetChildren();
417 Widget childtemp;
418 while (child)
419 {
420 childtemp = child;
421 child = child.GetSibling();
422 childtemp.RemoveFromHierarchy();
423 }
424
425 m_SlotManager.ClearSlots();
426
427 m_mButtonReferences.Clear();
428 }
429
430 //======================== BUTTON FUNCTIONS ========================\\
431
432 //------------------------------------------------------------------------------------------------
433 protected void OnEditorExitLayerButton()
434 {
435 if (m_LayersManager)
436 m_LayersManager.SetCurrentLayerToParent();
437 }
438
439 //======================== INHERITED ========================\\
440
441 //------------------------------------------------------------------------------------------------
443 {
444 if (SCR_Global.IsEditMode()) return; //--- Run-time only
445
447
448 m_parentWidget = GetMenu().GetRootWidget().FindAnyWidget(m_sParentWidgetName);
450
452 {
453 //Input device changed
454 OnInputDeviceIsGamepad(!GetGame().GetInputManager().IsUsingMouseAndKeyboard());
455 GetGame().OnInputDeviceIsGamepadInvoker().Insert(OnInputDeviceIsGamepad);
456
457 //Get layersEditorComponent
459 if (!m_LayersManager)
460 return;
461
462 //Subscribe to OnCompositionLayerChanged
463 m_LayersManager.GetOnCurrentLayerChange().Insert(OnCompositionLayerChanged);
464
465 //Get Core
466 SCR_EditableEntityCore core = SCR_EditableEntityCore.Cast(SCR_EditableEntityCore.GetInstance(SCR_EditableEntityCore)); //Remove and just get new in Handler
467 if (!core)
468 return;
469
470 //Subscribe to OnParentEntityChanged
471 core.Event_OnParentEntityChanged.Insert(OnParentEntityVisibleChanged);
472
474 if (!filter)
475 return;
476
477 filter.GetOnChanged().Insert(OnEntityStateChanged);
478
479 //Register buttons
480 Widget widget = w.FindAnyWidget(m_sExitLayerButton);
481 if (widget)
482 {
483 ButtonActionComponent exitLayerButton = ButtonActionComponent.Cast(widget.FindHandler(ButtonActionComponent));
484 if (exitLayerButton)
485 exitLayerButton.GetOnAction().Insert(OnEditorExitLayerButton);
486 }
487
489
491 if (!entitiesManager)
492 return;
493
495
497 if (!m_HoverFilter)
498 return;
499
500 MenuRootBase menu = GetMenu();
501 if (menu)
502 menu.GetOnMenuUpdate().Insert(OnMenuUpdate);
503
504 m_InputManager = GetGame().GetInputManager();
505 }
506
507 //Widget overlay
508 Widget parent = w.GetParent();
509 if (parent)
510 {
511 m_LayerEditorOverlay = parent.FindAnyWidget(m_sLayerEditorOverlayName);
512
514 m_LayerEditorOverlay.SetVisible(false);
515 }
516
517 }
518
519 //------------------------------------------------------------------------------------------------
520 override void HandlerDeattached(Widget w)
521 {
522 if (m_LayersManager)
523 {
524 m_LayersManager.GetOnCurrentLayerChange().Remove(OnCompositionLayerChanged);
525
526 //Unregister Buttons
527 Widget widget = w.FindAnyWidget(m_sExitLayerButton);
528 if (widget)
529 {
530 ButtonActionComponent exitLayerButton = ButtonActionComponent.Cast(widget.FindHandler(ButtonActionComponent));
531 if (exitLayerButton)
532 exitLayerButton.GetOnAction().Remove(OnEditorExitLayerButton);
533 }
534
536 if (core)
537 core.Event_OnParentEntityChanged.Remove(OnParentEntityVisibleChanged);
538
540 if (filter)
541 filter.GetOnChanged().Remove(OnEntityStateChanged);
542
543 super.HandlerDeattached(w);
544
545 MenuRootBase menu = GetMenu();
546 if (menu)
547 menu.GetOnMenuUpdate().Remove(OnMenuUpdate);
548 }
549 }
550}
ArmaReforgerScripted GetGame()
Definition game.c:1398
LayerPresets layer
InputManager GetInputManager()
SCR_RadialMenu GetMenu()
UI Textures DeployMenu Briefing conflict_HintBanner_1_UI desc
Component to execute action when the button or its shortcut is pressed.
Input management system for user interactions.
ScriptInvoker GetOnMenuUpdate()
ScriptInvokerBase< SCR_BaseEditableEntityFilter_OnChange > GetOnChanged()
static SCR_BaseEditableEntityFilter GetInstance(EEditableEntityState state, bool showError=false)
Base class for any button, regardless its own content.
SCR_EditableEntityComponent GetParentEntity()
SCR_BaseEditableEntityFilter GetFilter(EEditableEntityState state, bool showError=false)
void SetEntity(SCR_EditableEntityComponent entity, Widget widget, SCR_EditableEntitySlotManagerUIComponent slotManager)
static bool IsEditMode()
Definition Functions.c:1566
void CreateLayerElement(SCR_EditableEntityComponent layerEntity, bool isLast)
SCR_StatesEditorComponent m_StatesManager
SCR_EditableEntitySlotManagerUIComponent m_SlotManager
SCR_LayersEditorComponent m_LayersManager
SCR_MenuEditorComponent m_EditorMenuManager
void OnCompositionLayerChanged(SCR_EditableEntityComponent currentLayer, SCR_EditableEntityComponent prevLayer)
ref map< SCR_ButtonBaseComponent, SCR_EditableEntityComponent > m_mButtonReferences
SCR_EditableEntityComponent m_SelectedLayer
ref array< SCR_EditableEntityComponent > m_aCurrentSelectedLayers
bool CheckIfSelectedLayerHierarchyChanged(SCR_EditableEntityComponent entity)
void OnEntityStateChanged(EEditableEntityState state, set< SCR_EditableEntityComponent > entitiesInsert, set< SCR_EditableEntityComponent > entitiesRemove)
override void HandlerAttachedScripted(Widget w)
void OnLayerButtonPressed(SCR_ButtonBaseComponent button)
void OnParentEntityVisibleChanged(SCR_EditableEntityComponent entity, SCR_EditableEntityComponent parentEntity, SCR_EditableEntityComponent parentEntityPrev)
SCR_HoverEditableEntityFilter m_HoverFilter
bool IsOpen()
Check if the map is opened.
static SCR_MapEntity GetMapInstance()
Get map entity instance.
Definition Types.c:486
EEditableEntityState
SCR_FieldOfViewSettings Attribute