SettingsMainWindow.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. /*
  2. * SettingsMainContainer.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 "SettingsMainWindow.h"
  12. #include "AdventureOptionsTab.h"
  13. #include "BattleOptionsTab.h"
  14. #include "GeneralOptionsTab.h"
  15. #include "OtherOptionsTab.h"
  16. #include "CMT.h"
  17. #include "CGameInfo.h"
  18. #include "texts/CGeneralTextHandler.h"
  19. #include "CPlayerInterface.h"
  20. #include "CServerHandler.h"
  21. #include "filesystem/ResourcePath.h"
  22. #include "gui/CGuiHandler.h"
  23. #include "gui/WindowHandler.h"
  24. #include "render/Canvas.h"
  25. #include "lobby/CSavingScreen.h"
  26. #include "widgets/Buttons.h"
  27. #include "widgets/Images.h"
  28. #include "widgets/ObjectLists.h"
  29. #include "windows/CMessage.h"
  30. SettingsMainWindow::SettingsMainWindow(BattleInterface * parentBattleUi) : InterfaceObjectConfigurable()
  31. {
  32. OBJECT_CONSTRUCTION;
  33. const JsonNode config(JsonPath::builtin("config/widgets/settings/settingsMainContainer.json"));
  34. addCallback("activateSettingsTab", [this](int tabId) { openTab(tabId); });
  35. addCallback("loadGame", [this](int) { loadGameButtonCallback(); });
  36. addCallback("saveGame", [this](int) { saveGameButtonCallback(); });
  37. addCallback("restartGame", [this](int) { restartGameButtonCallback(); });
  38. addCallback("quitGame", [this](int) { quitGameButtonCallback(); });
  39. addCallback("returnToMainMenu", [this](int) { mainMenuButtonCallback(); });
  40. addCallback("closeWindow", [this](int) { backButtonCallback(); });
  41. build(config);
  42. addUsedEvents(INPUT_MODE_CHANGE);
  43. std::shared_ptr<CIntObject> background = widget<CIntObject>("background");
  44. pos.w = background->pos.w;
  45. pos.h = background->pos.h;
  46. pos = center();
  47. std::shared_ptr<CButton> loadButton = widget<CButton>("loadButton");
  48. assert(loadButton);
  49. std::shared_ptr<CButton> saveButton = widget<CButton>("saveButton");
  50. assert(saveButton);
  51. std::shared_ptr<CButton> restartButton = widget<CButton>("restartButton");
  52. assert(restartButton);
  53. loadButton->block(CSH->isGuest());
  54. saveButton->block(CSH->isGuest() || parentBattleUi);
  55. restartButton->block(CSH->isGuest() || parentBattleUi);
  56. int defaultTabIndex = 0;
  57. if(parentBattleUi != nullptr)
  58. defaultTabIndex = 2;
  59. else if(settings["general"]["lastSettingsTab"].isNumber())
  60. defaultTabIndex = settings["general"]["lastSettingsTab"].Integer();
  61. parentBattleInterface = parentBattleUi;
  62. tabContentArea = std::make_shared<CTabbedInt>(std::bind(&SettingsMainWindow::createTab, this, _1), Point(0, 0), defaultTabIndex);
  63. tabContentArea->setRedrawParent(true);
  64. std::shared_ptr<CToggleGroup> mainTabs = widget<CToggleGroup>("settingsTabs");
  65. mainTabs->setSelected(defaultTabIndex);
  66. LOCPLINT->gamePause(true);
  67. }
  68. std::shared_ptr<CIntObject> SettingsMainWindow::createTab(size_t index)
  69. {
  70. switch(index)
  71. {
  72. case 0:
  73. return std::make_shared<GeneralOptionsTab>();
  74. case 1:
  75. return std::make_shared<AdventureOptionsTab>();
  76. case 2:
  77. return std::make_shared<BattleOptionsTab>(parentBattleInterface);
  78. case 3:
  79. return std::make_shared<OtherOptionsTab>();
  80. default:
  81. logGlobal->error("Wrong settings tab ID!");
  82. return std::make_shared<GeneralOptionsTab>();
  83. }
  84. }
  85. void SettingsMainWindow::openTab(size_t index)
  86. {
  87. tabContentArea->setActive(index);
  88. CIntObject::redraw();
  89. Settings lastUsedTab = settings.write["general"]["lastSettingsTab"];
  90. lastUsedTab->Integer() = index;
  91. }
  92. void SettingsMainWindow::close()
  93. {
  94. if(!GH.windows().isTopWindow(this))
  95. logGlobal->error("Only top interface must be closed");
  96. LOCPLINT->gamePause(false);
  97. GH.windows().popWindows(1);
  98. }
  99. void SettingsMainWindow::quitGameButtonCallback()
  100. {
  101. LOCPLINT->showYesNoDialog(
  102. CGI->generaltexth->allTexts[578],
  103. [this]()
  104. {
  105. close();
  106. GH.dispatchMainThread( []()
  107. {
  108. handleQuit(false);
  109. });
  110. },
  111. 0
  112. );
  113. }
  114. void SettingsMainWindow::backButtonCallback()
  115. {
  116. close();
  117. }
  118. void SettingsMainWindow::mainMenuButtonCallback()
  119. {
  120. LOCPLINT->showYesNoDialog(
  121. CGI->generaltexth->allTexts[578],
  122. [this]()
  123. {
  124. close();
  125. CSH->endGameplay();
  126. CMM->menu->switchToTab("main");
  127. },
  128. 0
  129. );
  130. }
  131. void SettingsMainWindow::loadGameButtonCallback()
  132. {
  133. close();
  134. LOCPLINT->proposeLoadingGame();
  135. }
  136. void SettingsMainWindow::saveGameButtonCallback()
  137. {
  138. close();
  139. GH.windows().createAndPushWindow<CSavingScreen>();
  140. }
  141. void SettingsMainWindow::restartGameButtonCallback()
  142. {
  143. LOCPLINT->showYesNoDialog(
  144. CGI->generaltexth->allTexts[67],
  145. [this]()
  146. {
  147. close();
  148. GH.dispatchMainThread([](){
  149. CSH->sendRestartGame();
  150. });
  151. },
  152. 0
  153. );
  154. }
  155. void SettingsMainWindow::showAll(Canvas & to)
  156. {
  157. auto color = LOCPLINT ? LOCPLINT->playerID : PlayerColor(1);
  158. if(settings["session"]["spectate"].Bool())
  159. color = PlayerColor(1); // TODO: Spectator shouldn't need special code for UI colors
  160. CIntObject::showAll(to);
  161. CMessage::drawBorder(color, to, pos.w+28, pos.h+29, pos.x-14, pos.y-15);
  162. }
  163. void SettingsMainWindow::onScreenResize()
  164. {
  165. InterfaceObjectConfigurable::onScreenResize();
  166. auto tab = std::dynamic_pointer_cast<GeneralOptionsTab>(tabContentArea->getItem());
  167. if (tab)
  168. tab->updateResolutionSelector();
  169. }