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