mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
Replace the spinner with a progress dialog for cloud storage access
Since the spinner caused all kinds of problems inside VMs, wasn't shown at all for some people on Win10 and appeared to get stuck a lot and still left people with the perception that Subsurface was hung, this patch takes a more traditional approach and gives the user a progress dialog. An additional benefit of this is that the user now can cancel a hung transfer. The slightly weird passing in of the callback allows for the separation of UI and core logic code... Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
parent
2c74a8c315
commit
2025bc1b2b
4 changed files with 82 additions and 26 deletions
|
@ -51,6 +51,16 @@
|
|||
#include <qthelper.h>
|
||||
#include <QtConcurrentRun>
|
||||
|
||||
QProgressDialog *progressDialog = NULL;
|
||||
bool progressDialogCanceled = false;
|
||||
|
||||
extern "C" int updateProgress(int percent)
|
||||
{
|
||||
if (progressDialog)
|
||||
progressDialog->setValue(percent);
|
||||
return progressDialogCanceled;
|
||||
}
|
||||
|
||||
MainWindow *MainWindow::m_Instance = NULL;
|
||||
|
||||
MainWindow::MainWindow() : QMainWindow(),
|
||||
|
@ -58,8 +68,7 @@ MainWindow::MainWindow() : QMainWindow(),
|
|||
actionPreviousDive(0),
|
||||
helpView(0),
|
||||
state(VIEWALL),
|
||||
survey(0),
|
||||
spinner(0)
|
||||
survey(0)
|
||||
{
|
||||
Q_ASSERT_X(m_Instance == NULL, "MainWindow", "MainWindow recreated!");
|
||||
m_Instance = this;
|
||||
|
@ -227,7 +236,7 @@ MainWindow::MainWindow() : QMainWindow(),
|
|||
#endif
|
||||
|
||||
ui.menubar->show();
|
||||
|
||||
set_git_update_cb(&updateProgress);
|
||||
}
|
||||
|
||||
MainWindow::~MainWindow()
|
||||
|
@ -386,7 +395,7 @@ void MainWindow::on_actionCloudstorageopen_triggered()
|
|||
|
||||
int error;
|
||||
|
||||
startSpinner();
|
||||
showProgressBar();
|
||||
QByteArray fileNamePtr = QFile::encodeName(filename);
|
||||
error = parse_file(fileNamePtr.data());
|
||||
if (!error) {
|
||||
|
@ -395,7 +404,7 @@ void MainWindow::on_actionCloudstorageopen_triggered()
|
|||
}
|
||||
getNotificationWidget()->hideNotification();
|
||||
process_dives(false, false);
|
||||
stopSpinner();
|
||||
hideProgressBar();
|
||||
refreshDisplay();
|
||||
ui.actionAutoGroup->setChecked(autogroup);
|
||||
}
|
||||
|
@ -411,14 +420,14 @@ void MainWindow::on_actionCloudstoragesave_triggered()
|
|||
if (information()->isEditing())
|
||||
information()->acceptChanges();
|
||||
|
||||
startSpinner();
|
||||
showProgressBar();
|
||||
|
||||
if (save_dives(filename.toUtf8().data())) {
|
||||
getNotificationWidget()->showNotification(get_error_string(), KMessageWidget::Error);
|
||||
return;
|
||||
}
|
||||
|
||||
stopSpinner();
|
||||
hideProgressBar();
|
||||
|
||||
getNotificationWidget()->showNotification(get_error_string(), KMessageWidget::Error);
|
||||
set_filename(filename.toUtf8().data(), true);
|
||||
|
@ -1783,23 +1792,28 @@ void MainWindow::setApplicationState(const QByteArray& state) {
|
|||
#undef SET_CURRENT_INDEX
|
||||
}
|
||||
|
||||
void MainWindow::startSpinner()
|
||||
void MainWindow::showProgressBar()
|
||||
{
|
||||
if (!spinner) {
|
||||
spinner = new QtWaitingSpinner(Qt::WindowModal, this, true);
|
||||
spinner->setRevolutionsPerSecond(1);
|
||||
spinner->setColor(WHITE1);
|
||||
spinner->setLineWidth(7);
|
||||
spinner->setRoundness(40.0);
|
||||
spinner->setMinimumTrailOpacity(0.25);
|
||||
}
|
||||
int shorterEdge = MIN(this->geometry().height(), this->geometry().width());
|
||||
spinner->setInnerRadius(shorterEdge / 12);
|
||||
spinner->setLineLength(shorterEdge / 8);
|
||||
spinner->start();
|
||||
if (progressDialog)
|
||||
delete progressDialog;
|
||||
|
||||
progressDialog = new QProgressDialog(tr("Contacting cloud service..."), tr("Cancel"), 0, 100, this);
|
||||
progressDialog->setWindowModality(Qt::WindowModal);
|
||||
progressDialog->setMinimumDuration(0);
|
||||
progressDialogCanceled = false;
|
||||
connect(progressDialog, SIGNAL(canceled()), this, SLOT(cancelCloudStorageOperation()));
|
||||
}
|
||||
|
||||
void MainWindow::stopSpinner()
|
||||
void MainWindow::cancelCloudStorageOperation()
|
||||
{
|
||||
spinner->stop();
|
||||
progressDialogCanceled = true;
|
||||
}
|
||||
|
||||
void MainWindow::hideProgressBar()
|
||||
{
|
||||
if (progressDialog) {
|
||||
progressDialog->setValue(100);
|
||||
progressDialog->deleteLater();
|
||||
progressDialog = NULL;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -11,11 +11,11 @@
|
|||
#include <QAction>
|
||||
#include <QUrl>
|
||||
#include <QUuid>
|
||||
#include <QProgressDialog>
|
||||
|
||||
#include "ui_mainwindow.h"
|
||||
#include "notificationwidget.h"
|
||||
#include "windowtitleupdate.h"
|
||||
#include "qtwaitingspinner.h"
|
||||
|
||||
struct DiveList;
|
||||
class QSortFilterProxyModel;
|
||||
|
@ -174,6 +174,7 @@ slots:
|
|||
void on_actionConfigure_Dive_Computer_triggered();
|
||||
void setDefaultState();
|
||||
void setAutomaticTitle();
|
||||
void cancelCloudStorageOperation();
|
||||
|
||||
protected:
|
||||
void closeEvent(QCloseEvent *);
|
||||
|
@ -193,8 +194,6 @@ slots:
|
|||
void planCreated();
|
||||
void setEnabledToolbar(bool arg1);
|
||||
void setPlanNotes();
|
||||
void startSpinner();
|
||||
void stopSpinner();
|
||||
|
||||
private:
|
||||
Ui::MainWindow ui;
|
||||
|
@ -208,6 +207,8 @@ private:
|
|||
bool askSaveChanges();
|
||||
bool okToClose(QString message);
|
||||
void closeCurrentFile();
|
||||
void showProgressBar();
|
||||
void hideProgressBar();
|
||||
void writeSettings();
|
||||
int file_save();
|
||||
int file_save_as();
|
||||
|
@ -249,7 +250,6 @@ private:
|
|||
QHash<QByteArray, PropertiesForQuadrant> stateProperties;
|
||||
|
||||
WindowTitleUpdate *wtu;
|
||||
QtWaitingSpinner *spinner;
|
||||
};
|
||||
|
||||
#endif // MAINWINDOW_H
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue