ingamehudvisibility.c 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. // Corresponds to a widget within a HUD layout
  2. enum EHudElement
  3. {
  4. LHUD_PRESENCE,
  5. LHUD_STANCE,
  6. LHUD_PLAYER,
  7. LHUD_VEHICLE,
  8. RHUD_BADGES,
  9. RHUD_DIVIDER,
  10. RHUD_NOTIFIERS,
  11. QUICKBAR
  12. }
  13. // Flag representing a visibility rule
  14. enum EHudContextFlags
  15. {
  16. HUD_DISABLE = 1, // left/right hud disabled in options
  17. HUD_HIDE = 2, // left/right hud hidden through hotkey
  18. VEHICLE_DISABLE = 4, // vehicle hud disabled in options
  19. DRIVER = 8, // is driver -> show veh hud
  20. VEHICLE = 16, // in vehicle -> hide left stats
  21. MENU_OPEN = 32, // another menu opened
  22. NO_BADGE = 64, // no badges visible
  23. QUICKBAR_DISABLE = 128, // quickbar hud disabled in options
  24. QUICKBAR_HIDE = 256, // quickbar hud hidden through hotkey
  25. QUICKBAR_GLOBAL = 512, // platform based visibility
  26. INVENTORY_OPEN = 1024, // inventory is open -> HUD left/right should be always visible
  27. UNCONSCIOUS = 2048 // player is unconscious
  28. }
  29. // Hud visibility manager for hud elements with more complex/overlapping visibility rules
  30. // This is meant for parents of widgets structures which are afected by multiple visibility rules, not small individual widgets
  31. class IngameHudVisibility : Managed
  32. {
  33. // TODO visibility getters to replace the remaining API in IngameHud
  34. protected EHudContextFlags m_CtxFlags;
  35. protected ref map<EHudElement, Widget> m_ElementMap;
  36. protected ref map< EHudContextFlags, ref array<EHudElement> > m_ElementLinkMap;
  37. // !these dont work when const
  38. EHudContextFlags QUICKBAR_HIDE_FLAGS = (EHudContextFlags.QUICKBAR_HIDE | EHudContextFlags.QUICKBAR_DISABLE | EHudContextFlags.QUICKBAR_GLOBAL);
  39. static EHudContextFlags HUD_HIDE_FLAGS = (EHudContextFlags.HUD_DISABLE | EHudContextFlags.HUD_HIDE | EHudContextFlags.MENU_OPEN | EHudContextFlags.UNCONSCIOUS);
  40. void Init(Widget panel)
  41. {
  42. m_ElementMap = new map<EHudElement, Widget>();
  43. m_ElementLinkMap = new map< EHudContextFlags, ref array<EHudElement> >();
  44. InitElementMap(panel);
  45. LinkElementsToFlags();
  46. }
  47. protected void InitElementMap(Widget panel)
  48. {
  49. Widget leftHUDPanel = panel.FindAnyWidget("LeftHUDPanel");
  50. m_ElementMap.Insert(EHudElement.LHUD_PRESENCE, leftHUDPanel.FindAnyWidget("PresencePanel"));
  51. m_ElementMap.Insert(EHudElement.LHUD_STANCE, leftHUDPanel.FindAnyWidget("StancePanel"));
  52. m_ElementMap.Insert(EHudElement.LHUD_PLAYER, leftHUDPanel.FindAnyWidget("PlayerPanel"));
  53. m_ElementMap.Insert(EHudElement.LHUD_VEHICLE, leftHUDPanel.FindAnyWidget("VehicleHUDPanels"));
  54. m_ElementMap.Insert(EHudElement.RHUD_BADGES, panel.FindAnyWidget("BadgesPanel"));
  55. m_ElementMap.Insert(EHudElement.RHUD_DIVIDER, panel.FindAnyWidget("BadgeNotifierDivider"));
  56. m_ElementMap.Insert(EHudElement.RHUD_NOTIFIERS, panel.FindAnyWidget("NotifiersPanel"));
  57. m_ElementMap.Insert(EHudElement.QUICKBAR, panel.FindAnyWidget("QuickbarGrid"));
  58. }
  59. // Configures which elements are relevant to which flags
  60. // When flag value changes, all relevant elements update visibility
  61. protected void LinkElementsToFlags()
  62. {
  63. array <int> lHud = {EHudElement.LHUD_STANCE, EHudElement.LHUD_PLAYER, EHudElement.LHUD_PRESENCE};
  64. array <int> hud = {EHudElement.LHUD_STANCE, EHudElement.LHUD_PLAYER, EHudElement.LHUD_PRESENCE, EHudElement.RHUD_BADGES, EHudElement.RHUD_DIVIDER, EHudElement.RHUD_NOTIFIERS};
  65. array <int> hudVeh = {EHudElement.LHUD_STANCE, EHudElement.LHUD_PLAYER, EHudElement.LHUD_PRESENCE, EHudElement.RHUD_BADGES, EHudElement.RHUD_DIVIDER, EHudElement.RHUD_NOTIFIERS, EHudElement.LHUD_VEHICLE};
  66. m_ElementLinkMap.Insert(EHudContextFlags.HUD_DISABLE, hud);
  67. m_ElementLinkMap.Insert(EHudContextFlags.HUD_HIDE, hud);
  68. m_ElementLinkMap.Insert(EHudContextFlags.VEHICLE_DISABLE, {EHudElement.LHUD_VEHICLE});
  69. m_ElementLinkMap.Insert(EHudContextFlags.DRIVER, {EHudElement.LHUD_VEHICLE});
  70. m_ElementLinkMap.Insert(EHudContextFlags.VEHICLE, lHud);
  71. m_ElementLinkMap.Insert(EHudContextFlags.MENU_OPEN, hudVeh);
  72. m_ElementLinkMap.Insert(EHudContextFlags.NO_BADGE, {EHudElement.RHUD_DIVIDER});
  73. m_ElementLinkMap.Insert(EHudContextFlags.QUICKBAR_DISABLE, {EHudElement.QUICKBAR});
  74. m_ElementLinkMap.Insert(EHudContextFlags.QUICKBAR_HIDE, {EHudElement.QUICKBAR});
  75. m_ElementLinkMap.Insert(EHudContextFlags.QUICKBAR_GLOBAL, {EHudElement.QUICKBAR});
  76. m_ElementLinkMap.Insert(EHudContextFlags.INVENTORY_OPEN, hud);
  77. m_ElementLinkMap.Insert(EHudContextFlags.UNCONSCIOUS, hud);
  78. }
  79. // Set flag which changes HUD visibility
  80. void SetContextFlag(EHudContextFlags flag, bool state)
  81. {
  82. if (state)
  83. m_CtxFlags |= flag;
  84. else
  85. m_CtxFlags &= ~flag;
  86. array<EHudElement> affectedElements = m_ElementLinkMap.Get(flag);
  87. foreach (EHudElement element : affectedElements)
  88. {
  89. UpdateElement(element);
  90. }
  91. }
  92. // Check widget visibility
  93. bool IsElementVisible(EHudElement element)
  94. {
  95. Widget widget = m_ElementMap.Get(element);
  96. if (widget)
  97. return widget.IsVisible());
  98. return false;
  99. }
  100. // Check if specific visibility rules are active
  101. bool IsContextFlagActive(EHudContextFlags flag)
  102. {
  103. if (m_CtxFlags & flag)
  104. return true;
  105. return false;
  106. }
  107. protected void UpdateElement(EHudElement element)
  108. {
  109. bool visible = true;
  110. switch (element)
  111. {
  112. // LHUD group
  113. case EHudElement.LHUD_PRESENCE:
  114. case EHudElement.LHUD_STANCE:
  115. case EHudElement.LHUD_PLAYER:
  116. if (m_CtxFlags & (HUD_HIDE_FLAGS | EHudContextFlags.VEHICLE) && (m_CtxFlags & EHudContextFlags.INVENTORY_OPEN) == 0)
  117. visible = false;
  118. break;
  119. case EHudElement.LHUD_VEHICLE:
  120. if ((m_CtxFlags & EHudContextFlags.DRIVER) == 0 || m_CtxFlags & (EHudContextFlags.VEHICLE_DISABLE | EHudContextFlags.MENU_OPEN | EHudContextFlags.UNCONSCIOUS))
  121. visible = false;
  122. break;
  123. // RHUD group
  124. case EHudElement.RHUD_DIVIDER:
  125. if (m_CtxFlags & EHudContextFlags.NO_BADGE)
  126. visible = false;
  127. case EHudElement.RHUD_BADGES:
  128. case EHudElement.RHUD_NOTIFIERS:
  129. if (m_CtxFlags & HUD_HIDE_FLAGS && (m_CtxFlags & EHudContextFlags.INVENTORY_OPEN) == 0)
  130. visible = false;
  131. break;
  132. case EHudElement.QUICKBAR:
  133. if (m_CtxFlags & QUICKBAR_HIDE_FLAGS)
  134. visible = false;
  135. break;
  136. }
  137. UpdateVisibility(element, visible);
  138. }
  139. protected void UpdateVisibility(EHudElement element, bool target)
  140. {
  141. Widget widget = m_ElementMap.Get(element);
  142. if (!widget)
  143. return;
  144. if (target && !widget.IsVisible())
  145. {
  146. widget.Show(true);
  147. //Print(typename.EnumToString(EHudElement, element) + " SHOW");
  148. }
  149. if (!target && widget.IsVisible())
  150. {
  151. widget.Show(false);
  152. //Print(typename.EnumToString(EHudElement, element) + " HIDE");
  153. }
  154. }
  155. }