aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--printer.cpp67
-rw-r--r--printer.h5
-rw-r--r--printing_templates/base.html3
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
diff --git a/printer.h b/printer.h
index 1974d46c1..75c256d91 100644
--- a/printer.h
+++ b/printer.h
@@ -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">