diff options
-rw-r--r-- | CHANGELOG.md | 1 | ||||
-rw-r--r-- | backend-shared/exportfuncs.cpp | 22 | ||||
-rw-r--r-- | backend-shared/exportfuncs.h | 8 | ||||
-rw-r--r-- | desktop-widgets/divelogexportdialog.cpp | 34 |
4 files changed, 58 insertions, 7 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 412303665..5270b9abc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +export: show progress dialog when exporting to TeX printing: use sensible font size even for strange window size --- diff --git a/backend-shared/exportfuncs.cpp b/backend-shared/exportfuncs.cpp index 24f133377..af6379001 100644 --- a/backend-shared/exportfuncs.cpp +++ b/backend-shared/exportfuncs.cpp @@ -15,8 +15,19 @@ #include "core/picture.h" #include "core/pref.h" #include "core/sample.h" +#include "core/selection.h" #include "exportfuncs.h" +// Default implementation of the export callback: do nothing / never cancel +void ExportCallback::setProgress(int) +{ +} + +bool ExportCallback::canceled() const +{ + return false; +} + #if !defined(SUBSURFACE_MOBILE) void exportProfile(QString filename, bool selected_only) { @@ -38,7 +49,7 @@ void exportProfile(QString filename, bool selected_only) } } -void export_TeX(const char *filename, bool selected_only, bool plain) +void export_TeX(const char *filename, bool selected_only, bool plain, ExportCallback &cb) { FILE *f; QDir texdir = QFileInfo(filename).dir(); @@ -91,10 +102,14 @@ void export_TeX(const char *filename, bool selected_only, bool plain) put_format(&buf, "\n%%%%%%%%%% Begin Dive Data: %%%%%%%%%%\n"); + int todo = selected_only ? amount_selected : dive_table.nr; + int done = 0; for_each_dive (i, dive) { + if (cb.canceled()) + return; if (selected_only && !dive->selected) continue; - + cb.setProgress(done++ * 1000 / todo); exportProfile(dive, texdir.filePath(QString("profile%1.png").arg(dive->number))); struct tm tm; utc_mkdate(dive->when, &tm); @@ -219,7 +234,6 @@ void export_TeX(const char *filename, bool selected_only, bool plain) dive->maxdepth.mm ? put_format(&buf, "\\def\\%sdepth{%.1f\\%sdepthunit}\n", ssrf, get_depth_units(dive->maxdepth.mm, NULL, &unit), ssrf) : put_format(&buf, "\\def\\%sdepth{}\n", ssrf); put_format(&buf, "\\%spage\n", ssrf); - } if (plain) @@ -235,7 +249,7 @@ void export_TeX(const char *filename, bool selected_only, bool plain) fclose(f); } free_buffer(&buf); - + cb.setProgress(1000); } void export_depths(const char *filename, bool selected_only) diff --git a/backend-shared/exportfuncs.h b/backend-shared/exportfuncs.h index 250e8e60f..3eb83c9b1 100644 --- a/backend-shared/exportfuncs.h +++ b/backend-shared/exportfuncs.h @@ -7,8 +7,14 @@ struct dive_site; +// A synchrounous callback interface to signal progress / check for user abort +struct ExportCallback { + virtual void setProgress(int progress); // 0-1000 + virtual bool canceled() const; +}; + void exportProfile(QString filename, bool selected_only); -void export_TeX(const char *filename, bool selected_only, bool plain); +void export_TeX(const char *filename, bool selected_only, bool plain, ExportCallback &cb); void export_depths(const char *filename, bool selected_only); std::vector<const dive_site *> getDiveSitesToExport(bool selectedOnly); QFuture<int> exportUsingStyleSheet(QString filename, bool doExport, int units, QString stylesheet, bool anonymize); diff --git a/desktop-widgets/divelogexportdialog.cpp b/desktop-widgets/divelogexportdialog.cpp index f0ee82337..7d9a6d6ca 100644 --- a/desktop-widgets/divelogexportdialog.cpp +++ b/desktop-widgets/divelogexportdialog.cpp @@ -1,5 +1,6 @@ // SPDX-License-Identifier: GPL-2.0 #include <QFileDialog> +#include <QProgressDialog> #include <QShortcut> #include <QSettings> #include <string.h> // Allows string comparisons and substitutions in TeX export @@ -14,6 +15,7 @@ #include "core/divesite.h" #include "core/errorhelper.h" #include "core/file.h" +#include "core/gettextfromc.h" #include "core/tag.h" #include "backend-shared/exportfuncs.h" #include "desktop-widgets/mainwindow.h" @@ -131,6 +133,32 @@ void DiveLogExportDialog::on_exportGroup_buttonClicked(QAbstractButton*) showExplanation(); } +// Use a QProgressDialog to show export-progress +// Default implementation of the export callback: do nothing / never cancel +struct ProgressDialogCallback : public ExportCallback { + ProgressDialogCallback(); + QProgressDialog dialog; + virtual void setProgress(int progress) override; + virtual bool canceled() const override; +}; + +ProgressDialogCallback::ProgressDialogCallback() : + dialog(gettextFromC::tr("Exporting..."), gettextFromC::tr("Cancel"), 0, 1000, MainWindow::instance()) +{ + dialog.setWindowModality(Qt::WindowModal); + dialog.setMinimumDuration(0); // Show dialog immediately +} + +void ProgressDialogCallback::setProgress(int progress) +{ + dialog.setValue(progress); +} + +bool ProgressDialogCallback::canceled() const +{ + return dialog.wasCanceled(); +} + void DiveLogExportDialog::on_buttonBox_accepted() { QString filename; @@ -188,8 +216,10 @@ void DiveLogExportDialog::on_buttonBox_accepted() export_depths(qPrintable(filename), ui->exportSelected->isChecked()); } else if (ui->exportTeX->isChecked() || ui->exportLaTeX->isChecked()) { filename = QFileDialog::getSaveFileName(this, tr("Export to TeX file"), lastDir, tr("TeX files") + " (*.tex)"); - if (!filename.isEmpty()) - export_TeX(qPrintable(filename), ui->exportSelected->isChecked(), ui->exportTeX->isChecked()); + if (!filename.isEmpty()) { + ProgressDialogCallback cb; + export_TeX(qPrintable(filename), ui->exportSelected->isChecked(), ui->exportTeX->isChecked(), cb); + } } else if (ui->exportProfile->isChecked()) { filename = QFileDialog::getSaveFileName(this, tr("Save profile image"), lastDir); if (!filename.isEmpty()) |