diff options
-rw-r--r-- | printer.cpp | 67 | ||||
-rw-r--r-- | printer.h | 5 | ||||
-rw-r--r-- | printing_templates/base.html | 3 |
3 files changed, 70 insertions, 5 deletions
diff --git a/printer.cpp b/printer.cpp index e2b88c07e..6d4e4898b 100644 --- a/printer.cpp +++ b/printer.cpp @@ -3,6 +3,8 @@ #include <QtWebKitWidgets> #include <QPainter> +#include <QWebElementCollection> +#include <QWebElement> #define A4_300DPI_WIDTH 2480 #define A4_300DPI_HIGHT 3508 @@ -20,26 +22,85 @@ Printer::Printer(QPrinter *printer) done = 0; } +void Printer::putProfileImage(QRect profilePlaceholder, QRect viewPort, QPainter *painter, struct dive *dive, QPointer<ProfileWidget2> profile) +{ + int x = profilePlaceholder.x() - viewPort.x(); + int y = profilePlaceholder.y() - viewPort.y(); + // use the placeHolder and the viewPort position to calculate the relative position of the dive profile. + QRect pos(x, y, profilePlaceholder.width(), profilePlaceholder.height()); + profile->plotDive(dive, true); + profile->render(painter, pos); +} + void Printer::render() { + QPointer<ProfileWidget2> profile = MainWindow::instance()->graphics(); + + // keep original preferences + int profileFrameStyle = profile->frameStyle(); + int animationOriginal = prefs.animation_speed; + double fontScale = profile->getFontPrintScale(); + + // apply printing settings to profile + profile->setFrameStyle(QFrame::NoFrame); + profile->setPrintMode(true); + profile->setFontPrintScale(0.6); + profile->setToolTipVisibile(false); + prefs.animation_speed = 0; + + // render the Qwebview QPainter painter; QSize size(A4_300DPI_WIDTH, A4_300DPI_HIGHT); + QRect viewPort(0, 0, size.width(), size.height()); painter.begin(printer); painter.setRenderHint(QPainter::Antialiasing); painter.setRenderHint(QPainter::SmoothPixmapTransform); webView->page()->setViewportSize(size); - int Pages = ceil(getTotalWork() / 2.0); + + // get all refereces to diveprofile class in the Html template + QWebElementCollection collection = webView->page()->mainFrame()->findAllElements(".diveprofile"); + + QSize originalSize = profile->size(); + if (collection.count() > 0) { + profile->resize(collection.at(0).geometry().size()); + } + + int elemNo = 0; for (int i = 0; i < Pages; i++) { + // render the base Html template webView->page()->mainFrame()->render(&painter, QWebFrame::ContentsLayer); - webView->page()->mainFrame()->scroll(0, A4_300DPI_HIGHT); - //rendering progress is 4/5 of total work + + // render all the dive profiles in the current page + while (elemNo < collection.count() && collection.at(elemNo).geometry().y() < viewPort.y() + viewPort.height()) { + // dive id field should be dive_{{dive_no}} se we remove the first 5 characters + int diveNo = collection.at(elemNo).attribute("id").remove(0, 5).toInt(0, 10); + putProfileImage(collection.at(elemNo).geometry(), viewPort, &painter, get_dive(diveNo - 1), profile); + elemNo++; + } + + // scroll the webview to the next page + webView->page()->mainFrame()->scroll(0, size.height()); + viewPort.adjust(0, size.height(), 0, size.height()); + + // rendering progress is 4/5 of total work emit(progessUpdated((i * 80.0 / Pages) + done)); if (i < Pages - 1) printer->newPage(); } painter.end(); + + // return profle settings + profile->setFrameStyle(profileFrameStyle); + profile->setPrintMode(false); + profile->setFontPrintScale(fontScale); + profile->setToolTipVisibile(true); + profile->resize(originalSize); + prefs.animation_speed = animationOriginal; + + //replot the dive after returning the settings + profile->plotDive(0, true); } //value: ranges from 0 : 100 and shows the progress of the templating engine @@ -3,6 +3,10 @@ #include <QPrinter> #include <QWebView> +#include <QRect> +#include <QPainter> + +#include "profile/profilewidget2.h" class Printer : public QObject { Q_OBJECT @@ -11,6 +15,7 @@ private: QPrinter *printer; QWebView *webView; void render(); + void putProfileImage(QRect box, QRect viewPort, QPainter *painter, struct dive *dive, QPointer<ProfileWidget2> profile); int done; private slots: diff --git a/printing_templates/base.html b/printing_templates/base.html index c32bc12db..574579f90 100644 --- a/printing_templates/base.html +++ b/printing_templates/base.html @@ -180,8 +180,7 @@ </td> </tr> </tbody></table> - <div class="diveProfile"> - <h1> Dive profile area </h1> + <div class="diveProfile" id="dive_{{ dive.number }}"> </div> </div> <div class="notesPart"> |