[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