mirror of
https://github.com/subsurface/subsurface.git
synced 2025-01-31 18:43:24 +00:00
Printing: don't break dives into successive pages
While rendering a template with "0" dives per page value, try to fit as many dives per page but don't break a dive into 2 pages. Use a dynamically sized view port to fit the rendered area only, and don't render the full page. All the Template elements that shouldn't be broken should have the CSS class "dontbreak". Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com> Signed-off-by: Gehad elrobey <gehadelrobey@gmail.com>
This commit is contained in:
parent
31df69c401
commit
6a9c4cb9d7
2 changed files with 43 additions and 2 deletions
44
printer.cpp
44
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()
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Add table
Reference in a new issue