UserEventHandler.cpp 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. /*
  2. * EventHandlerSDLUser.cpp, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #include "StdInc.h"
  11. #include "UserEventHandler.h"
  12. #include "../CMT.h"
  13. #include "../CPlayerInterface.h"
  14. #include "../CServerHandler.h"
  15. #include "../gui/CGuiHandler.h"
  16. #include "../gui/WindowHandler.h"
  17. #include "../mainmenu/CMainMenu.h"
  18. #include "../mainmenu/CPrologEpilogVideo.h"
  19. #include <SDL_events.h>
  20. void UserEventHandler::handleUserEvent(const SDL_UserEvent & user)
  21. {
  22. switch(static_cast<EUserEvent>(user.code))
  23. {
  24. case EUserEvent::FORCE_QUIT:
  25. {
  26. handleQuit(false);
  27. return;
  28. }
  29. break;
  30. case EUserEvent::RETURN_TO_MAIN_MENU:
  31. {
  32. CSH->endGameplay();
  33. GH.defActionsDef = 63;
  34. CMM->menu->switchToTab("main");
  35. }
  36. break;
  37. case EUserEvent::RESTART_GAME:
  38. {
  39. CSH->sendRestartGame();
  40. }
  41. break;
  42. case EUserEvent::CAMPAIGN_START_SCENARIO:
  43. {
  44. CSH->campaignServerRestartLock.set(true);
  45. CSH->endGameplay();
  46. auto ourCampaign = std::shared_ptr<CCampaignState>(reinterpret_cast<CCampaignState *>(user.data1));
  47. auto & epilogue = ourCampaign->camp->scenarios[ourCampaign->mapsConquered.back()].epilog;
  48. auto finisher = [=]()
  49. {
  50. if(!ourCampaign->mapsRemaining.empty())
  51. {
  52. GH.windows().pushWindow(CMM);
  53. GH.windows().pushWindow(CMM->menu);
  54. CMM->openCampaignLobby(ourCampaign);
  55. }
  56. };
  57. if(epilogue.hasPrologEpilog)
  58. {
  59. GH.windows().createAndPushWindow<CPrologEpilogVideo>(epilogue, finisher);
  60. }
  61. else
  62. {
  63. CSH->campaignServerRestartLock.waitUntil(false);
  64. finisher();
  65. }
  66. }
  67. break;
  68. case EUserEvent::RETURN_TO_MENU_LOAD:
  69. CSH->endGameplay();
  70. GH.defActionsDef = 63;
  71. CMM->menu->switchToTab("load");
  72. break;
  73. case EUserEvent::FULLSCREEN_TOGGLED:
  74. {
  75. boost::unique_lock<boost::recursive_mutex> lock(*CPlayerInterface::pim);
  76. GH.onScreenResize();
  77. break;
  78. }
  79. default:
  80. logGlobal->error("Unknown user event. Code %d", user.code);
  81. break;
  82. }
  83. }