From ebdb7a2db102e384f1b92c5f7601bc3aab2b4c93 Mon Sep 17 00:00:00 2001
From: Matthias <github@mpuchner.de>
Date: Fri, 4 Dec 2020 17:41:20 +0100
Subject: [PATCH] fix "crash on save project"

The crash fix is to always create a new project (done in method ProjectManager::newProject())

Furthermore NewProjectDialog distinguishes now between "create" and "save", since  otherwise it would look ugly on the UI. Imagine these steps:

Open BA, edit something, click "create new project". Now first a dialog for saving is shown, then a dialog for creating. Without the done changes, two dialogs with title "Create project" would show up.
---
 GUI/coregui/mainwindow/newprojectdialog.cpp |  8 ++++----
 GUI/coregui/mainwindow/newprojectdialog.h   |  4 +++-
 GUI/coregui/mainwindow/projectmanager.cpp   | 19 ++++++++++---------
 GUI/coregui/mainwindow/projectmanager.h     |  2 +-
 4 files changed, 18 insertions(+), 15 deletions(-)

diff --git a/GUI/coregui/mainwindow/newprojectdialog.cpp b/GUI/coregui/mainwindow/newprojectdialog.cpp
index 47012f7a217..5c99f5ecf89 100644
--- a/GUI/coregui/mainwindow/newprojectdialog.cpp
+++ b/GUI/coregui/mainwindow/newprojectdialog.cpp
@@ -20,7 +20,7 @@
 #include <QPushButton>
 #include <QVBoxLayout>
 
-NewProjectDialog::NewProjectDialog(QWidget* parent, const QString& workingDirectory,
+NewProjectDialog::NewProjectDialog(QWidget* parent, Mode mode, const QString& workingDirectory,
                                    const QString& projectName)
     : QDialog(parent)
     , m_projectNameEdit(0)
@@ -34,7 +34,7 @@ NewProjectDialog::NewProjectDialog(QWidget* parent, const QString& workingDirect
 
 {
     setMinimumSize(480, 280);
-    setWindowTitle("New project");
+    setWindowTitle(mode == CREATE ? "New project" : "Save project");
 
     QLabel* nameLabel = new QLabel("Project name:");
     m_projectNameEdit = new QLineEdit;
@@ -43,7 +43,7 @@ NewProjectDialog::NewProjectDialog(QWidget* parent, const QString& workingDirect
             SLOT(checkIfProjectNameIsValid(QString)));
     nameLabel->setBuddy(m_projectNameEdit);
 
-    QLabel* parentDirLabel = new QLabel("Create in:");
+    QLabel* parentDirLabel = new QLabel(mode == CREATE ? "Create in:" : "Save in:");
     m_workDirEdit = new QLineEdit;
     m_workDirEdit->setText(QDir::homePath());
     connect(m_workDirEdit, SIGNAL(textEdited(QString)), this,
@@ -55,7 +55,7 @@ NewProjectDialog::NewProjectDialog(QWidget* parent, const QString& workingDirect
 
     m_warningLabel = new QLabel();
 
-    m_createButton = new QPushButton("Create");
+    m_createButton = new QPushButton(mode == CREATE ? "Create" : "Save");
     connect(m_createButton, SIGNAL(clicked()), this, SLOT(createProjectDir()));
     m_createButton->setDefault(true);
     m_cancelButton = new QPushButton("Cancel");
diff --git a/GUI/coregui/mainwindow/newprojectdialog.h b/GUI/coregui/mainwindow/newprojectdialog.h
index 9faa2723941..e5d1f661a92 100644
--- a/GUI/coregui/mainwindow/newprojectdialog.h
+++ b/GUI/coregui/mainwindow/newprojectdialog.h
@@ -24,7 +24,9 @@ class QLabel;
 class NewProjectDialog : public QDialog {
     Q_OBJECT
 public:
-    NewProjectDialog(QWidget* parent = 0, const QString& workingDirectory = "",
+    enum Mode { CREATE, SAVE };
+
+    NewProjectDialog(QWidget* parent, Mode mode, const QString& workingDirectory = "",
                      const QString& projectName = "");
 
     QString getWorkingDirectory() const;
diff --git a/GUI/coregui/mainwindow/projectmanager.cpp b/GUI/coregui/mainwindow/projectmanager.cpp
index 803767a699b..8a6f726a53b 100644
--- a/GUI/coregui/mainwindow/projectmanager.cpp
+++ b/GUI/coregui/mainwindow/projectmanager.cpp
@@ -175,12 +175,11 @@ void ProjectManager::newProject() {
     if (!closeCurrentProject())
         return;
 
-    QString projectFileName = acquireProjectFileName();
+    createNewProject();
 
-    if (!projectFileName.isEmpty()) {
-        createNewProject();
+    QString projectFileName = acquireProjectFileName(false);
+    if (!projectFileName.isEmpty())
         saveProject(projectFileName);
-    }
 }
 
 //! Processes close current project request. Call save/discard/cancel dialog, if necessary.
@@ -228,7 +227,7 @@ bool ProjectManager::saveProject(QString projectFileName) {
         if (m_project_document->hasValidNameAndPath())
             projectFileName = m_project_document->projectFileName();
         else
-            projectFileName = acquireProjectFileName();
+            projectFileName = acquireProjectFileName(true);
     }
 
     if (projectFileName.isEmpty())
@@ -255,7 +254,7 @@ bool ProjectManager::saveProject(QString projectFileName) {
 //! Processes 'save project as' request.
 
 bool ProjectManager::saveProjectAs() {
-    QString projectFileName = acquireProjectFileName();
+    QString projectFileName = acquireProjectFileName(true);
 
     if (projectFileName.isEmpty())
         return false;
@@ -334,10 +333,12 @@ void ProjectManager::loadProject(const QString& projectFileName) {
     QApplication::restoreOverrideCursor();
 }
 
-//! Returns project file name from dialog.
+//! Returns project file name from dialog. Returns empty string if dialog was canceled.
 
-QString ProjectManager::acquireProjectFileName() {
-    NewProjectDialog dialog(m_mainWindow, workingDirectory(), untitledProjectName());
+QString ProjectManager::acquireProjectFileName(bool forSaveAs) {
+    NewProjectDialog dialog(m_mainWindow,
+                            forSaveAs ? NewProjectDialog::SAVE : NewProjectDialog::CREATE,
+                            workingDirectory(), untitledProjectName());
 
     if (dialog.exec() != QDialog::Accepted)
         return "";
diff --git a/GUI/coregui/mainwindow/projectmanager.h b/GUI/coregui/mainwindow/projectmanager.h
index ed9b397aaa4..dfefcd3786a 100644
--- a/GUI/coregui/mainwindow/projectmanager.h
+++ b/GUI/coregui/mainwindow/projectmanager.h
@@ -61,7 +61,7 @@ private:
     void createNewProject();
     void deleteCurrentProject();
     void loadProject(const QString& projectFileName);
-    QString acquireProjectFileName();
+    QString acquireProjectFileName(bool forSaveAs);
     void addToRecentProjects();
 
     QString workingDirectory();
-- 
GitLab