MainWindow.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  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. OSGWidget* MainWindow::getOsgWidget() {
  59. return osgWidget;
  60. }
  61. ProjectStore* MainWindow::getStore() {
  62. return projectStore;
  63. }
  64. EditWidget* MainWindow::getEditWiget() {
  65. return editWidget;
  66. }
  67. void MainWindow::renderView(GuiView view) {
  68. switch(view) {
  69. case NoMesh: {
  70. editWidget->setParent(nullptr);
  71. ui->controlWidget->layout()->addWidget(noMeshWidget);
  72. break;
  73. }
  74. case Edit: {
  75. noMeshWidget->setParent(nullptr);
  76. ui->controlWidget->layout()->addWidget(editWidget);
  77. break;
  78. }
  79. }
  80. }
  81. void MainWindow::newFile() {
  82. if (MainWindow::getInstance()->getStore()->isProjectOpen()) {
  83. if (MainWindow::getInstance()->getStore()->isModified()) {
  84. if (!saveChangesPopup()) return;
  85. }
  86. MainWindow::getInstance()->getStore()->closeProject();
  87. }
  88. renderView(NoMesh);
  89. cleanup();
  90. noMeshWidget->loadMeshFile();
  91. }
  92. void MainWindow::load() {
  93. QString fileName = QFileDialog::getOpenFileName(this, tr("Open a TrackpointApp Project"), "", tr("TrackpointApp Projects (*.trackproj)"));
  94. std::string projectFile = fileName.toUtf8().constData();
  95. MainWindow::getInstance()->getStore()->loadProject(projectFile);
  96. }
  97. bool MainWindow::save() {
  98. if (!projectStore->saveProject()) {
  99. return saveAs();
  100. }
  101. return true;
  102. }
  103. bool MainWindow::saveAs() {
  104. QString fileName = QFileDialog::getSaveFileName(this, tr("Save your TrackpointApp Project"), "", tr("TrackpointApp Projects (*.trackproj)"));
  105. std::string fileString = fileName.toUtf8().constData();
  106. if (!projectStore->saveProject(fileString)) {
  107. // TODO: Show error popup
  108. return false;
  109. }
  110. return true;
  111. }
  112. void MainWindow::close() {
  113. if (MainWindow::getInstance()->getStore()->isModified()) {
  114. if (!saveChangesPopup()) return;
  115. }
  116. MainWindow::getInstance()->getStore()->closeProject();
  117. renderView(NoMesh);
  118. cleanup();
  119. }
  120. void MainWindow::cleanup() {
  121. editWidget->resetAllSettings();
  122. osgWidget->clear();
  123. osgWidget->getPointRenderer()->clear();
  124. }
  125. bool MainWindow::saveChangesPopup() {
  126. QMessageBox msgBox;
  127. msgBox.setText("The current project has been modified.");
  128. msgBox.setInformativeText("Do you want to save your changes?");
  129. msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
  130. msgBox.setDefaultButton(QMessageBox::Save);
  131. int ret = msgBox.exec();
  132. switch(ret) {
  133. case QMessageBox::Save:
  134. return save();
  135. case QMessageBox::Discard:
  136. return true;
  137. case QMessageBox::Cancel:
  138. return false;
  139. default:
  140. return false;
  141. }
  142. }