[PATCH] Print: provide means for profile layouting
Lubomir I. Ivanov
neolit123 at gmail.com
Fri Sep 27 08:20:03 UTC 2013
i should have named the new function printProfileDives() instead of
plotProfileDives() for consistency.
will be fixed on the next iteration.
lubomir
--
On 27 September 2013 18:17, Lubomir I. Ivanov <neolit123 at gmail.com> wrote:
> From: "Lubomir I. Ivanov" <neolit123 at gmail.com>
>
> printlayout.cpp(h):
>
> This patch cleans some test code and adds the function
> plotProfileDives() 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 at gmail.com>
> ---
> qt-ui/printlayout.cpp | 74 ++++++++++++++++++++++++++++++---------------------
> qt-ui/printlayout.h | 5 ++--
> 2 files changed, 46 insertions(+), 33 deletions(-)
>
> diff --git a/qt-ui/printlayout.cpp b/qt-ui/printlayout.cpp
> index 7a4944e..d131e3b 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();
> + plotProfileDives(3, 2);
> break;
> case options::TWOPERPAGE:
> - printTwoDives();
> + plotProfileDives(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::plotProfileDives(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
> diff --git a/qt-ui/printlayout.h b/qt-ui/printlayout.h
> index ac363ab..815f8ef 100644
> --- a/qt-ui/printlayout.h
> +++ b/qt-ui/printlayout.h
> @@ -19,9 +19,9 @@ public:
> private:
> PrintDialog *dialog;
> QPrinter *printer;
> + QPainter *painter;
> struct options *printOptions;
>
> - QPainter *painter;
> int screenDpiX, screenDpiY, printerDpi, scaledPageW, scaledPageH;
> qreal scaleX, scaleY;
> QRect pageRect;
> @@ -31,8 +31,7 @@ private:
> unsigned int tablePrintHeadingBackground;
>
> void setup();
> - void printSixDives() const;
> - void printTwoDives() const;
> + void plotProfileDives(int divesPerRow, int divesPerColumn);
> void printTable();
> void addTablePrintDataRow(TablePrintModel *model, int row, struct dive *dive) const;
> void addTablePrintHeadingRow(TablePrintModel *model, int row) const;
> --
> 1.7.11.msysgit.0
>
More information about the subsurface
mailing list