diff options
author | Lubomir I. Ivanov <neolit123@gmail.com> | 2013-09-27 19:06:45 +0300 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2013-09-27 09:29:30 -0700 |
commit | df8107830e24ce3687d37ee245a4e38202deea5f (patch) | |
tree | f93b4db511039aa75ce07c1aecf3bfc771fb0fbd /qt-ui/printlayout.cpp | |
parent | e81bbc1dabc3601876bd7393c73b49d5ff87ee85 (diff) | |
download | subsurface-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.cpp | 74 |
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 |