PageRenderTime 47ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 0ms

/source/Gui/MainView.cpp

https://gitlab.com/ChristianHeinemann/alien
C++ | 369 lines | 317 code | 48 blank | 4 comment | 3 complexity | f3551d813745dafb87e4f5a15a612aa7 MD5 | raw file
  1. #include <QDesktopServices>
  2. #include <QUrl>
  3. #include <QTimer>
  4. #include <QDockWidget>
  5. #include "EngineInterface/SimulationController.h"
  6. #include "EngineInterface/Serializer.h"
  7. #include "EngineInterface/SymbolTable.h"
  8. #include "EngineInterface/SerializationHelper.h"
  9. #include "EngineInterface/SpaceProperties.h"
  10. #include "EngineInterface/SimulationContext.h"
  11. #include "ToolbarController.h"
  12. #include "ToolbarContext.h"
  13. #include "ActionController.h"
  14. #include "ActionHolder.h"
  15. #include "MonitorController.h"
  16. #include "GeneralInfoController.h"
  17. #include "DataEditController.h"
  18. #include "DataEditContext.h"
  19. #include "NewSimulationDialog.h"
  20. #include "Settings.h"
  21. #include "MainView.h"
  22. #include "MainController.h"
  23. #include "MainModel.h"
  24. #include "SimulationParametersDialog.h"
  25. #include "SymbolTableDialog.h"
  26. #include "GettingStartedWindow.h"
  27. #include "LoggingController.h"
  28. #include "StartupController.h"
  29. #include "SimulationViewController.h"
  30. #include "ui_MainView.h"
  31. MainView::MainView(QWidget* parent)
  32. : QMainWindow(parent)
  33. , ui(new Ui::MainView)
  34. {
  35. ui->setupUi(this);
  36. setupFontsAndColors();
  37. setupFullScreen();
  38. _simulationViewController = new SimulationViewController(this);
  39. auto simulationViewWidget = _simulationViewController->getWidget();
  40. _toolbar = new ToolbarController(simulationViewWidget);
  41. _dataEditor = new DataEditController(simulationViewWidget);
  42. _infoController = new GeneralInfoController(this);
  43. _actions = new ActionController(this);
  44. _monitor = new MonitorController(this);
  45. _logging = new LoggingController(this);
  46. _gettingStartedWindow = new GettingStartedWindow(this);
  47. simulationViewWidget->setParent(ui->centralWidget);
  48. simulationViewWidget->setObjectName(QString::fromUtf8("simulationViewWidget"));
  49. QSizePolicy sizePolicy1(QSizePolicy::Expanding, QSizePolicy::Expanding);
  50. sizePolicy1.setHorizontalStretch(0);
  51. sizePolicy1.setVerticalStretch(0);
  52. sizePolicy1.setHeightForWidth(simulationViewWidget->sizePolicy().hasHeightForWidth());
  53. simulationViewWidget->setSizePolicy(sizePolicy1);
  54. simulationViewWidget->setMinimumSize(QSize(0, 0));
  55. simulationViewWidget->setMaximumSize(QSize(16777215, 16777215));
  56. simulationViewWidget->setLayoutDirection(Qt::LeftToRight);
  57. ui->gridLayout->addWidget(simulationViewWidget, 0, 0, 1, 1);
  58. {
  59. auto gridLayout = new QGridLayout(ui->monitorGroupBox);
  60. gridLayout->setSpacing(6);
  61. gridLayout->setVerticalSpacing(0);
  62. gridLayout->setContentsMargins(9, 9, 9, 9);
  63. gridLayout->addWidget(_monitor->getWidget(), 0, 0, 1, 1);
  64. }
  65. {
  66. auto gridLayout = new QGridLayout(ui->loggingGroupBox);
  67. gridLayout->setSpacing(6);
  68. gridLayout->setVerticalSpacing(0);
  69. gridLayout->setContentsMargins(9, 9, 9, 9);
  70. gridLayout->addWidget(_logging->getWidget(), 0, 0, 1, 1);
  71. }
  72. connect(_gettingStartedWindow, &GettingStartedWindow::closed, this, &MainView::gettingStartedWindowClosed);
  73. connect(ui->infobar, &QDockWidget::visibilityChanged, this, &MainView::infobarChanged);
  74. connect(_simulationViewController, &SimulationViewController::zoomFactorChanged, _infoController, &GeneralInfoController::setZoomFactor);
  75. show();
  76. }
  77. MainView::~MainView()
  78. {
  79. delete ui;
  80. }
  81. void MainView::init(
  82. MainModel* model,
  83. MainController* mainController,
  84. Serializer* serializer,
  85. DataRepository* repository,
  86. Notifier* notifier,
  87. WebSimulationController* webSimController,
  88. StartupController* startupController)
  89. {
  90. _simulationViewController->init();
  91. _model = model;
  92. _controller = mainController;
  93. _repository = repository;
  94. _notifier = notifier;
  95. _startupController = startupController;
  96. _infoController->init(ui->infoLabel, mainController);
  97. _monitor->init(_controller);
  98. _actions->init(
  99. _controller,
  100. _model,
  101. this,
  102. _simulationViewController,
  103. serializer,
  104. _infoController,
  105. _dataEditor,
  106. _toolbar,
  107. _monitor,
  108. repository,
  109. notifier,
  110. webSimController);
  111. setupMenuAndToolbar();
  112. setupStartupWidget();
  113. _initialied = true;
  114. }
  115. void MainView::initGettingStartedWindow()
  116. {
  117. auto show = GuiSettings::getSettingsValue(Const::GettingStartedWindowKey, Const::GettingStartedWindowKeyDefault);
  118. _actions->getActionHolder()->actionGettingStarted->setChecked(show);
  119. toggleGettingStarted(show);
  120. }
  121. void MainView::refresh()
  122. {
  123. _simulationViewController->refresh();
  124. }
  125. void MainView::initSimulation(SimulationController * controller, SimulationAccess* access)
  126. {
  127. _toolbar->init({ 10, 10 }, _notifier, _repository, controller->getContext(), _actions->getActionHolder());
  128. _dataEditor->init({ 10, 60 }, _notifier, _repository, controller->getContext());
  129. _simulationViewController->reinit(_notifier, controller, access, _repository);
  130. _actions->getActionHolder()->actionItemView->setChecked(false);
  131. }
  132. GeneralInfoController * MainView::getInfoController() const
  133. {
  134. return _infoController;
  135. }
  136. MonitorController* MainView::getMonitorController() const
  137. {
  138. return _monitor;
  139. }
  140. void MainView::toggleGettingStarted(bool show)
  141. {
  142. _gettingStartedWindow->setVisible(show);
  143. }
  144. void MainView::toggleInfobar(bool show)
  145. {
  146. ui->infobar->setVisible(show);
  147. QTimer::singleShot(1, [&] { refresh(); });
  148. }
  149. void MainView::showDocumentation()
  150. {
  151. QDesktopServices::openUrl(QUrl("https://alien-project.org/documentation.html"));
  152. }
  153. QWidget* MainView::getSimulationViewWidget() const
  154. {
  155. return _simulationViewController->getWidget();
  156. }
  157. void MainView::resizeEvent(QResizeEvent *event)
  158. {
  159. QMainWindow::resizeEvent(event);
  160. if (_initialied) {
  161. refresh();
  162. }
  163. }
  164. void MainView::closeEvent(QCloseEvent * event)
  165. {
  166. _closing = true;
  167. _actions->close();
  168. _controller->autoSave();
  169. QMainWindow::closeEvent(event);
  170. }
  171. void MainView::setupMenuAndToolbar()
  172. {
  173. auto actions = _actions->getActionHolder();
  174. ui->menuSimulation->addAction(actions->actionNewSimulation);
  175. ui->menuSimulation->addAction(actions->actionLoadSimulation);
  176. ui->menuSimulation->addAction(actions->actionSaveSimulation);
  177. /*
  178. ui->menuSimulation->addSeparator();
  179. ui->menuSimulation->addAction(actions->actionWebSimulation);
  180. */
  181. ui->menuSimulation->addSeparator();
  182. ui->menuSimulation->addAction(actions->actionRunSimulation);
  183. ui->menuSimulation->addAction(actions->actionRunStepForward);
  184. ui->menuSimulation->addAction(actions->actionRunStepBackward);
  185. ui->menuSimulation->addAction(actions->actionAcceleration);
  186. ui->menuSimulation->addAction(actions->actionSnapshot);
  187. ui->menuSimulation->addAction(actions->actionRestore);
  188. ui->menuSimulation->addAction(actions->actionRestrictTPS);
  189. ui->menuSimulation->addSeparator();
  190. ui->menuSimulation->addAction(actions->actionExit);
  191. ui->menuSettings->addAction(actions->actionComputationSettings);
  192. ui->menuSettings->addAction(actions->actionEditSimParameters);
  193. ui->menuSettings->addAction(actions->actionEditSymbols);
  194. ui->menuView->addAction(actions->actionOpenGLView);
  195. ui->menuView->addAction(actions->actionItemView);
  196. ui->menuView->addSeparator();
  197. ui->menuView->addAction(actions->actionNavigationMode);
  198. ui->menuView->addAction(actions->actionActionMode);
  199. ui->menuView->addSeparator();
  200. ui->menuView->addAction(actions->actionMonitor);
  201. ui->menuView->addSeparator();
  202. ui->menuView->addAction(actions->actionZoomIn);
  203. ui->menuView->addAction(actions->actionZoomOut);
  204. ui->menuView->addAction(actions->actionDisplayLink);
  205. ui->menuView->addSeparator();
  206. auto visualEffects = new QMenu("Visual effects", this);
  207. visualEffects->addAction(actions->actionGlowEffect);
  208. visualEffects->addAction(actions->actionMotionEffect);
  209. ui->menuView->addMenu(visualEffects);
  210. ui->menuView->addSeparator();
  211. ui->menuView->addAction(actions->actionShowCellInfo);
  212. ui->menuView->addAction(actions->actionCenterSelection);
  213. ui->menuEntity->addAction(actions->actionNewCell);
  214. ui->menuEntity->addAction(actions->actionNewParticle);
  215. ui->menuEntity->addSeparator();
  216. ui->menuEntity->addAction(actions->actionCopyEntity);
  217. ui->menuEntity->addAction(actions->actionPasteEntity);
  218. ui->menuEntity->addAction(actions->actionDeleteEntity);
  219. ui->menuEntity->addSeparator();
  220. ui->menuEntity->addAction(actions->actionNewToken);
  221. ui->menuEntity->addAction(actions->actionCopyToken);
  222. ui->menuEntity->addAction(actions->actionPasteToken);
  223. ui->menuEntity->addAction(actions->actionDeleteToken);
  224. ui->menuEntity->addSeparator();
  225. ui->menuEntity->addAction(actions->actionCopyToClipboard);
  226. ui->menuEntity->addAction(actions->actionPasteFromClipboard);
  227. ui->menuCollection->addAction(actions->actionNewRectangle);
  228. ui->menuCollection->addAction(actions->actionNewHexagon);
  229. ui->menuCollection->addAction(actions->actionNewDisc);
  230. ui->menuCollection->addAction(actions->actionNewParticles);
  231. ui->menuCollection->addSeparator();
  232. ui->menuCollection->addAction(actions->actionLoadCol);
  233. ui->menuCollection->addAction(actions->actionSaveCol);
  234. ui->menuCollection->addAction(actions->actionCopyCol);
  235. ui->menuCollection->addAction(actions->actionPasteCol);
  236. ui->menuCollection->addAction(actions->actionDeleteSel);
  237. ui->menuCollection->addAction(actions->actionDeleteCol);
  238. ui->menuCollection->addSeparator();
  239. ui->menuCollection->addAction(actions->actionColorizeSel);
  240. ui->menuCollection->addAction(actions->actionGenerateBranchNumbers);
  241. ui->menuCollection->addAction(actions->actionRandomizeCellFunctions);
  242. ui->menuCollection->addAction(actions->actionRemoveFreeCellConnections);
  243. ui->menuCollection->addSeparator();
  244. ui->menuCollection->addAction(actions->actionRandomMultiplier);
  245. ui->menuCollection->addAction(actions->actionGridMultiplier);
  246. ui->menuTools->addAction(actions->actionMostFrequentCluster);
  247. ui->menuTools->addAction(actions->actionSimulationChanger);
  248. ui->menuHelp->addAction(actions->actionAbout);
  249. ui->menuEntity->addSeparator();
  250. ui->menuHelp->addAction(actions->actionGettingStarted);
  251. ui->menuHelp->addAction(actions->actionDocumentation);
  252. auto createSeparator = [&] {
  253. auto separator = new QWidget(this);
  254. separator->setStyleSheet(Const::ToolbarSeparatorStyleSheet);
  255. separator->setMinimumWidth(5);
  256. return separator;
  257. };
  258. ui->toolBar->setIconSize(QSize(48, 48));
  259. ui->toolBar->addWidget(createSeparator());
  260. ui->toolBar->addAction(actions->actionZoomIn);
  261. ui->toolBar->addAction(actions->actionZoomOut);
  262. ui->toolBar->addWidget(createSeparator());
  263. ui->toolBar->addAction(actions->actionOpenGLView);
  264. ui->toolBar->addAction(actions->actionItemView);
  265. ui->toolBar->addWidget(createSeparator());
  266. ui->toolBar->addAction(actions->actionNavigationMode);
  267. ui->toolBar->addAction(actions->actionActionMode);
  268. ui->toolBar->addWidget(createSeparator());
  269. ui->toolBar->addAction(actions->actionMonitor);
  270. ui->toolBar->addWidget(createSeparator());
  271. ui->toolBar->addAction(actions->actionDisplayLink);
  272. ui->toolBar->addWidget(createSeparator());
  273. ui->toolBar->addAction(actions->actionRunSimulation);
  274. ui->toolBar->addAction(actions->actionAcceleration);
  275. ui->toolBar->addAction(actions->actionRunStepBackward);
  276. ui->toolBar->addAction(actions->actionRunStepForward);
  277. ui->toolBar->addWidget(createSeparator());
  278. ui->toolBar->addAction(actions->actionSnapshot);
  279. ui->toolBar->addAction(actions->actionRestore);
  280. ui->toolBar->addWidget(createSeparator());
  281. ui->infobar->setVisible(false);
  282. }
  283. void MainView::setupFontsAndColors()
  284. {
  285. ui->generalInfoGroupBox->setFont(GuiSettings::getGlobalFont());
  286. ui->monitorGroupBox->setFont(GuiSettings::getGlobalFont());
  287. ui->loggingGroupBox->setFont(GuiSettings::getGlobalFont());
  288. ui->toolBar->setStyleSheet(Const::ToolbarStyleSheet);
  289. ui->infobar->setStyleSheet(Const::InfobarStyleSheet);
  290. {
  291. QPalette p = palette();
  292. p.setColor(QPalette::Window, QColor(7, 7, 21));
  293. setPalette(p);
  294. }
  295. }
  296. void MainView::setupFullScreen()
  297. {
  298. setWindowState(windowState() | Qt::WindowFullScreen);
  299. setFixedSize(size() + QSize(0, 1)); //workaround because of a Qt bug
  300. }
  301. void MainView::setupStartupWidget()
  302. {
  303. _startupController->init();
  304. auto startupWidget = _startupController->getWidget();
  305. auto simulationViewWidget = _simulationViewController->getWidget();
  306. startupWidget->setParent(simulationViewWidget);
  307. auto posX = simulationViewWidget->width() / 2 - startupWidget->width() / 2;
  308. auto posY = simulationViewWidget->height() / 2 - startupWidget->height() / 2;
  309. startupWidget->move(posX, posY);
  310. startupWidget->setVisible(true);
  311. }
  312. void MainView::infobarChanged(bool show)
  313. {
  314. if (!show && !_closing) {
  315. _actions->getActionHolder()->actionMonitor->setChecked(false);
  316. }
  317. }
  318. void MainView::gettingStartedWindowClosed()
  319. {
  320. _actions->getActionHolder()->actionGettingStarted->setChecked(false);
  321. }