[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