MainWindow.cpp 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. // Include own headers
  2. #include "MainWindow.hpp"
  3. #include "../gui/ui_MainWindow.h"
  4. // Include modules
  5. #include "TrackPointRenderer.hpp"
  6. #include "PickHandler.hpp"
  7. // Include dependencies
  8. #include <QFileDialog>
  9. #include <QMessageBox>
  10. MainWindow* globalPointer;
  11. MainWindow* MainWindow::getInstance() {
  12. return globalPointer;
  13. }
  14. MainWindow::MainWindow(QWidget* parent): QMainWindow(parent), ui(new Ui::MainWindow) {
  15. globalPointer = this;
  16. ui->setupUi(this);
  17. osgWidget = new OSGWidget(this);
  18. ui->sceneWidget->layout()->addWidget(osgWidget);
  19. noMeshWidget = new NoMeshWidget();
  20. editWidget = new EditWidget();
  21. // TODO: Add option for opening a project via double click
  22. projectStore = new ProjectStore();
  23. renderView(NoMesh);
  24. // Setup menu
  25. newAct = new QAction(tr("&New project"), this);
  26. newAct->setShortcuts(QKeySequence::New);
  27. newAct->setStatusTip(tr("Create a new file"));
  28. connect(newAct, &QAction::triggered, this, &MainWindow::newFile);
  29. loadAct = new QAction(tr("&Load project"), this);
  30. loadAct->setShortcuts(QKeySequence::Open);
  31. loadAct->setStatusTip(tr("Load an existing project"));
  32. connect(loadAct, &QAction::triggered, this, &MainWindow::load);
  33. saveAct = new QAction(tr("&Save project"), this);
  34. saveAct->setShortcuts(QKeySequence::Save);
  35. saveAct->setStatusTip(tr("Update the project file"));
  36. connect(saveAct, &QAction::triggered, this, &MainWindow::save);
  37. saveAsAct = new QAction(tr("&Save project as"), this);
  38. saveAsAct->setStatusTip(tr("Save the project in a new file"));
  39. connect(saveAsAct, &QAction::triggered, this, &MainWindow::saveAs);
  40. closeAct = new QAction(tr("&Close project"), this);
  41. closeAct->setShortcuts(QKeySequence::Close);
  42. closeAct->setStatusTip(tr("Closing the current project"));
  43. connect(closeAct, &QAction::triggered, this, &MainWindow::close);
  44. fileMenu = menuBar()->addMenu(tr("&File"));
  45. fileMenu->addAction(newAct);
  46. fileMenu->addSeparator();
  47. fileMenu->addAction(loadAct);
  48. fileMenu->addSeparator();
  49. fileMenu->addAction(saveAct);
  50. fileMenu->addAction(saveAsAct);
  51. fileMenu->addSeparator();
  52. fileMenu->addAction(closeAct);
  53. }
  54. MainWindow::~MainWindow() {
  55. delete ui;
  56. delete osgWidget;
  57. }
  58. void MainWindow::renderView(GuiView view) {
  59. switch(view) {
  60. case NoMesh: {
  61. editWidget->setParent(nullptr);
  62. ui->controlWidget->layout()->addWidget(noMeshWidget);
  63. break;
  64. }
  65. case Edit: {
  66. noMeshWidget->setParent(nullptr);
  67. ui->controlWidget->layout()->addWidget(editWidget);
  68. break;
  69. }
  70. }
  71. }
  72. OSGWidget* MainWindow::getOsgWidget() {
  73. return osgWidget;
  74. }
  75. ProjectStore* MainWindow::getStore() {
  76. return projectStore;
  77. }
  78. EditWidget* MainWindow::getEditWiget() {
  79. return editWidget;
  80. }
  81. void MainWindow::showErrorMessage(std::string message, std::string title) {
  82. QMessageBox msg(this);
  83. msg.setText(QString::fromUtf8(message.c_str()));
  84. msg.setWindowTitle(QString::fromUtf8(title.c_str()));
  85. msg.exec();
  86. }
  87. void MainWindow::closeEvent(QCloseEvent *event) {
  88. if (projectStore->isModified()) {
  89. if (!saveChangesPopup()) {
  90. event->ignore();
  91. return;
  92. }
  93. }
  94. if (projectStore->isRendering()) {
  95. if (!isRenderingPopup()) {
  96. event->ignore();
  97. return;
  98. }
  99. }
  100. projectStore->closeProject();
  101. event->accept();
  102. }
  103. void MainWindow::newFile() {
  104. if (projectStore->isProjectOpen()) {
  105. if (projectStore->isModified()) {
  106. if (!saveChangesPopup()) return;
  107. }
  108. if (projectStore->isRendering()) {
  109. if (!isRenderingPopup()) return;
  110. }
  111. projectStore->closeProject();
  112. }
  113. renderView(NoMesh);
  114. cleanup();
  115. noMeshWidget->loadMeshFile();
  116. }
  117. void MainWindow::load() {
  118. QString fileName = QFileDialog::getOpenFileName(this, tr("Open a TrackpointApp Project"), "", tr("TrackpointApp Projects (*.trackproj)"));
  119. std::string projectFile = fileName.toUtf8().constData();
  120. projectStore->loadProject(projectFile);
  121. }
  122. bool MainWindow::save() {
  123. if (!projectStore->saveProject()) {
  124. return saveAs();
  125. }
  126. return true;
  127. }
  128. bool MainWindow::saveAs() {
  129. QString fileName = QFileDialog::getSaveFileName(this, tr("Save your TrackpointApp Project"), "", tr("TrackpointApp Projects (*.trackproj)"));
  130. std::string fileString = fileName.toUtf8().constData();
  131. if (!projectStore->saveProject(fileString)) {
  132. showErrorMessage("Something went wrong while saving the project. Please try again.", "Error saving project.");
  133. return false;
  134. }
  135. return true;
  136. }
  137. void MainWindow::close() {
  138. if (projectStore->isModified()) {
  139. if (!saveChangesPopup()) return;
  140. }
  141. if (projectStore->isRendering()) {
  142. if (!isRenderingPopup()) return;
  143. }
  144. projectStore->closeProject();
  145. renderView(NoMesh);
  146. cleanup();
  147. }
  148. void MainWindow::cleanup() {
  149. editWidget->resetAllSettings();
  150. osgWidget->clear();
  151. osgWidget->getPointRenderer()->clear();
  152. }
  153. bool MainWindow::saveChangesPopup() {
  154. QMessageBox msgBox;
  155. msgBox.setText("The current project has been modified.");
  156. msgBox.setInformativeText("Do you want to save your changes?");
  157. msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
  158. msgBox.setDefaultButton(QMessageBox::Save);
  159. int ret = msgBox.exec();
  160. switch(ret) {
  161. case QMessageBox::Save:
  162. return save();
  163. case QMessageBox::Discard:
  164. return true;
  165. case QMessageBox::Cancel:
  166. return false;
  167. default:
  168. return false;
  169. }
  170. }
  171. bool MainWindow::isRenderingPopup() {
  172. QMessageBox msgBox;
  173. msgBox.setText("A rendering is in progress.");
  174. msgBox.setInformativeText("Do you really want to cancel the rendering?");
  175. msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
  176. msgBox.setDefaultButton(QMessageBox::No);
  177. int ret = msgBox.exec();
  178. switch(ret) {
  179. case QMessageBox::Yes:
  180. return true;
  181. case QMessageBox::No:
  182. return false;
  183. default:
  184. return false;
  185. }
  186. }