implemented cancel feedback in project saving

The cancel button now sends a signal to the saving thread to stop.
This commit is contained in:
itsmattkc
2020-01-12 16:34:35 +11:00
parent 00b5672639
commit fa95a61c7b
4 changed files with 30 additions and 2 deletions
+3
View File
@@ -425,6 +425,9 @@ void Core::SaveProjectInternal(Project *project)
// Connect the save manager progress signal to the progress bar update on the dialog
connect(psm, &ProjectSaveManager::ProgressChanged, lsd, &LoadSaveDialog::SetProgress, Qt::QueuedConnection);
// Connect cancel signal (must be a direct connection or it'll be queued after the save is already finished)
connect(lsd, &LoadSaveDialog::Cancelled, psm, &ProjectSaveManager::Cancel, Qt::DirectConnection);
// Connect cleanup functions (ensure everything new'd in this function is deleteLater'd)
connect(psm, &ProjectSaveManager::Finished, lsd, &LoadSaveDialog::accept, Qt::QueuedConnection);
connect(psm, &ProjectSaveManager::Finished, lsd, &LoadSaveDialog::deleteLater, Qt::QueuedConnection);
-1
View File
@@ -29,7 +29,6 @@ LoadSaveDialog::LoadSaveDialog(const QString& message, const QString& title, QWi
QPushButton* cancel_btn = new QPushButton(tr("Cancel"));
connect(cancel_btn, &QPushButton::clicked, this, &LoadSaveDialog::Cancelled);
connect(cancel_btn, &QPushButton::clicked, this, &LoadSaveDialog::reject);
cancel_layout->addWidget(cancel_btn);
cancel_layout->addStretch();
+11 -1
View File
@@ -1,7 +1,8 @@
#include "projectsavemanager.h"
ProjectSaveManager::ProjectSaveManager(Project *project) :
project_(project)
project_(project),
cancelled_(false)
{
}
@@ -11,6 +12,10 @@ void ProjectSaveManager::Start()
int prog = 0;
do {
if (cancelled_) {
break;
}
prog += 10;
emit ProgressChanged(prog);
@@ -20,3 +25,8 @@ void ProjectSaveManager::Start()
emit Finished();
}
void ProjectSaveManager::Cancel()
{
cancelled_ = true;
}
+16
View File
@@ -12,8 +12,22 @@ public:
ProjectSaveManager(Project* project);
public slots:
/**
* @brief Start the save process
*
* It's recommended to invoke this through Qt signals/slots/QueuedConnection after moving this object to a separate
* thread.
*/
void Start();
/**
* @brief Cancel the current save
*
* Always connect to this with a DirectConnection. Otherwise, it'll be queued AFTER the save function is already
* complete.
*/
void Cancel();
signals:
void ProgressChanged(int);
@@ -22,6 +36,8 @@ signals:
private:
Project* project_;
QAtomicInt cancelled_;
};
#endif // PROJECTSAVEMANAGER_H