[PATCH] Print: provide means for profile layouting

Dirk Hohndel dirk at hohndel.org
Fri Sep 27 08:50:47 UTC 2013


OK. I'll hold off on applying this patch until you send v2

Thanks

/D

On Fri, 2013-09-27 at 18:20 +0300, Lubomir I. Ivanov wrote:
> 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
> >
> _______________________________________________
> subsurface mailing list
> subsurface at hohndel.org
> http://lists.hohndel.org/cgi-bin/mailman/listinfo/subsurface




More information about the subsurface mailing list