MainWindow.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  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::closeEvent(QCloseEvent *event) {
  82. if (MainWindow::getInstance()->getStore()->isModified()) {
  83. if (!saveChangesPopup()) {
  84. event->ignore();
  85. return;
  86. }
  87. }
  88. MainWindow::getInstance()->getStore()->closeProject();
  89. event->accept();
  90. }
  91. void MainWindow::newFile() {
  92. if (MainWindow::getInstance()->getStore()->isProjectOpen()) {
  93. if (MainWindow::getInstance()->getStore()->isModified()) {
  94. if (!saveChangesPopup()) return;
  95. }
  96. MainWindow::getInstance()->getStore()->closeProject();
  97. }
  98. renderView(NoMesh);
  99. cleanup();
  100. noMeshWidget->loadMeshFile();
  101. }
  102. void MainWindow::load() {
  103. QString fileName = QFileDialog::getOpenFileName(this, tr("Open a TrackpointApp Project"), "", tr("TrackpointApp Projects (*.trackproj)"));
  104. std::string projectFile = fileName.toUtf8().constData();
  105. MainWindow::getInstance()->getStore()->loadProject(projectFile);
  106. }
  107. bool MainWindow::save() {
  108. if (!projectStore->saveProject()) {
  109. return saveAs();
  110. }
  111. return true;
  112. }
  113. bool MainWindow::saveAs() {
  114. QString fileName = QFileDialog::getSaveFileName(this, tr("Save your TrackpointApp Project"), "", tr("TrackpointApp Projects (*.trackproj)"));
  115. std::string fileString = fileName.toUtf8().constData();
  116. if (!projectStore->saveProject(fileString)) {
  117. // TODO: Show error popup
  118. return false;
  119. }
  120. return true;
  121. }
  122. void MainWindow::close() {
  123. if (MainWindow::getInstance()->getStore()->isModified()) {
  124. if (!saveChangesPopup()) return;
  125. }
  126. MainWindow::getInstance()->getStore()->closeProject();
  127. renderView(NoMesh);
  128. cleanup();
  129. }
  130. void MainWindow::cleanup() {
  131. editWidget->resetAllSettings();
  132. osgWidget->clear();
  133. osgWidget->getPointRenderer()->clear();
  134. }
  135. bool MainWindow::saveChangesPopup() {
  136. QMessageBox msgBox;
  137. msgBox.setText("The current project has been modified.");
  138. msgBox.setInformativeText("Do you want to save your changes?");
  139. msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
  140. msgBox.setDefaultButton(QMessageBox::Save);
  141. int ret = msgBox.exec();
  142. switch(ret) {
  143. case QMessageBox::Save:
  144. return save();
  145. case QMessageBox::Discard:
  146. return true;
  147. case QMessageBox::Cancel:
  148. return false;
  149. default:
  150. return false;
  151. }
  152. }