From: "Lubomir I. Ivanov" <[email protected]> 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 <[email protected]> --- these hardcoded margins in QTextEdit are non-tweakable, TMK. if someone tests - let me know if this is broken for you paper size X. --- desktop-widgets/mainwindow.cpp | 29 +++++++++++++++++++++++++++++ profile-widget/profilewidget2.cpp | 1 + 2 files changed, 30 insertions(+) diff --git a/desktop-widgets/mainwindow.cpp b/desktop-widgets/mainwindow.cpp index 5e80a34..356196d 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); diff --git a/profile-widget/profilewidget2.cpp b/profile-widget/profilewidget2.cpp index eae4b3f..b44bdfc 100644 --- a/profile-widget/profilewidget2.cpp +++ b/profile-widget/profilewidget2.cpp @@ -1527,6 +1527,7 @@ void ProfileWidget2::setPrintMode(bool mode, bool grayscale) isGrayscale = mode ? grayscale : false; mouseFollowerHorizontal->setVisible(!mode); mouseFollowerVertical->setVisible(!mode); + toolTipItem->setVisible(!mode); } void ProfileWidget2::setFontPrintScale(double scale) -- 1.7.11.msysgit.0 _______________________________________________ subsurface mailing list [email protected] http://lists.subsurface-divelog.org/cgi-bin/mailman/listinfo/subsurface
