summaryrefslogtreecommitdiffstats
path: root/qt-ui/printlayout.cpp
diff options
context:
space:
mode:
authorGravatar Lubomir I. Ivanov <neolit123@gmail.com>2013-09-27 19:06:45 +0300
committerGravatar Dirk Hohndel <dirk@hohndel.org>2013-09-27 09:29:30 -0700
commitdf8107830e24ce3687d37ee245a4e38202deea5f (patch)
treef93b4db511039aa75ce07c1aecf3bfc771fb0fbd /qt-ui/printlayout.cpp
parente81bbc1dabc3601876bd7393c73b49d5ff87ee85 (diff)
downloadsubsurface-df8107830e24ce3687d37ee245a4e38202deea5f.tar.gz
Print: provide means for profile layouting
printlayout.cpp(h): This patch cleans some test code and adds the function printProfileDives() that accepts a number of dives per rows and columns. It can technically fit any number of dives on a page given the page size allows it. Both landscape and portrait layouts are supported. It now replaces the old methods: printTwoDives() printSixDives() Space is reserved for data tables that will be placed bellow profiles on a later stage. Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'qt-ui/printlayout.cpp')
-rw-r--r--qt-ui/printlayout.cpp74
1 files changed, 44 insertions, 30 deletions
diff --git a/qt-ui/printlayout.cpp b/qt-ui/printlayout.cpp
index 7a4944ede..3d0937636 100644
--- a/qt-ui/printlayout.cpp
+++ b/qt-ui/printlayout.cpp
@@ -26,6 +26,7 @@ PrintLayout::PrintLayout(PrintDialog *dialogPtr, QPrinter *printerPtr, struct op
{
dialog = dialogPtr;
printer = printerPtr;
+ painter = NULL;
printOptions = optionsPtr;
// table print settings
@@ -52,10 +53,10 @@ void PrintLayout::print()
setup();
switch (printOptions->type) {
case options::PRETTY:
- printSixDives();
+ printProfileDives(3, 2);
break;
case options::TWOPERPAGE:
- printTwoDives();
+ printProfileDives(2, 1);
break;
case options::TABLE:
printTable();
@@ -80,52 +81,65 @@ void PrintLayout::setup()
scaledPageH = pageRect.height() / scaleY;
}
-// experimental
-void PrintLayout::printSixDives() const
+void PrintLayout::printProfileDives(int divesPerRow, int divesPerColumn)
{
+ // setup a painter
+ painter = new QPainter();
+ painter->begin(printer);
+ painter->setRenderHint(QPainter::Antialiasing);
+ painter->setRenderHint(QPainter::SmoothPixmapTransform);
+ painter->scale(scaleX, scaleY);
+
+ // setup the profile widget
ProfileGraphicsView *profile = mainWindow()->graphics();
- QPainter painter;
- painter.begin(printer);
- painter.setRenderHint(QPainter::Antialiasing);
- // painter.setRenderHint(QPainter::HighQualityAntialiasing);
- painter.setRenderHint(QPainter::SmoothPixmapTransform);
- painter.scale(scaleX, scaleY);
-
profile->clear();
profile->setPrintMode(true, !printOptions->color_selected);
QSize originalSize = profile->size();
- profile->resize(scaledPageW, scaledPageH);
-
- int i;
+ // swap rows/col for landscape
+ if (printer->orientation() == QPrinter::Landscape) {
+ int swap = divesPerColumn;
+ divesPerColumn = divesPerRow;
+ divesPerRow = swap;
+ }
+ // estimate profile and table height and resize the widget
+ const int scaledW = scaledPageW / divesPerColumn;
+ const int scaledH = scaledPageH / divesPerRow;
+ /* make the table 1/3 of the reserved height. potentially this could depend
+ * on orientation and other parameters as well. */
+ const int tableHeight = scaledH / 3;
+ profile->resize(scaledW, scaledH - tableHeight);
+
+ // plot the dives at specific rows and columns
+ int i, row = 0, col = 0;
struct dive *dive;
- bool firstPage = true;
for_each_dive(i, dive) {
if (!dive->selected && printOptions->print_selected)
continue;
- // don't create a new page if still on first page
- if (!firstPage)
- printer->newPage();
- else
- firstPage = false;
+ if (col == divesPerColumn) {
+ col = 0;
+ row++;
+ if (row == divesPerRow) {
+ row = 0;
+ printer->newPage();
+ }
+ }
profile->plot(dive, true);
QPixmap pm = QPixmap::grabWidget(profile);
- QTransform transform;
- transform.rotate(270);
- pm = QPixmap(pm.transformed(transform));
- painter.drawPixmap(0, 0, pm);
+ painter->drawPixmap(scaledW * col, scaledH * row, pm);
+ /* TODO: table should be drawn here, preferably by another function */
+ col++;
}
- painter.end();
+
+ // cleanup
+ painter->end();
+ delete painter;
+ painter = NULL;
profile->setPrintMode(false);
profile->resize(originalSize);
profile->clear();
profile->plot(current_dive, true);
}
-void PrintLayout::printTwoDives() const
-{
- // nop
-}
-
void PrintLayout::printTable()
{
// create and setup a table