UserEventHandler.cpp 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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 "../gui/EventDispatcher.h"
  20. #include "../../lib/campaign/CampaignState.h"
  21. #include <SDL_events.h>
  22. void UserEventHandler::handleUserEvent(const SDL_UserEvent & user)
  23. {
  24. switch(static_cast<EUserEvent>(user.code))
  25. {
  26. case EUserEvent::FORCE_QUIT:
  27. {
  28. handleQuit(false);
  29. return;
  30. }
  31. break;
  32. case EUserEvent::RETURN_TO_MAIN_MENU:
  33. {
  34. CSH->endGameplay();
  35. GH.defActionsDef = 63;
  36. CMM->menu->switchToTab("main");
  37. }
  38. break;
  39. case EUserEvent::RESTART_GAME:
  40. {
  41. CSH->sendRestartGame();
  42. }
  43. break;
  44. case EUserEvent::CAMPAIGN_START_SCENARIO:
  45. {
  46. CSH->campaignServerRestartLock.set(true);
  47. CSH->endGameplay();
  48. auto ourCampaign = std::shared_ptr<CampaignState>(reinterpret_cast<CampaignState *>(user.data1));
  49. auto & epilogue = ourCampaign->scenario(*ourCampaign->lastScenario()).epilog;
  50. auto finisher = [=]()
  51. {
  52. if(!ourCampaign->isCampaignFinished())
  53. {
  54. GH.windows().pushWindow(CMM);
  55. GH.windows().pushWindow(CMM->menu);
  56. CMM->openCampaignLobby(ourCampaign);
  57. }
  58. };
  59. if(epilogue.hasPrologEpilog)
  60. {
  61. GH.windows().createAndPushWindow<CPrologEpilogVideo>(epilogue, finisher);
  62. }
  63. else
  64. {
  65. CSH->campaignServerRestartLock.waitUntil(false);
  66. finisher();
  67. }
  68. }
  69. break;
  70. case EUserEvent::RETURN_TO_MENU_LOAD:
  71. CSH->endGameplay();
  72. GH.defActionsDef = 63;
  73. CMM->menu->switchToTab("load");
  74. break;
  75. case EUserEvent::FULLSCREEN_TOGGLED:
  76. {
  77. boost::unique_lock<boost::recursive_mutex> lock(*CPlayerInterface::pim);
  78. GH.onScreenResize();
  79. break;
  80. }
  81. case EUserEvent::FAKE_MOUSE_MOVE:
  82. GH.events().dispatchMouseMoved(Point(0, 0), GH.getCursorPosition());
  83. break;
  84. default:
  85. logGlobal->error("Unknown user event. Code %d", user.code);
  86. break;
  87. }
  88. }