UserEventHandler.cpp 2.2 KB

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