summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--printer.cpp44
-rw-r--r--printer.h1
2 files changed, 43 insertions, 2 deletions
diff --git a/printer.cpp b/printer.cpp
index 115b17526..5d7adcacc 100644
--- a/printer.cpp
+++ b/printer.cpp
@@ -57,6 +57,46 @@ void Printer::putProfileImage(QRect profilePlaceholder, QRect viewPort, QPainter
}
}
+void Printer::flowRender()
+{
+ // render the Qwebview
+ QPainter painter;
+ QRect viewPort(0, 0, 0, 0);
+ painter.begin(paintDevice);
+ painter.setRenderHint(QPainter::Antialiasing);
+ painter.setRenderHint(QPainter::SmoothPixmapTransform);
+
+ // get all references to dontbreak divs
+ int start = 0, end = 0;
+ int fullPageResolution = webView->page()->mainFrame()->contentsSize().height();
+ QWebElementCollection dontbreak = webView->page()->mainFrame()->findAllElements(".dontbreak");
+ foreach (QWebElement dontbreakElement, dontbreak) {
+ if ((dontbreakElement.geometry().y() + dontbreakElement.geometry().height()) - start < pageSize.height()) {
+ // One more element can be placed
+ end = dontbreakElement.geometry().y() + dontbreakElement.geometry().height();
+ } else {
+ QRegion reigon(0, 0, pageSize.width(), end - start);
+ viewPort.setRect(0, start, pageSize.width(), end - start);
+
+ // render the base Html template
+ webView->page()->mainFrame()->render(&painter, QWebFrame::ContentsLayer, reigon);
+
+ // scroll the webview to the next page
+ webView->page()->mainFrame()->scroll(0, dontbreakElement.geometry().y() - start);
+
+ // rendering progress is 4/5 of total work
+ emit(progessUpdated((end * 80.0 / fullPageResolution) + done));
+ static_cast<QPrinter*>(paintDevice)->newPage();
+ start = dontbreakElement.geometry().y();
+ }
+ }
+ // render the remianing page
+ QRegion reigon(0, 0, pageSize.width(), end - start);
+ webView->page()->mainFrame()->render(&painter, QWebFrame::ContentsLayer, reigon);
+
+ painter.end();
+}
+
void Printer::render(int Pages = 0)
{
// keep original preferences
@@ -175,11 +215,11 @@ void Printer::print()
int paddingBottom = pageSize.height() - (webView->page()->mainFrame()->contentsSize().height() % pageSize.height());
QString styleString = QString::fromUtf8("padding-bottom: ") + QString::number(paddingBottom) + "px;";
webView->page()->mainFrame()->findFirstElement("body").setAttribute("style", styleString);
- Pages = ceil(webView->page()->mainFrame()->contentsSize().height() / (float)pageSize.height());
+ flowRender();
} else {
Pages = ceil(getTotalWork(printOptions) / (float)divesPerPage);
+ render(Pages);
}
- render(Pages);
}
void Printer::print_statistics()
diff --git a/printer.h b/printer.h
index c0775fa4b..5c7652a8d 100644
--- a/printer.h
+++ b/printer.h
@@ -29,6 +29,7 @@ private:
int done;
int dpi;
void render(int Pages);
+ void flowRender();
void putProfileImage(QRect box, QRect viewPort, QPainter *painter, struct dive *dive, QPointer<ProfileWidget2> profile);
private slots: