diff options
author | Lubomir I. Ivanov <neolit123@gmail.com> | 2015-11-15 23:02:02 +0200 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2015-11-15 21:07:27 -0800 |
commit | f5dbc3b44d56124dd8b1eaaaefd4e019fbd7db71 (patch) | |
tree | 2b73694710723af4a9419b8f77a2875f2e2715e1 /desktop-widgets | |
parent | 1d4075f368cd688af89211226df182052fbaf512 (diff) | |
download | subsurface-f5dbc3b44d56124dd8b1eaaaefd4e019fbd7db71.tar.gz |
Planner: support profile in planner print
The "Print" button in the planner dumps the QTextEdit to
a QPrinter via ::print(). This patch renders the Profile
to a Pixmap which is inserted as Base64 stream in an <img>
tag and fed on top of the QTextEdit HTML contents.
This route preserves the planner notes as text in PDF prints.
The quick alternative is to render the QTextDocument to
a QPixmap as well, but that will not preserve the text
and pagination becomes manual.
Possibly the QTextDocument can be rendered as a QPicture
but pagination is still an issue, while so far there is exactly
one user requesting this feature!
Related small change in ProfileWidget2:
Explicitly hide the tooltip when printMode is true.
Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'desktop-widgets')
-rw-r--r-- | desktop-widgets/mainwindow.cpp | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/desktop-widgets/mainwindow.cpp b/desktop-widgets/mainwindow.cpp index 5e80a345b..356196dad 100644 --- a/desktop-widgets/mainwindow.cpp +++ b/desktop-widgets/mainwindow.cpp @@ -28,6 +28,7 @@ #include "diveplanner.h" #ifndef NO_PRINTING #include <QPrintDialog> +#include <QBuffer> #include "printdialog.h" #endif #include "tankinfomodel.h" @@ -768,6 +769,34 @@ void MainWindow::printPlan() if (dialog->exec() != QDialog::Accepted) return; + /* render the profile as a pixmap that is inserted as base64 data into a HTML <img> tag + * make it fit a page width defined by 2 cm margins via QTextDocument->print() (cannot be changed?) + * the height of the profile is 40% of the page height. + */ + QSizeF renderSize = printer.pageRect(QPrinter::Inch).size(); + const qreal marginsInch = 1.57480315; // = (2 x 2cm) / 2.45cm/inch + renderSize.setWidth((renderSize.width() - marginsInch) * printer.resolution()); + renderSize.setHeight(((renderSize.height() - marginsInch) * printer.resolution()) / 2.5); + + QPixmap pixmap(renderSize.toSize()); + QPainter painter(&pixmap); + painter.setRenderHint(QPainter::Antialiasing); + painter.setRenderHint(QPainter::SmoothPixmapTransform); + + ProfileWidget2 *profile = graphics(); + QSize origSize = profile->size(); + profile->resize(renderSize.toSize()); + profile->setPrintMode(true); + profile->render(&painter); + profile->resize(origSize); + profile->setPrintMode(false); + + QByteArray byteArray; + QBuffer buffer(&byteArray); + pixmap.save(&buffer, "PNG"); + QString profileImage = QString("<img src=\"data:image/png;base64,") + byteArray.toBase64() + "\"/><br><br>"; + withDisclaimer = profileImage + withDisclaimer; + plannerDetails()->divePlanOutput()->setHtml(withDisclaimer); plannerDetails()->divePlanOutput()->print(&printer); plannerDetails()->divePlanOutput()->setHtml(diveplan); |