export: use independent profile instance for rendering

Just as for printing, use an independent profile widget, so
that the UI widget doesn't have to be set/reset.

Also, make the size of the exported image independent from
the current window size.

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
Berthold Stoeger 2021-04-07 14:02:55 +02:00 committed by Dirk Hohndel
parent 60b82de058
commit 1a9300fed0

View file

@ -20,6 +20,7 @@
#include <QDir> #include <QDir>
#include <QFileInfo> #include <QFileInfo>
#include <QtConcurrent> #include <QtConcurrent>
#include <memory>
// Default implementation of the export callback: do nothing / never cancel // Default implementation of the export callback: do nothing / never cancel
void ExportCallback::setProgress(int) void ExportCallback::setProgress(int)
@ -37,31 +38,29 @@ bool ExportCallback::canceled() const
static void exportProfile(ProfileWidget2 *profile, const struct dive *dive, const QString &filename) static void exportProfile(ProfileWidget2 *profile, const struct dive *dive, const QString &filename)
{ {
profile->setProfileState(dive, 0);
profile->plotDive(dive, 0, false, true); profile->plotDive(dive, 0, false, true);
QImage image = QImage(profile->size() * 4, QImage::Format_RGB32); QImage image = QImage(profile->size(), QImage::Format_RGB32);
QPainter paint; QPainter paint;
paint.begin(&image); paint.begin(&image);
profile->render(&paint); profile->render(&paint);
image.save(filename); image.save(filename);
} }
static ProfileWidget2 *getPrintProfile() static std::unique_ptr<ProfileWidget2> getPrintProfile()
{ {
ProfileWidget2 *profile = MainWindow::instance()->graphics; // Let's say that 800x600 is a "reasonable" profile size. Use four times that for printing.
profile->setToolTipVisibile(false); const int scale = 4;
profile->setPrintMode(true); QSize size(800 * scale, 600 * scale);
double scale = profile->getFontPrintScale();
profile->setFontPrintScale(4 * scale);
return profile;
}
static void resetProfile() // TODO: Annoyingly, this still needs a parent window? Otherwise,
{ // the profile is shown as its own window, when calling show() below.
ProfileWidget2 *profile = MainWindow::instance()->graphics; auto profile = std::make_unique<ProfileWidget2>(nullptr, MainWindow::instance());
profile->setToolTipVisibile(true); profile->resize(size);
profile->setFontPrintScale(1.0); profile->show(); // Ominous: if the scene isn't shown, parts of the plot are missing. Needs investigation.
profile->setPrintMode(false); profile->setPrintMode(true);
profile->plotDive(current_dive, 0, true); profile->setFontPrintScale((double)scale);
return profile;
} }
void exportProfile(QString filename, bool selected_only, ExportCallback &cb) void exportProfile(QString filename, bool selected_only, ExportCallback &cb)
@ -75,7 +74,7 @@ void exportProfile(QString filename, bool selected_only, ExportCallback &cb)
int todo = selected_only ? amount_selected : dive_table.nr; int todo = selected_only ? amount_selected : dive_table.nr;
int done = 0; int done = 0;
ProfileWidget2 *profile = getPrintProfile(); auto profile = getPrintProfile();
for_each_dive (i, dive) { for_each_dive (i, dive) {
if (cb.canceled()) if (cb.canceled())
return; return;
@ -84,10 +83,9 @@ void exportProfile(QString filename, bool selected_only, ExportCallback &cb)
cb.setProgress(done++ * 1000 / todo); cb.setProgress(done++ * 1000 / todo);
QString fn = count ? fi.path() + QDir::separator() + fi.completeBaseName().append(QString("-%1.").arg(count)) + fi.suffix() QString fn = count ? fi.path() + QDir::separator() + fi.completeBaseName().append(QString("-%1.").arg(count)) + fi.suffix()
: filename; : filename;
exportProfile(profile, dive, fn); exportProfile(profile.get(), dive, fn);
++count; ++count;
} }
resetProfile();
} }
void export_TeX(const char *filename, bool selected_only, bool plain, ExportCallback &cb) void export_TeX(const char *filename, bool selected_only, bool plain, ExportCallback &cb)
@ -145,14 +143,14 @@ void export_TeX(const char *filename, bool selected_only, bool plain, ExportCall
int todo = selected_only ? amount_selected : dive_table.nr; int todo = selected_only ? amount_selected : dive_table.nr;
int done = 0; int done = 0;
ProfileWidget2 *profile = getPrintProfile(); auto profile = getPrintProfile();
for_each_dive (i, dive) { for_each_dive (i, dive) {
if (cb.canceled()) if (cb.canceled())
return; return;
if (selected_only && !dive->selected) if (selected_only && !dive->selected)
continue; continue;
cb.setProgress(done++ * 1000 / todo); cb.setProgress(done++ * 1000 / todo);
exportProfile(profile, dive, texdir.filePath(QString("profile%1.png").arg(dive->number))); exportProfile(profile.get(), dive, texdir.filePath(QString("profile%1.png").arg(dive->number)));
struct tm tm; struct tm tm;
utc_mkdate(dive->when, &tm); utc_mkdate(dive->when, &tm);
@ -273,7 +271,6 @@ void export_TeX(const char *filename, bool selected_only, bool plain, ExportCall
put_format(&buf, "\\%spage\n", ssrf); put_format(&buf, "\\%spage\n", ssrf);
} }
resetProfile();
if (plain) if (plain)
put_format(&buf, "\\bye\n"); put_format(&buf, "\\bye\n");