MainWindow.cpp 5.2 KB

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