summaryrefslogtreecommitdiffstats
path: root/desktop-widgets
diff options
context:
space:
mode:
authorGravatar Lubomir I. Ivanov <neolit123@gmail.com>2015-11-15 23:02:02 +0200
committerGravatar Dirk Hohndel <dirk@hohndel.org>2015-11-15 21:07:27 -0800
commitf5dbc3b44d56124dd8b1eaaaefd4e019fbd7db71 (patch)
tree2b73694710723af4a9419b8f77a2875f2e2715e1 /desktop-widgets
parent1d4075f368cd688af89211226df182052fbaf512 (diff)
downloadsubsurface-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.cpp29
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);