inputdevicedisconnectwarningmenu.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. class InputDeviceDisconnectWarningMenu extends UIScriptedMenu
  2. {
  3. private ref array<int> m_DisconnectedDevices;
  4. private ref array<int> m_DeviceOrder = {EUAINPUT_DEVICE_CONTROLLER,EUAINPUT_DEVICE_MOUSE,EUAINPUT_DEVICE_KEYBOARD};
  5. private ref map<int,string> m_DeviceMessages;
  6. private bool m_CanClose;
  7. private bool m_Initialized;
  8. private string m_DevicesText;
  9. private string m_CaptionText;
  10. private string m_ConfirmationText;
  11. private WrapSpacerWidget m_WrapperWidget;
  12. private TextWidget m_CaptionWidget;
  13. private RichTextWidget m_DeviceListWidget;
  14. private RichTextWidget m_ActionTextWidget;
  15. void InputDeviceDisconnectWarningMenu()
  16. {
  17. g_Game.GetMission().AddActiveInputExcludes({"gamepaddisconnect"});
  18. m_DisconnectedDevices = new array<int>;
  19. m_CanClose = false;
  20. BuildMessages();
  21. }
  22. void ~InputDeviceDisconnectWarningMenu()
  23. {
  24. if (g_Game)
  25. {
  26. PPERequesterBank.GetRequester(PPERequester_ControllerDisconnectBlur).Stop();
  27. g_Game.DeleteTitleScreen(); // Removes any outstanding gamepad identification propmt; the gamepad is already recognized by now
  28. if (g_Game.GetMission())
  29. g_Game.GetMission().RemoveActiveInputExcludes({"gamepaddisconnect"},true);
  30. }
  31. }
  32. override Widget Init()
  33. {
  34. layoutRoot = g_Game.GetWorkspace().CreateWidgets("gui/layouts/new_ui/notifications/day_z_input_device_warning.layout");
  35. m_WrapperWidget = WrapSpacerWidget.Cast(layoutRoot.FindAnyWidget("Wrapper"));
  36. m_CaptionWidget = TextWidget.Cast(layoutRoot.FindAnyWidget("Caption"));
  37. m_DeviceListWidget = RichTextWidget.Cast(layoutRoot.FindAnyWidget("DeviceList"));
  38. m_ActionTextWidget = RichTextWidget.Cast(layoutRoot.FindAnyWidget("ActionText"));
  39. g_Game.GetMission().GetOnInputDeviceConnected().Insert(UpdateDisconnectedDevices);
  40. g_Game.GetMission().GetOnInputDeviceDisconnected().Insert(UpdateDisconnectedDevices);
  41. UpdateDisconnectedDevices();
  42. if (g_Game.GetUIManager() && g_Game.GetUIManager().IsDialogVisible())
  43. {
  44. g_Game.GetUIManager().CloseDialog();
  45. }
  46. PPERequesterBank.GetRequester(PPERequester_ControllerDisconnectBlur).Start();
  47. return layoutRoot;
  48. }
  49. private void BuildMessages()
  50. {
  51. m_DeviceMessages = new map<int,string>;
  52. m_DeviceMessages.Insert(EUAINPUT_DEVICE_CONTROLLER,string.Format("<image set=\"dayz_gui\" name=\"icon_Gamepad\" />"));
  53. m_DeviceMessages.Insert(EUAINPUT_DEVICE_MOUSE,string.Format("<image set=\"dayz_gui\" name=\"icon_Mouse\" />"));
  54. m_DeviceMessages.Insert(EUAINPUT_DEVICE_KEYBOARD,string.Format("<image set=\"dayz_gui\" name=\"icon_Keyboard\" />"));
  55. }
  56. //! Composes message depending on context
  57. private void UpdateDisconnectTexts()
  58. {
  59. int deviceCount = m_DisconnectedDevices.Count();
  60. int count = m_DeviceOrder.Count();
  61. int idx;
  62. int device;
  63. bool gamepadInactive = false;
  64. m_DevicesText = string.Empty;
  65. for (int i = 0; i < count; i++)
  66. {
  67. device = m_DeviceOrder[i];
  68. idx = m_DisconnectedDevices.Find(device);
  69. if (idx != -1) //is disconnected and relevant
  70. {
  71. m_DevicesText += m_DeviceMessages.Get(device) + " ";
  72. if (device == EUAINPUT_DEVICE_CONTROLLER)
  73. {
  74. gamepadInactive = true;
  75. if (deviceCount > 1)
  76. {
  77. m_DevicesText += "| ";
  78. }
  79. }
  80. }
  81. }
  82. if (deviceCount > 1)
  83. {
  84. m_CaptionText = "#str_inputdevice_notification_header_multiple";
  85. m_ConfirmationText = "#str_inputdevice_notification_prompt_multiple";
  86. }
  87. else
  88. {
  89. m_CaptionText = "#str_inputdevice_notification_header_single";
  90. m_ConfirmationText = "#str_inputdevice_notification_prompt_single";
  91. }
  92. }
  93. private void SetDisconnectTexts()
  94. {
  95. m_CaptionWidget.SetText(m_CaptionText);
  96. m_DeviceListWidget.SetText(m_DevicesText);
  97. m_ActionTextWidget.SetText(m_ConfirmationText);
  98. m_WrapperWidget.Update();
  99. }
  100. private void UpdateDisconnectedDevices(int device = -1)
  101. {
  102. m_DisconnectedDevices.Clear();
  103. m_CanClose = g_Game.GetInput().AreAllAllowedInputDevicesActive(m_DisconnectedDevices);
  104. UpdateWarningMenu(device);
  105. m_Initialized = true;
  106. }
  107. private void UpdateWarningMenu(int device)
  108. {
  109. if (m_CanClose)
  110. {
  111. Close();
  112. }
  113. else if (layoutRoot)
  114. {
  115. UpdateDisconnectTexts();
  116. SetDisconnectTexts();
  117. }
  118. }
  119. //back-up close handling
  120. override bool OnMouseButtonUp(Widget w, int x, int y, int button)
  121. {
  122. bool ret = super.OnMouseButtonUp(w,x,y,button);
  123. if (m_CanClose)
  124. {
  125. Close();
  126. }
  127. return ret | m_CanClose;
  128. }
  129. //back-up close handling
  130. override bool OnKeyUp(Widget w, int x, int y, int key)
  131. {
  132. bool ret = super.OnKeyUp(w,x,y,key);
  133. if (m_CanClose)
  134. {
  135. Close();
  136. }
  137. return ret | m_CanClose;
  138. }
  139. }