mirror of
https://github.com/subsurface/subsurface.git
synced 2025-01-31 21:03:23 +00:00
Merge branch 'custom-print' of github.com:neolit123/subsurface
This commit is contained in:
commit
2455a5dec7
16 changed files with 720 additions and 201 deletions
124
printer.cpp
124
printer.cpp
|
@ -1,6 +1,9 @@
|
|||
#include "printer.h"
|
||||
#include "templatelayout.h"
|
||||
#include "statistics.h"
|
||||
#include "helpers.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <QtWebKitWidgets>
|
||||
#include <QPainter>
|
||||
#include <QWebElementCollection>
|
||||
|
@ -54,6 +57,53 @@ 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 {
|
||||
// fill the page with background color
|
||||
QRect fullPage(0, 0, pageSize.width(), pageSize.height());
|
||||
QBrush fillBrush(templateOptions->color_palette.color1);
|
||||
painter.fillRect(fullPage, fillBrush);
|
||||
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
|
||||
QRect fullPage(0, 0, pageSize.width(), pageSize.height());
|
||||
QBrush fillBrush(templateOptions->color_palette.color1);
|
||||
painter.fillRect(fullPage, fillBrush);
|
||||
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
|
||||
|
@ -144,9 +194,17 @@ void Printer::print()
|
|||
connect(&t, SIGNAL(progressUpdated(int)), this, SLOT(templateProgessUpdated(int)));
|
||||
dpi = printerPtr->resolution();
|
||||
//rendering resolution = selected paper size in inchs * printer dpi
|
||||
pageSize.setHeight(printerPtr->pageLayout().paintRect(QPageLayout::Inch).height() * dpi);
|
||||
pageSize.setWidth(printerPtr->pageLayout().paintRect(QPageLayout::Inch).width() * dpi);
|
||||
#if QT_VERSION >= 0x050300
|
||||
pageSize.setHeight(printerPtr->pageLayout().paintRectPixels(dpi).height());
|
||||
pageSize.setWidth(printerPtr->pageLayout().paintRectPixels(dpi).width());
|
||||
#else
|
||||
pageSize.setHeight(printerPtr->pageRect(QPrinter::Inch).height() * dpi);
|
||||
pageSize.setWidth(printerPtr->pageRect(QPrinter::Inch).width() * dpi);
|
||||
#endif
|
||||
webView->page()->setViewportSize(pageSize);
|
||||
webView->page()->mainFrame()->setScrollBarPolicy(Qt::Vertical, Qt::ScrollBarAlwaysOff);
|
||||
// export border width with at least 1 pixel
|
||||
templateOptions->border_width = std::max(1, pageSize.width() / 1000);
|
||||
webView->setHtml(t.generate());
|
||||
if (printOptions->color_selected && printerPtr->colorMode()) {
|
||||
printerPtr->setColorMode(QPrinter::Color);
|
||||
|
@ -165,11 +223,69 @@ void Printer::print()
|
|||
}
|
||||
int Pages;
|
||||
if (divesPerPage == 0) {
|
||||
Pages = ceil(webView->page()->mainFrame()->contentsSize().height() / (float)pageSize.height());
|
||||
// add extra padding at the bottom to pages with height not divisible by view port
|
||||
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);
|
||||
flowRender();
|
||||
} else {
|
||||
Pages = ceil(getTotalWork(printOptions) / (float)divesPerPage);
|
||||
render(Pages);
|
||||
}
|
||||
render(Pages);
|
||||
}
|
||||
|
||||
void Printer::print_statistics()
|
||||
{
|
||||
QPrinter *printerPtr;
|
||||
printerPtr = static_cast<QPrinter*>(paintDevice);
|
||||
stats_t total_stats;
|
||||
|
||||
total_stats.selection_size = 0;
|
||||
total_stats.total_time.seconds = 0;
|
||||
|
||||
QString html;
|
||||
html += "<table border=1>";
|
||||
html += "<tr>";
|
||||
html += "<td>Year</td>";
|
||||
html += "<td>Dives</td>";
|
||||
html += "<td>Total Time</td>";
|
||||
html += "<td>Avg Time</td>";
|
||||
html += "<td>Shortest Time</td>";
|
||||
html += "<td>Longest Time</td>";
|
||||
html += "<td>Avg Depth</td>";
|
||||
html += "<td>Min Depth</td>";
|
||||
html += "<td>Max Depth</td>";
|
||||
html += "<td>Avg SAC</td>";
|
||||
html += "<td>Min SAC</td>";
|
||||
html += "<td>Max SAC</td>";
|
||||
html += "<td>Min Temp</td>";
|
||||
html += "<td>Max Temp</td>";
|
||||
html += "</tr>";
|
||||
int i = 0;
|
||||
while (stats_yearly != NULL && stats_yearly[i].period) {
|
||||
html += "<tr>";
|
||||
html += "<td>" + QString::number(stats_yearly[i].period) + "</td>";
|
||||
html += "<td>" + QString::number(stats_yearly[i].selection_size) + "</td>";
|
||||
html += "<td>" + QString::fromUtf8(get_time_string(stats_yearly[i].total_time.seconds, 0)) + "</td>";
|
||||
html += "<td>" + QString::fromUtf8(get_minutes(stats_yearly[i].total_time.seconds / stats_yearly[i].selection_size)) + "</td>";
|
||||
html += "<td>" + QString::fromUtf8(get_minutes(stats_yearly[i].shortest_time.seconds)) + "</td>";
|
||||
html += "<td>" + QString::fromUtf8(get_minutes(stats_yearly[i].longest_time.seconds)) + "</td>";
|
||||
html += "<td>" + get_depth_string(stats_yearly[i].avg_depth) + "</td>";
|
||||
html += "<td>" + get_depth_string(stats_yearly[i].min_depth) + "</td>";
|
||||
html += "<td>" + get_depth_string(stats_yearly[i].max_depth) + "</td>";
|
||||
html += "<td>" + get_volume_string(stats_yearly[i].avg_sac) + "</td>";
|
||||
html += "<td>" + get_volume_string(stats_yearly[i].min_sac) + "</td>";
|
||||
html += "<td>" + get_volume_string(stats_yearly[i].max_sac) + "</td>";
|
||||
html += "<td>" + QString::number(stats_yearly[i].min_temp == 0 ? 0 : get_temp_units(stats_yearly[i].min_temp, NULL)) + "</td>";
|
||||
html += "<td>" + QString::number(stats_yearly[i].max_temp == 0 ? 0 : get_temp_units(stats_yearly[i].max_temp, NULL)) + "</td>";
|
||||
html += "</tr>";
|
||||
total_stats.selection_size += stats_yearly[i].selection_size;
|
||||
total_stats.total_time.seconds += stats_yearly[i].total_time.seconds;
|
||||
i++;
|
||||
}
|
||||
html += "</table>";
|
||||
webView->setHtml(html);
|
||||
webView->print(printerPtr);
|
||||
}
|
||||
|
||||
void Printer::previewOnePage()
|
||||
|
|
|
@ -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:
|
||||
|
@ -38,6 +39,7 @@ public:
|
|||
Printer(QPaintDevice *paintDevice, print_options *printOptions, template_options *templateOptions, PrintMode printMode);
|
||||
~Printer();
|
||||
void print();
|
||||
void print_statistics();
|
||||
void previewOnePage();
|
||||
|
||||
signals:
|
||||
|
|
|
@ -15,11 +15,17 @@
|
|||
font-size: {{ template_options.font_size }}vw;
|
||||
}
|
||||
|
||||
p {
|
||||
float: left;
|
||||
font-size: {{ template_options.font_size }}vw;
|
||||
}
|
||||
|
||||
table {
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
border:max(1px, 0.1vw);
|
||||
border-width: {{ template_options.borderwidth }}px;
|
||||
border-style:solid;
|
||||
border-color: {{ template_options.color6 }};
|
||||
}
|
||||
|
||||
td {
|
||||
|
@ -32,57 +38,59 @@
|
|||
}
|
||||
|
||||
.mainContainer {
|
||||
width: 96%;
|
||||
margin-left: 2%;
|
||||
margin-right: 2%;
|
||||
width: 100%;
|
||||
margin-left: 0%;
|
||||
margin-right: 0%;
|
||||
margin-top: 0%;
|
||||
margin-bottom: 0%;
|
||||
margin-bottom: 2%;
|
||||
overflow: hidden;
|
||||
border-width: 0;
|
||||
page-break-inside: avoid;
|
||||
}
|
||||
|
||||
.innerContainer {
|
||||
width: 98%;
|
||||
padding: 1%;
|
||||
width: 100%;
|
||||
padding: 0%;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.diveDetails {
|
||||
width: 98%;
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
border:max(1px, 0.1vw);
|
||||
border-style:solid;
|
||||
width: 100%;
|
||||
float: left;
|
||||
}
|
||||
|
||||
.dataSection {
|
||||
width: 98%;
|
||||
margin: 1%;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.fieldTitle {
|
||||
background-color: {{ template_options.color2 }};
|
||||
overflow: hidden;
|
||||
color: {{ template_options.color4 }};
|
||||
}
|
||||
|
||||
.fieldData {
|
||||
color: {{ template_options.color5 }};
|
||||
background-color: {{ template_options.color3 }};
|
||||
}
|
||||
|
||||
.table_class {
|
||||
float: left;
|
||||
margin: 1%;
|
||||
width: 48%;
|
||||
width: 49.25%;
|
||||
margin: 0.5%;
|
||||
}
|
||||
|
||||
.notes_table_class {
|
||||
overflow: hidden;
|
||||
width: 98%;
|
||||
margin: 1%;
|
||||
width: 99%;
|
||||
margin: 0.5%;
|
||||
}
|
||||
|
||||
.textArea {
|
||||
line-height: {{ template_options.line_spacing }};
|
||||
max-height: 19vh;
|
||||
overflow: hidden;
|
||||
color: {{ template_options.color4 }};
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
@ -90,7 +98,7 @@
|
|||
<div id="body_div">
|
||||
{% block main_rows %}
|
||||
{% for dive in dives %}
|
||||
<div class="mainContainer">
|
||||
<div class="mainContainer dontbreak">
|
||||
<div class="innerContainer">
|
||||
<div class="diveDetails">
|
||||
<div class="dataSection">
|
||||
|
@ -99,39 +107,40 @@
|
|||
<td class="fieldTitle">
|
||||
<h1> Dive No. </h1>
|
||||
</td>
|
||||
<td>
|
||||
<h1> {{ dive.number }} </h1>
|
||||
<td class="fieldData">
|
||||
<p> {{ dive.number }} </p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="fieldTitle">
|
||||
<h1> Date </h1>
|
||||
</td>
|
||||
<td><h1> {{ dive.date }} </h1>
|
||||
<td class="fieldData">
|
||||
<p> {{ dive.date }} </p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="fieldTitle">
|
||||
<h1> Location </h1>
|
||||
</td>
|
||||
<td>
|
||||
<h1> {{ dive.location }} </h1>
|
||||
<td class="fieldData">
|
||||
<p> {{ dive.location }} </p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="fieldTitle">
|
||||
<h1> Max depth </h1>
|
||||
</td>
|
||||
<td>
|
||||
<h1> {{ dive.depth }} </h1>
|
||||
<td class="fieldData">
|
||||
<p> {{ dive.depth }} </p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="fieldTitle">
|
||||
<h1> Duration </h1>
|
||||
</td>
|
||||
<td>
|
||||
<h1> {{ dive.duration }} </h1>
|
||||
<td class="fieldData">
|
||||
<p> {{ dive.duration }} </p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody></table>
|
||||
|
@ -140,39 +149,40 @@
|
|||
<td class="fieldTitle">
|
||||
<h1> Time. </h1>
|
||||
</td>
|
||||
<td>
|
||||
<h1> {{ dive.time }} </h1>
|
||||
<td class="fieldData">
|
||||
<p> {{ dive.time }} </p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="fieldTitle">
|
||||
<h1> Air Temp. </h1>
|
||||
</td>
|
||||
<td><h1> {{ dive.airTemp }} </h1>
|
||||
<td class="fieldData">
|
||||
<p> {{ dive.airTemp }} </p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="fieldTitle">
|
||||
<h1> Water Temp. </h1>
|
||||
</td>
|
||||
<td>
|
||||
<h1> {{ dive.waterTemp }} </h1>
|
||||
<td class="fieldData">
|
||||
<p> {{ dive.waterTemp }} </p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="fieldTitle">
|
||||
<h1> Buddy </h1>
|
||||
</td>
|
||||
<td>
|
||||
<h1> {{ dive.buddy }} </h1>
|
||||
<td class="fieldData">
|
||||
<p> {{ dive.buddy }} </p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="fieldTitle">
|
||||
<h1> Dive Master </h1>
|
||||
</td>
|
||||
<td>
|
||||
<h1> {{ dive.divemaster }} </h1>
|
||||
<td class="fieldData">
|
||||
<p> {{ dive.divemaster }} </p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
|
@ -185,9 +195,9 @@
|
|||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<td class="fieldData">
|
||||
<div class="textArea">
|
||||
<h1> {{ dive.notes }} </h1>
|
||||
<p> {{ dive.notes }} </p>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
|
|
@ -15,11 +15,17 @@
|
|||
font-size: {{ template_options.font_size }}vw;
|
||||
}
|
||||
|
||||
p {
|
||||
float: left;
|
||||
font-size: {{ template_options.font_size }}vw;
|
||||
}
|
||||
|
||||
table {
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
border:max(1px, 0.1vw);
|
||||
border-width: {{ template_options.borderwidth }}px;
|
||||
border-style:solid;
|
||||
border-color: {{ template_options.color6 }};
|
||||
}
|
||||
|
||||
td {
|
||||
|
@ -32,10 +38,10 @@
|
|||
}
|
||||
|
||||
.mainContainer {
|
||||
width: 96%;
|
||||
width: 98%;
|
||||
height: 100%;
|
||||
margin-left: 2%;
|
||||
margin-right: 2%;
|
||||
margin-left: 1%;
|
||||
margin-right: 1%;
|
||||
margin-top: 0%;
|
||||
margin-bottom: 0%;
|
||||
overflow: hidden;
|
||||
|
@ -44,53 +50,56 @@
|
|||
}
|
||||
|
||||
.innerContainer {
|
||||
width: 98%;
|
||||
height: 98%;
|
||||
padding: 1%;
|
||||
width: 100%;
|
||||
height: 99%;
|
||||
padding-top: 1%;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.diveDetails {
|
||||
width: 98%;
|
||||
width: 100%;
|
||||
height: 98%;
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
border:max(1px, 0.1vw);
|
||||
border-style:solid;
|
||||
float: left;
|
||||
}
|
||||
|
||||
.diveProfile {
|
||||
width: 96%;
|
||||
width: 99%;
|
||||
height: 40%;
|
||||
margin: 2%;
|
||||
margin: 0.5%;
|
||||
}
|
||||
|
||||
.dataSection {
|
||||
width: 98%;
|
||||
width: 100%;
|
||||
height: 40%;
|
||||
margin: 1%;
|
||||
margin: 0%;
|
||||
}
|
||||
|
||||
.fieldTitle {
|
||||
background-color: {{ template_options.color2 }};
|
||||
overflow: hidden;
|
||||
color: {{ template_options.color4 }};
|
||||
}
|
||||
|
||||
.fieldData {
|
||||
background-color: {{ template_options.color3 }};
|
||||
color: {{ template_options.color5 }};
|
||||
}
|
||||
|
||||
.table_class {
|
||||
float: left;
|
||||
margin: 1%;
|
||||
width: 48%;
|
||||
margin: 0.5%;
|
||||
width: 49%;
|
||||
}
|
||||
|
||||
.notes_table_class {
|
||||
overflow: hidden;
|
||||
width: 98%;
|
||||
margin: 1%;
|
||||
width: 99%;
|
||||
margin: 0.5%;
|
||||
}
|
||||
|
||||
.textArea {
|
||||
line-height: {{ template_options.line_spacing }};
|
||||
color: {{ template_options.color5 }};
|
||||
max-height: 19vh;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
@ -111,39 +120,40 @@
|
|||
<td class="fieldTitle">
|
||||
<h1> Dive No. </h1>
|
||||
</td>
|
||||
<td>
|
||||
<h1> {{ dive.number }} </h1>
|
||||
<td class="fieldData">
|
||||
<p> {{ dive.number }} </p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="fieldTitle">
|
||||
<h1> Date </h1>
|
||||
</td>
|
||||
<td><h1> {{ dive.date }} </h1>
|
||||
<td class="fieldData">
|
||||
<p> {{ dive.date }} </p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="fieldTitle">
|
||||
<h1> Location </h1>
|
||||
</td>
|
||||
<td>
|
||||
<h1> {{ dive.location }} </h1>
|
||||
<td class="fieldData">
|
||||
<p> {{ dive.location }} </p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="fieldTitle">
|
||||
<h1> Max depth </h1>
|
||||
</td>
|
||||
<td>
|
||||
<h1> {{ dive.depth }} </h1>
|
||||
<td class="fieldData">
|
||||
<p> {{ dive.depth }} </p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="fieldTitle">
|
||||
<h1> Duration </h1>
|
||||
</td>
|
||||
<td>
|
||||
<h1> {{ dive.duration }} </h1>
|
||||
<td class="fieldData">
|
||||
<p> {{ dive.duration }} </p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody></table>
|
||||
|
@ -152,39 +162,40 @@
|
|||
<td class="fieldTitle">
|
||||
<h1> Time. </h1>
|
||||
</td>
|
||||
<td>
|
||||
<h1> {{ dive.time }} </h1>
|
||||
<td class="fieldData">
|
||||
<p> {{ dive.time }} </p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="fieldTitle">
|
||||
<h1> Air Temp. </h1>
|
||||
</td>
|
||||
<td><h1> {{ dive.airTemp }} </h1>
|
||||
<td class="fieldData">
|
||||
<p> {{ dive.airTemp }} </p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="fieldTitle">
|
||||
<h1> Water Temp. </h1>
|
||||
</td>
|
||||
<td>
|
||||
<h1> {{ dive.waterTemp }} </h1>
|
||||
<td class="fieldData">
|
||||
<p> {{ dive.waterTemp }} </p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="fieldTitle">
|
||||
<h1> Buddy </h1>
|
||||
</td>
|
||||
<td>
|
||||
<h1> {{ dive.buddy }} </h1>
|
||||
<td class="fieldData">
|
||||
<p> {{ dive.buddy }} </p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="fieldTitle">
|
||||
<h1> Dive Master </h1>
|
||||
</td>
|
||||
<td>
|
||||
<h1> {{ dive.divemaster }} </h1>
|
||||
<td class="fieldData">
|
||||
<p> {{ dive.divemaster }} </p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
|
@ -197,9 +208,9 @@
|
|||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<td class="fieldData">
|
||||
<div class="textArea">
|
||||
<h1> {{ dive.notes }} </h1>
|
||||
<p> {{ dive.notes }} </p>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
|
182
printing_templates/Six Dives.html
Normal file
182
printing_templates/Six Dives.html
Normal file
|
@ -0,0 +1,182 @@
|
|||
<html>
|
||||
<head>
|
||||
<style>
|
||||
body {
|
||||
{{ print_options.grayscale }};
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
font-size: {{ template_options.font_size }}vw;
|
||||
line-height: {{ template_options.line_spacing }};
|
||||
font-family: {{ template_options.font }};
|
||||
color: {{ template_options.color4 }};
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: {{ template_options.font_size }}vw;
|
||||
float: left;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
p {
|
||||
font-size: {{ template_options.font_size }}vw;
|
||||
float: left;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
td {
|
||||
margin:0px;
|
||||
}
|
||||
|
||||
#footer {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
float: left;
|
||||
}
|
||||
|
||||
#body_div {
|
||||
background-color: {{ template_options.color1 }};
|
||||
float: left;
|
||||
}
|
||||
|
||||
.mainContainer {
|
||||
width: 50%;
|
||||
height: 33.333333%;
|
||||
margin-left: 0%;
|
||||
margin-right: 0%;
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
overflow: hidden;
|
||||
page-break-inside: avoid;
|
||||
float: left;
|
||||
}
|
||||
|
||||
.innerContainer {
|
||||
height: 99%;
|
||||
width: 98%;
|
||||
padding-left: 1%;
|
||||
padding-right: 1%;
|
||||
padding-top: 1%;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.table_class {
|
||||
overflow: hidden;
|
||||
width: 100%;
|
||||
margin: 0%;
|
||||
float: left;
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
border-width: {{ template_options.borderwidth }}px;
|
||||
border-style:solid;
|
||||
border-color: {{ template_options.color6 }};
|
||||
font-size: {{ template_options.font_size }}vw;
|
||||
background-color: {{ template_options.color3 }};
|
||||
color: {{ template_options.color4 }};
|
||||
}
|
||||
|
||||
.notes_table_class {
|
||||
overflow: hidden;
|
||||
max-width: 100%;
|
||||
min-width: 100%;
|
||||
margin: 0.5%;
|
||||
float: left;
|
||||
}
|
||||
|
||||
.diveProfile {
|
||||
width: 100%;
|
||||
height: 95%;
|
||||
margin-left: 0%;
|
||||
margin-right: 0%;
|
||||
margin-bottom: 0%;
|
||||
margin-top: 0%;
|
||||
float: right;
|
||||
}
|
||||
|
||||
.diveDetails {
|
||||
width: 100%;
|
||||
float: left;
|
||||
}
|
||||
|
||||
.dataPart {
|
||||
height: 45%;
|
||||
max-height: 60%;
|
||||
}
|
||||
|
||||
.dataSection{
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.textArea {
|
||||
overflow: hidden !important;
|
||||
text-overflow: ellipsis;
|
||||
line-height: {{ template_options.line_spacing }};
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body data-numberofdives = 6>
|
||||
<div id="body_div">
|
||||
{% block main_rows %}
|
||||
{% for dive in dives %}
|
||||
<div class="mainContainer">
|
||||
<div class="innerContainer">
|
||||
<div class="diveDetails">
|
||||
<div class="dataPart">
|
||||
<div class="diveProfile" id="dive_{{ dive.id }}">
|
||||
</div>
|
||||
<div class="dataSection">
|
||||
<table style="float:left;width:100%;">
|
||||
<tr>
|
||||
<td>
|
||||
<h1> Dive # {{ dive.number }} - {{ dive.date }} {{ dive.time }}</h1>
|
||||
<p style="float:right;"> Max depth: {{ dive.depth }} </p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<p> {{ dive.location }} </p>
|
||||
<p style="float:right;"> Duration: {{ dive.duration }} </p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<table class="table_class">
|
||||
<tr>
|
||||
<td> Gas used: {{ dive.gas }}</td>
|
||||
<td> Tags: {{ dive.tags }}</td>
|
||||
<td> SAC: {{ dive.sac }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> Divemaster: {{ dive.divemaster }}</td>
|
||||
<td> Buddy: {{ dive.buddy }}</td>
|
||||
<td> Rating: {{ dive.rating }}/5</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div class="notesPart">
|
||||
<table class="notes_table_class">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<p> Notes: </p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div class="textArea">
|
||||
<p> {{ dive.notes }} </p>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% endblock %}
|
||||
<div id="footer">
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
|
@ -21,6 +21,11 @@
|
|||
-webkit-column-break-inside: avoid;
|
||||
padding-top: 1vh;
|
||||
padding-bottom: 1vh;
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
border-width: {{ template_options.borderwidth }}px;
|
||||
border-style:solid;
|
||||
border-color: {{ template_options.color6 }};
|
||||
}
|
||||
|
||||
#body_div {
|
||||
|
@ -28,10 +33,10 @@
|
|||
}
|
||||
|
||||
.mainContainer {
|
||||
width: 96%;
|
||||
width: 99%;
|
||||
height: 100%;
|
||||
margin-left: 2%;
|
||||
margin-right: 2%;
|
||||
margin-left: 0.5%;
|
||||
margin-right: 0.5%;
|
||||
margin-top: 0%;
|
||||
margin-bottom: 0%;
|
||||
overflow: hidden;
|
||||
|
@ -41,13 +46,8 @@
|
|||
|
||||
.table_class {
|
||||
overflow: hidden;
|
||||
width: 97%;
|
||||
margin: 1.5%;
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
border:max(0.1vw, 1px);
|
||||
border-style:solid;
|
||||
border-color: color: {{ template_options.color5 }};
|
||||
width: 100%;
|
||||
margin: 0%;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
@ -55,7 +55,7 @@
|
|||
<body data-numberofdives = 0>
|
||||
<div id="body_div">
|
||||
<table class="table_class">
|
||||
<tr style="background-color: {{ template_options.color2 }}; color: {{ template_options.color3 }}">
|
||||
<tr style="background-color: {{ template_options.color2 }}; color: {{ template_options.color4 }}">
|
||||
<th>Dive #</th>
|
||||
<th>Date</th>
|
||||
<th>Time</th>
|
||||
|
@ -66,7 +66,7 @@
|
|||
</tr>
|
||||
{% block main_rows %}
|
||||
{% for dive in dives %}
|
||||
<tr style="color: {{ template_options.color4 }}">
|
||||
<tr class="dontbreak" style="background-color: {{ template_options.color3 }}; color: {{ template_options.color5 }};">
|
||||
<th>{{ dive.number }}</th>
|
||||
<th>{{ dive.date }}</th>
|
||||
<th>{{ dive.time }}</th>
|
||||
|
|
|
@ -15,15 +15,20 @@
|
|||
float: left;
|
||||
}
|
||||
|
||||
p {
|
||||
font-size: {{ template_options.font_size }}vw;
|
||||
float: left;
|
||||
}
|
||||
|
||||
#body_div {
|
||||
background-color: {{ template_options.color1 }};
|
||||
}
|
||||
|
||||
.mainContainer {
|
||||
width: 96%;
|
||||
width: 99%;
|
||||
height: 50%;
|
||||
margin-left: 2%;
|
||||
margin-right: 2%;
|
||||
margin-left: 0.5%;
|
||||
margin-right: 0.5%;
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
overflow: hidden;
|
||||
|
@ -32,68 +37,70 @@
|
|||
|
||||
.innerContainer {
|
||||
height: 85%;
|
||||
padding: 0.5%;
|
||||
margin-top: 1%;
|
||||
margin-bottom: 1%;
|
||||
overflow: hidden;
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
border:max(0.1vw, 1px);
|
||||
border-style:solid;
|
||||
}
|
||||
|
||||
.table_class {
|
||||
overflow: hidden;
|
||||
max-width: 25%;
|
||||
min-width: 25%;
|
||||
width: 25%;
|
||||
height: 99%;
|
||||
margin: 0.5%;
|
||||
float: left;
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
border:max(0.1vw, 1px);
|
||||
border-width: {{ template_options.borderwidth }}px;
|
||||
border-style:solid;
|
||||
border-color: {{ template_options.color6 }};
|
||||
}
|
||||
|
||||
.notes_table_class {
|
||||
overflow: hidden;
|
||||
max-width: 100%;
|
||||
min-width: 100%;
|
||||
width: 99%;
|
||||
margin: 0.5%;
|
||||
float: left;
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
border:max(0.1vw, 1px);
|
||||
border-width: {{ template_options.borderwidth }}px;
|
||||
border-style:solid;
|
||||
border-color: {{ template_options.color6 }};
|
||||
}
|
||||
|
||||
.fieldTitle {
|
||||
background-color: {{ template_options.color2 }};
|
||||
overflow: hidden;
|
||||
padding:0;
|
||||
color: {{ template_options.color4 }};
|
||||
padding-left: 2%;
|
||||
}
|
||||
|
||||
.fieldData {
|
||||
color: {{ template_options.color5 }};
|
||||
background-color: {{ template_options.color3 }};
|
||||
padding-left: 2%;
|
||||
}
|
||||
|
||||
.diveProfile {
|
||||
width: 48%;
|
||||
height: 95%;
|
||||
margin-left: 0%;
|
||||
margin-right: 0%;
|
||||
margin-bottom: 0%;
|
||||
margin-top: 0.5%;
|
||||
float: right;
|
||||
float: left;
|
||||
height: 99%;
|
||||
width: 47%;
|
||||
margin: 0.5%;
|
||||
}
|
||||
|
||||
.diveDetails {
|
||||
width: 98.5%;
|
||||
width: 100%;
|
||||
float: left;
|
||||
}
|
||||
|
||||
.dataPart {
|
||||
height: 45%;
|
||||
max-height: 60%;
|
||||
height: 64%;
|
||||
padding-bottom: 1%;
|
||||
width: 100%;
|
||||
float: left;
|
||||
}
|
||||
|
||||
.notesPart {
|
||||
height: 35%;
|
||||
width: 100%;
|
||||
float: left;
|
||||
}
|
||||
|
||||
.textArea {
|
||||
|
@ -122,39 +129,40 @@
|
|||
<td class="fieldTitle">
|
||||
<h1> Dive No. </h1>
|
||||
</td>
|
||||
<td>
|
||||
<h1> {{ dive.number }} </h1>
|
||||
<td class="fieldData">
|
||||
<p> {{ dive.number }} </p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="fieldTitle">
|
||||
<h1> Date </h1>
|
||||
</td>
|
||||
<td><h1> {{ dive.date }} </h1>
|
||||
<td class="fieldData">
|
||||
<p> {{ dive.date }} </p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="fieldTitle">
|
||||
<h1> Location </h1>
|
||||
</td>
|
||||
<td>
|
||||
<h1> {{ dive.location }} </h1>
|
||||
<td class="fieldData">
|
||||
<p> {{ dive.location }} </p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="fieldTitle">
|
||||
<h1> Max depth </h1>
|
||||
</td>
|
||||
<td>
|
||||
<h1> {{ dive.depth }} </h1>
|
||||
<td class="fieldData">
|
||||
<p> {{ dive.depth }} </p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="fieldTitle">
|
||||
<h1> Duration </h1>
|
||||
</td>
|
||||
<td>
|
||||
<h1> {{ dive.duration }} </h1>
|
||||
<td class="fieldData">
|
||||
<p> {{ dive.duration }} </p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody></table>
|
||||
|
@ -163,39 +171,40 @@
|
|||
<td class="fieldTitle">
|
||||
<h1> Time. </h1>
|
||||
</td>
|
||||
<td>
|
||||
<h1> {{ dive.time }} </h1>
|
||||
<td class="fieldData">
|
||||
<p> {{ dive.time }} </p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="fieldTitle">
|
||||
<h1> Air Temp. </h1>
|
||||
</td>
|
||||
<td><h1> {{ dive.airTemp }} </h1>
|
||||
<td class="fieldData">
|
||||
<p> {{ dive.airTemp }} </p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="fieldTitle">
|
||||
<h1> Water Temp. </h1>
|
||||
</td>
|
||||
<td>
|
||||
<h1> {{ dive.waterTemp }} </h1>
|
||||
<td class="fieldData">
|
||||
<p> {{ dive.waterTemp }} </p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="fieldTitle">
|
||||
<h1> Buddy </h1>
|
||||
</td>
|
||||
<td>
|
||||
<h1> {{ dive.buddy }} </h1>
|
||||
<td class="fieldData">
|
||||
<p> {{ dive.buddy }} </p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="fieldTitle">
|
||||
<h1> Dive Master </h1>
|
||||
</td>
|
||||
<td>
|
||||
<h1> {{ dive.divemaster }} </h1>
|
||||
<td class="fieldData">
|
||||
<p> {{ dive.divemaster }} </p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody></table>
|
||||
|
@ -205,14 +214,14 @@
|
|||
<div class="notesPart">
|
||||
<table class="notes_table_class">
|
||||
<tbody><tr>
|
||||
<td class="fieldTitle">
|
||||
<td style="padding-left:1%" class="fieldTitle">
|
||||
<h1> Notes </h1>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<td class="fieldData">
|
||||
<div class="textArea">
|
||||
<h1> {{ dive.notes }} </h1>
|
||||
<p> {{ dive.notes }} </p>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
@ -224,7 +233,7 @@
|
|||
{% endfor %}
|
||||
{% endblock %}
|
||||
<div id="footer">
|
||||
<div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -17,21 +17,24 @@ template_options::color_palette_struct ssrf_colors, almond_colors, blueshades_co
|
|||
PrintDialog::PrintDialog(QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f)
|
||||
{
|
||||
// initialize const colors
|
||||
ssrf_colors.color1 = QColor::fromRgb(0xef, 0xf7, 0xff);
|
||||
ssrf_colors.color1 = QColor::fromRgb(0xff, 0xff, 0xff);
|
||||
ssrf_colors.color2 = QColor::fromRgb(0xa6, 0xbc, 0xd7);
|
||||
ssrf_colors.color3 = QColor::fromRgb(0x34, 0x65, 0xa4);
|
||||
ssrf_colors.color4 = QColor::fromRgb(0x20, 0x4a, 0x87);
|
||||
ssrf_colors.color5 = QColor::fromRgb(0x17, 0x37, 0x64);
|
||||
almond_colors.color1 = QColor::fromRgb(243, 234, 207);
|
||||
ssrf_colors.color3 = QColor::fromRgb(0xef, 0xf7, 0xff);
|
||||
ssrf_colors.color4 = QColor::fromRgb(0x34, 0x65, 0xa4);
|
||||
ssrf_colors.color5 = QColor::fromRgb(0x20, 0x4a, 0x87);
|
||||
ssrf_colors.color6 = QColor::fromRgb(0x17, 0x37, 0x64);
|
||||
almond_colors.color1 = QColor::fromRgb(255, 255, 255);
|
||||
almond_colors.color2 = QColor::fromRgb(253, 204, 156);
|
||||
almond_colors.color3 = QColor::fromRgb(136, 160, 150);
|
||||
almond_colors.color4 = QColor::fromRgb(187, 171, 139);
|
||||
almond_colors.color5 = QColor::fromRgb(239, 130, 117);
|
||||
blueshades_colors.color1 = QColor::fromRgb(182, 192, 206);
|
||||
almond_colors.color3 = QColor::fromRgb(243, 234, 207);
|
||||
almond_colors.color4 = QColor::fromRgb(136, 160, 150);
|
||||
almond_colors.color5 = QColor::fromRgb(187, 171, 139);
|
||||
almond_colors.color6 = QColor::fromRgb(0, 0, 0);
|
||||
blueshades_colors.color1 = QColor::fromRgb(255, 255, 255);
|
||||
blueshades_colors.color2 = QColor::fromRgb(142, 152, 166);
|
||||
blueshades_colors.color3 = QColor::fromRgb(31, 49, 75);
|
||||
blueshades_colors.color4 = QColor::fromRgb(21, 45, 84);
|
||||
blueshades_colors.color5 = QColor::fromRgb(5, 25, 56);
|
||||
blueshades_colors.color3 = QColor::fromRgb(182, 192, 206);
|
||||
blueshades_colors.color4 = QColor::fromRgb(31, 49, 75);
|
||||
blueshades_colors.color5 = QColor::fromRgb(21, 45, 84);
|
||||
blueshades_colors.color6 = QColor::fromRgb(0, 0, 0);
|
||||
|
||||
// check if the options were previously stored in the settings; if not use some defaults.
|
||||
QSettings s;
|
||||
|
@ -164,13 +167,6 @@ void PrintDialog::onFinished()
|
|||
|
||||
void PrintDialog::previewClicked(void)
|
||||
{
|
||||
if (printOptions.type == print_options::STATISTICS) {
|
||||
QMessageBox msgBox;
|
||||
msgBox.setText("This feature is not implemented yet");
|
||||
msgBox.exec();
|
||||
return;
|
||||
}
|
||||
|
||||
QPrintPreviewDialog previewDialog(&qprinter, this, Qt::Window
|
||||
| Qt::CustomizeWindowHint | Qt::WindowCloseButtonHint
|
||||
| Qt::WindowTitleHint);
|
||||
|
@ -180,13 +176,6 @@ void PrintDialog::previewClicked(void)
|
|||
|
||||
void PrintDialog::printClicked(void)
|
||||
{
|
||||
if (printOptions.type == print_options::STATISTICS) {
|
||||
QMessageBox msgBox;
|
||||
msgBox.setText("This feature is not implemented yet");
|
||||
msgBox.exec();
|
||||
return;
|
||||
}
|
||||
|
||||
QPrintDialog printDialog(&qprinter, this);
|
||||
if (printDialog.exec() == QDialog::Accepted) {
|
||||
switch (printOptions.type) {
|
||||
|
@ -195,6 +184,7 @@ void PrintDialog::printClicked(void)
|
|||
printer->print();
|
||||
break;
|
||||
case print_options::STATISTICS:
|
||||
printer->print_statistics();
|
||||
break;
|
||||
}
|
||||
close();
|
||||
|
@ -204,7 +194,14 @@ void PrintDialog::printClicked(void)
|
|||
void PrintDialog::onPaintRequested(QPrinter *printerPtr)
|
||||
{
|
||||
connect(printer, SIGNAL(progessUpdated(int)), progressBar, SLOT(setValue(int)));
|
||||
printer->print();
|
||||
switch (printOptions.type) {
|
||||
case print_options::DIVELIST:
|
||||
printer->print();
|
||||
break;
|
||||
case print_options::STATISTICS:
|
||||
printer->print_statistics();
|
||||
break;
|
||||
}
|
||||
progressBar->setValue(0);
|
||||
disconnect(printer, SIGNAL(progessUpdated(int)), progressBar, SLOT(setValue(int)));
|
||||
}
|
||||
|
|
|
@ -64,17 +64,39 @@ void PrintOptions::setup()
|
|||
}
|
||||
|
||||
// print type radio buttons
|
||||
void PrintOptions::on_radioDiveListPrint_clicked(bool check)
|
||||
void PrintOptions::on_radioDiveListPrint_toggled(bool check)
|
||||
{
|
||||
if (check) {
|
||||
printOptions->type = print_options::DIVELIST;
|
||||
|
||||
// print options
|
||||
ui.printInColor->setEnabled(true);
|
||||
ui.printSelected->setEnabled(true);
|
||||
|
||||
// print template
|
||||
ui.deleteButton->setEnabled(true);
|
||||
ui.editButton->setEnabled(true);
|
||||
ui.exportButton->setEnabled(true);
|
||||
ui.importButton->setEnabled(true);
|
||||
ui.printTemplate->setEnabled(true);
|
||||
}
|
||||
}
|
||||
|
||||
void PrintOptions::on_radioStatisticsPrint_clicked(bool check)
|
||||
void PrintOptions::on_radioStatisticsPrint_toggled(bool check)
|
||||
{
|
||||
if (check) {
|
||||
printOptions->type = print_options::STATISTICS;
|
||||
|
||||
// print options
|
||||
ui.printInColor->setEnabled(false);
|
||||
ui.printSelected->setEnabled(false);
|
||||
|
||||
// print template
|
||||
ui.deleteButton->setEnabled(false);
|
||||
ui.editButton->setEnabled(false);
|
||||
ui.exportButton->setEnabled(false);
|
||||
ui.importButton->setEnabled(false);
|
||||
ui.printTemplate->setEnabled(false);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -19,6 +19,7 @@ struct print_options {
|
|||
struct template_options {
|
||||
int font_index;
|
||||
int color_palette_index;
|
||||
int border_width;
|
||||
double font_size;
|
||||
double line_spacing;
|
||||
struct color_palette_struct {
|
||||
|
@ -27,12 +28,14 @@ struct template_options {
|
|||
QColor color3;
|
||||
QColor color4;
|
||||
QColor color5;
|
||||
QColor color6;
|
||||
bool operator!=(const color_palette_struct &other) const {
|
||||
return other.color1 != color1
|
||||
|| other.color2 != color2
|
||||
|| other.color3 != color3
|
||||
|| other.color4 != color4
|
||||
|| other.color5 != color5;
|
||||
|| other.color5 != color5
|
||||
|| other.color6 != color6;
|
||||
}
|
||||
} color_palette;
|
||||
bool operator!=(const template_options &other) const {
|
||||
|
@ -72,8 +75,8 @@ private
|
|||
slots:
|
||||
void printInColorClicked(bool check);
|
||||
void printSelectedClicked(bool check);
|
||||
void on_radioStatisticsPrint_clicked(bool check);
|
||||
void on_radioDiveListPrint_clicked(bool check);
|
||||
void on_radioStatisticsPrint_toggled(bool check);
|
||||
void on_radioDiveListPrint_toggled(bool check);
|
||||
void on_printTemplate_currentIndexChanged(int index);
|
||||
void on_editButton_clicked();
|
||||
void on_importButton_clicked();
|
||||
|
|
|
@ -627,6 +627,17 @@ void ProfileWidget2::plotDive(struct dive *d, bool force)
|
|||
eventItems.clear();
|
||||
struct event *event = currentdc->events;
|
||||
while (event) {
|
||||
// if print mode is selected only draw headings, SP change, gas events or bookmark event
|
||||
if (printMode) {
|
||||
if (same_string(event->name, "") ||
|
||||
!(strcmp(event->name, "heading") == 0 ||
|
||||
(same_string(event->name, "SP change") && event->time.seconds == 0) ||
|
||||
event_is_gaschange(event) ||
|
||||
event->type == SAMPLE_EVENT_BOOKMARK)) {
|
||||
event = event->next;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
DiveEventItem *item = new DiveEventItem();
|
||||
item->setHorizontalAxis(timeAxis);
|
||||
item->setVerticalAxis(profileYAxis);
|
||||
|
|
|
@ -30,9 +30,11 @@ TemplateEdit::TemplateEdit(QWidget *parent, struct print_options *printOptions,
|
|||
btnGroup->addButton(ui->editButton3, 3);
|
||||
btnGroup->addButton(ui->editButton4, 4);
|
||||
btnGroup->addButton(ui->editButton5, 5);
|
||||
btnGroup->addButton(ui->editButton6, 6);
|
||||
connect(btnGroup, SIGNAL(buttonClicked(QAbstractButton*)), this, SLOT(colorSelect(QAbstractButton*)));
|
||||
|
||||
ui->plainTextEdit->setPlainText(grantlee_template);
|
||||
editingCustomColors = false;
|
||||
updatePreview();
|
||||
}
|
||||
|
||||
|
@ -59,12 +61,14 @@ void TemplateEdit::updatePreview()
|
|||
ui->colorLable3->setStyleSheet("QLabel { background-color : \"" + newTemplateOptions.color_palette.color3.name() + "\";}");
|
||||
ui->colorLable4->setStyleSheet("QLabel { background-color : \"" + newTemplateOptions.color_palette.color4.name() + "\";}");
|
||||
ui->colorLable5->setStyleSheet("QLabel { background-color : \"" + newTemplateOptions.color_palette.color5.name() + "\";}");
|
||||
ui->colorLable6->setStyleSheet("QLabel { background-color : \"" + newTemplateOptions.color_palette.color6.name() + "\";}");
|
||||
|
||||
ui->colorLable1->setText(newTemplateOptions.color_palette.color1.name());
|
||||
ui->colorLable2->setText(newTemplateOptions.color_palette.color2.name());
|
||||
ui->colorLable3->setText(newTemplateOptions.color_palette.color3.name());
|
||||
ui->colorLable4->setText(newTemplateOptions.color_palette.color4.name());
|
||||
ui->colorLable5->setText(newTemplateOptions.color_palette.color5.name());
|
||||
ui->colorLable6->setText(newTemplateOptions.color_palette.color6.name());
|
||||
|
||||
// update critical UI elements
|
||||
ui->colorpalette->setCurrentIndex(newTemplateOptions.color_palette_index);
|
||||
|
@ -102,7 +106,10 @@ void TemplateEdit::on_colorpalette_currentIndexChanged(int index)
|
|||
newTemplateOptions.color_palette = blueshades_colors;
|
||||
break;
|
||||
case CUSTOM: // custom
|
||||
newTemplateOptions.color_palette = custom_colors;
|
||||
if (!editingCustomColors)
|
||||
newTemplateOptions.color_palette = custom_colors;
|
||||
else
|
||||
editingCustomColors = false;
|
||||
break;
|
||||
}
|
||||
updatePreview();
|
||||
|
@ -121,7 +128,7 @@ void TemplateEdit::saveSettings()
|
|||
printOptions->p_template = "custom.html";
|
||||
TemplateLayout::writeTemplate("custom.html", ui->plainTextEdit->toPlainText());
|
||||
}
|
||||
if (templateOptions->color_palette_index == 2) {
|
||||
if (templateOptions->color_palette_index == CUSTOM) {
|
||||
custom_colors = templateOptions->color_palette;
|
||||
}
|
||||
}
|
||||
|
@ -148,6 +155,7 @@ void TemplateEdit::on_buttonBox_clicked(QAbstractButton *button)
|
|||
|
||||
void TemplateEdit::colorSelect(QAbstractButton *button)
|
||||
{
|
||||
editingCustomColors = true;
|
||||
// reset custom colors palette
|
||||
switch (newTemplateOptions.color_palette_index) {
|
||||
case SSRF_COLORS: // subsurface derived default colors
|
||||
|
@ -155,11 +163,11 @@ void TemplateEdit::colorSelect(QAbstractButton *button)
|
|||
break;
|
||||
case ALMOND: // almond
|
||||
newTemplateOptions.color_palette = almond_colors;
|
||||
custom_colors = newTemplateOptions.color_palette;
|
||||
break;
|
||||
case BLUESHADES: // blueshades
|
||||
newTemplateOptions.color_palette = blueshades_colors;
|
||||
custom_colors = newTemplateOptions.color_palette;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -168,24 +176,35 @@ void TemplateEdit::colorSelect(QAbstractButton *button)
|
|||
switch (btnGroup->id(button)) {
|
||||
case 1:
|
||||
color = QColorDialog::getColor(newTemplateOptions.color_palette.color1, this);
|
||||
newTemplateOptions.color_palette.color1 = color;
|
||||
if (color.isValid()) {
|
||||
newTemplateOptions.color_palette.color1 = color;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
color = QColorDialog::getColor(newTemplateOptions.color_palette.color2, this);
|
||||
newTemplateOptions.color_palette.color2 = color;
|
||||
break;
|
||||
if (color.isValid()) {
|
||||
newTemplateOptions.color_palette.color2 = color;
|
||||
} break;
|
||||
case 3:
|
||||
color = QColorDialog::getColor(newTemplateOptions.color_palette.color3, this);
|
||||
newTemplateOptions.color_palette.color3 = color;
|
||||
break;
|
||||
if (color.isValid()) {
|
||||
newTemplateOptions.color_palette.color3 = color;
|
||||
} break;
|
||||
case 4:
|
||||
color = QColorDialog::getColor(newTemplateOptions.color_palette.color4, this);
|
||||
newTemplateOptions.color_palette.color4 = color;
|
||||
break;
|
||||
if (color.isValid()) {
|
||||
newTemplateOptions.color_palette.color4 = color;
|
||||
} break;
|
||||
case 5:
|
||||
color = QColorDialog::getColor(newTemplateOptions.color_palette.color5, this);
|
||||
newTemplateOptions.color_palette.color5 = color;
|
||||
break;
|
||||
if (color.isValid()) {
|
||||
newTemplateOptions.color_palette.color5 = color;
|
||||
} break;
|
||||
case 6:
|
||||
color = QColorDialog::getColor(newTemplateOptions.color_palette.color6, this);
|
||||
if (color.isValid()) {
|
||||
newTemplateOptions.color_palette.color6 = color;
|
||||
} break;
|
||||
}
|
||||
newTemplateOptions.color_palette_index = CUSTOM;
|
||||
updatePreview();
|
||||
|
|
|
@ -31,6 +31,7 @@ private slots:
|
|||
private:
|
||||
Ui::TemplateEdit *ui;
|
||||
QButtonGroup *btnGroup;
|
||||
bool editingCustomColors;
|
||||
struct template_options *templateOptions;
|
||||
struct template_options newTemplateOptions;
|
||||
struct print_options *printOptions;
|
||||
|
|
|
@ -317,7 +317,7 @@
|
|||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Table cells</string>
|
||||
<string>Table cells 1</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
@ -347,9 +347,9 @@
|
|||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_7">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_13">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_7">
|
||||
<widget class="QLabel" name="label_6">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
|
@ -357,7 +357,7 @@
|
|||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Text 1</string>
|
||||
<string>Table cells 2</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
@ -387,9 +387,9 @@
|
|||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_9">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_7">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_11">
|
||||
<widget class="QLabel" name="label_7">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
|
@ -397,7 +397,7 @@
|
|||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Text 2</string>
|
||||
<string>Text 1</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
@ -427,9 +427,9 @@
|
|||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_6">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_9">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_4">
|
||||
<widget class="QLabel" name="label_11">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
|
@ -437,7 +437,7 @@
|
|||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Borders</string>
|
||||
<string>Text 2</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
@ -466,6 +466,46 @@
|
|||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_6">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_4">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Borders</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="colorLable6">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>color6</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="editButton6">
|
||||
<property name="text">
|
||||
<string>Edit</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer_2">
|
||||
<property name="orientation">
|
||||
|
|
|
@ -188,10 +188,30 @@ QString Dive::notes() const
|
|||
return m_notes;
|
||||
}
|
||||
|
||||
QString Dive::tags() const
|
||||
{
|
||||
return m_tags;
|
||||
}
|
||||
|
||||
QString Dive::gas() const
|
||||
{
|
||||
return m_gas;
|
||||
}
|
||||
|
||||
QString Dive::sac() const
|
||||
{
|
||||
return m_sac;
|
||||
}
|
||||
|
||||
int Dive::rating() const
|
||||
{
|
||||
return m_rating;
|
||||
}
|
||||
|
||||
void Dive::put_divemaster()
|
||||
{
|
||||
if (!dive->divemaster)
|
||||
m_divemaster = "";
|
||||
m_divemaster = "--";
|
||||
else
|
||||
m_divemaster = dive->divemaster;
|
||||
}
|
||||
|
@ -207,6 +227,9 @@ void Dive::put_date_time()
|
|||
void Dive::put_location()
|
||||
{
|
||||
m_location = QString::fromUtf8(get_dive_location(dive));
|
||||
if (m_location.isEmpty()) {
|
||||
m_location = "--";
|
||||
}
|
||||
}
|
||||
|
||||
void Dive::put_depth()
|
||||
|
@ -222,7 +245,7 @@ void Dive::put_duration()
|
|||
void Dive::put_buddy()
|
||||
{
|
||||
if (!dive->buddy)
|
||||
m_buddy = "";
|
||||
m_buddy = "--";
|
||||
else
|
||||
m_buddy = dive->buddy;
|
||||
}
|
||||
|
@ -231,9 +254,55 @@ void Dive::put_temp()
|
|||
{
|
||||
m_airTemp = get_temperature_string(dive->airtemp, true);
|
||||
m_waterTemp = get_temperature_string(dive->watertemp, true);
|
||||
if (m_airTemp.isEmpty()) {
|
||||
m_airTemp = "--";
|
||||
}
|
||||
if (m_waterTemp.isEmpty()) {
|
||||
m_waterTemp = "--";
|
||||
}
|
||||
}
|
||||
|
||||
void Dive::put_notes()
|
||||
{
|
||||
m_notes = QString::fromUtf8(dive->notes);
|
||||
if (m_notes.isEmpty()) {
|
||||
m_notes = "--";
|
||||
}
|
||||
}
|
||||
|
||||
void Dive::put_tags()
|
||||
{
|
||||
char buffer[256];
|
||||
taglist_get_tagstring(dive->tag_list, buffer, 256);
|
||||
m_tags = QString(buffer);
|
||||
}
|
||||
|
||||
void Dive::put_gas()
|
||||
{
|
||||
int added = 0;
|
||||
QString gas, gases;
|
||||
for (int i = 0; i < MAX_CYLINDERS; i++) {
|
||||
if (!is_cylinder_used(dive, i))
|
||||
continue;
|
||||
gas = dive->cylinder[i].type.description;
|
||||
gas += QString(!gas.isEmpty() ? " " : "") + gasname(&dive->cylinder[i].gasmix);
|
||||
// if has a description and if such gas is not already present
|
||||
if (!gas.isEmpty() && gases.indexOf(gas) == -1) {
|
||||
if (added > 0)
|
||||
gases += QString(" / ");
|
||||
gases += gas;
|
||||
added++;
|
||||
}
|
||||
}
|
||||
m_gas = gases;
|
||||
}
|
||||
|
||||
void Dive::put_sac()
|
||||
{
|
||||
if (dive->sac) {
|
||||
const char *unit;
|
||||
int decimal;
|
||||
double value = get_volume_units(dive->sac, &decimal, &unit);
|
||||
m_sac = QString::number(value, 'f', decimal).append(unit);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -32,6 +32,7 @@ class Dive {
|
|||
private:
|
||||
int m_number;
|
||||
int m_id;
|
||||
int m_rating;
|
||||
QString m_date;
|
||||
QString m_time;
|
||||
QString m_location;
|
||||
|
@ -42,6 +43,9 @@ private:
|
|||
QString m_airTemp;
|
||||
QString m_waterTemp;
|
||||
QString m_notes;
|
||||
QString m_tags;
|
||||
QString m_gas;
|
||||
QString m_sac;
|
||||
struct dive *dive;
|
||||
void put_date_time();
|
||||
void put_location();
|
||||
|
@ -51,6 +55,9 @@ private:
|
|||
void put_buddy();
|
||||
void put_temp();
|
||||
void put_notes();
|
||||
void put_tags();
|
||||
void put_gas();
|
||||
void put_sac();
|
||||
|
||||
public:
|
||||
Dive(struct dive *dive)
|
||||
|
@ -58,6 +65,7 @@ public:
|
|||
{
|
||||
m_number = dive->number;
|
||||
m_id = dive->id;
|
||||
m_rating = dive->rating;
|
||||
put_date_time();
|
||||
put_location();
|
||||
put_duration();
|
||||
|
@ -66,11 +74,15 @@ public:
|
|||
put_buddy();
|
||||
put_temp();
|
||||
put_notes();
|
||||
put_tags();
|
||||
put_gas();
|
||||
put_sac();
|
||||
}
|
||||
Dive();
|
||||
~Dive();
|
||||
int number() const;
|
||||
int id() const;
|
||||
int rating() const;
|
||||
QString date() const;
|
||||
QString time() const;
|
||||
QString location() const;
|
||||
|
@ -81,6 +93,9 @@ public:
|
|||
QString airTemp() const;
|
||||
QString waterTemp() const;
|
||||
QString notes() const;
|
||||
QString tags() const;
|
||||
QString gas() const;
|
||||
QString sac() const;
|
||||
};
|
||||
|
||||
Q_DECLARE_METATYPE(Dive)
|
||||
|
@ -112,6 +127,14 @@ else if (property == "waterTemp")
|
|||
return object.waterTemp();
|
||||
else if (property == "notes")
|
||||
return object.notes();
|
||||
else if (property == "rating")
|
||||
return object.rating();
|
||||
else if (property == "sac")
|
||||
return object.sac();
|
||||
else if (property == "tags")
|
||||
return object.tags();
|
||||
else if (property == "gas")
|
||||
return object.gas();
|
||||
GRANTLEE_END_LOOKUP
|
||||
|
||||
GRANTLEE_BEGIN_LOOKUP(template_options)
|
||||
|
@ -128,6 +151,8 @@ if (property == "font") {
|
|||
case 4:
|
||||
return "Verdana, Geneva, sans-serif";
|
||||
}
|
||||
} else if (property == "borderwidth") {
|
||||
return object.border_width;
|
||||
} else if (property == "font_size") {
|
||||
return object.font_size / 9.0;
|
||||
} else if (property == "line_spacing") {
|
||||
|
@ -142,6 +167,8 @@ if (property == "font") {
|
|||
return object.color_palette.color4.name();
|
||||
} else if (property == "color5") {
|
||||
return object.color_palette.color5.name();
|
||||
} else if (property == "color6") {
|
||||
return object.color_palette.color6.name();
|
||||
}
|
||||
GRANTLEE_END_LOOKUP
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue