Mercurial > hg > syntilista
diff src/main.cpp @ 157:325e7590f93e
Move most of the printing related code to printing.cpp
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Tue, 12 Sep 2017 15:56:40 +0300 |
parents | afadc1380fb1 |
children | d9b9be9c4788 |
line wrap: on
line diff
--- a/src/main.cpp Fri Sep 08 03:22:54 2017 +0300 +++ b/src/main.cpp Tue Sep 12 15:56:40 2017 +0300 @@ -9,8 +9,6 @@ #include <QApplication> #include <QMessageBox> #include <QSettings> -#include <QPrintDialog> -#include <QPrintPreviewDialog> #include <QStandardPaths> #include "main.h" #include "ui_mainwindow.h" @@ -131,7 +129,7 @@ // report it to stdout if so. Return "false" if error has occured, // true otherwise. // -bool slCheckAndReportSQLError(const QString where, const QSqlError &err, bool report = false) +bool slCheckAndReportSQLError(const QString where, const QSqlError &err, bool report) { if (err.isValid()) { @@ -784,235 +782,6 @@ } -void SyntilistaMainWindow::on_button_Print_clicked() -{ - // Create a printer object and force some basic settings - QPrinter printer(QPrinter::HighResolution); - printer.setPageSize(QPageSize(QPageSize::A4)); - printer.setColorMode(QPrinter::GrayScale); - printer.setResolution(300); - - // We need to get the page count here, and also need it again in - // printDocument(), but there is no sane way to pass that there, - // so some code duplication is unfortunately necessary - SLPageInfo pinfo; - pinfo.npages = 0; - pinfo.nlinesPerPage = 0; - - QPixmap tmpPixmap(1000, 1300); - QPainter tmpPainter; - tmpPainter.begin(&tmpPixmap); - bool ret = printDocumentPage(pinfo, true, -1, &tmpPainter, &printer); - tmpPainter.end(); - - if (!ret) - { - // Some kind of error occured - return; - } - - - // Set available pages - printer.setFromTo(1, pinfo.npages); - - // Create print preview dialog and show it - QPrintPreviewDialog preview(&printer, this); - preview.setWindowModality(Qt::ApplicationModal); - preview.setSizeGripEnabled(true); - - connect( - &preview, - SIGNAL(paintRequested(QPrinter *)), - this, - SLOT(printDocument(QPrinter *))); - - preview.exec(); -} - - -void SyntilistaMainWindow::printDocument(QPrinter *printer) -{ - // Create progress dialog - QProgressDialog progress( - tr("Tulostetaan ..."), - tr("Peruuta"), - 0, - 1, - this); - - progress.setWindowModality(Qt::ApplicationModal); - - // Again, get the page info here .. we need the number of lines per page - SLPageInfo pinfo; - pinfo.npages = 0; - pinfo.nlinesPerPage = 0; - - QPixmap tmpPixmap(1000, 1300); - QPainter tmpPainter; - tmpPainter.begin(&tmpPixmap); - bool ret = printDocumentPage(pinfo, true, -1, &tmpPainter, printer); - tmpPainter.end(); - - if (!ret) - return; - - // If from and to are 0, we are supposed to print all pages - if (printer->fromPage() == 0 && printer->toPage() == 0) - printer->setFromTo(1, pinfo.npages); - - // Setup rest of the progress dialog here - progress.setMinimum(printer->fromPage() - 1); - progress.setMaximum(printer->toPage()); - - // Begin painting to the printer (or preview) - QPainter painter; - painter.begin(printer); - - bool firstPage = true; - for (int page = printer->fromPage(); page <= printer->toPage(); page++) - { - if (!firstPage) - printer->newPage(); - - qApp->processEvents(); - if (progress.wasCanceled()) - break; - - printDocumentPage(pinfo, false, page, &painter, printer); - progress.setValue(page); - firstPage = false; - } - - painter.end(); -} - - -bool SyntilistaMainWindow::printDocumentPage(SLPageInfo &pinfo, const bool getPageInfo, const int npage, QPainter *pt, QPrinter *printer) -{ - // Form the SQL query for list of users - QString querystr = QStringLiteral( - "SELECT id,first_name,last_name,extra_info,added,updated, " - "(SELECT TOTAL(value) FROM transactions WHERE transactions.person=people.id) AS balance " - "FROM people ORDER BY last_name ASC,first_name ASC"); - - // If we are fetching page info, we need to process all entries - if (!getPageInfo) - { - // Otherwise we can limit to given page number - querystr += QStringLiteral(" LIMIT %1 OFFSET %2"). - arg(pinfo.nlinesPerPage). - arg((npage - 1) * pinfo.nlinesPerPage); - } - - QSqlQuery query; - query.prepare(querystr); - query.setForwardOnly(true); - query.exec(); - - if (!slCheckAndReportSQLError("printDocumentPage()", query.lastError())) - { - slErrorMsg( - tr("SQL-tietokantavirhe"), - tr("Tietokantaa selattaessa tapahtui virhe.")); - - return false; - } - - pt->save(); - if (!getPageInfo) - { - pt->scale( - printer->pageRect().width() / 1000.0f, - printer->pageRect().height() / 1300.0f); - } - - QFont font1("Arial", 5); - SLDrawContext ctx(pt); - ctx.setFont(font1); - - int nline = 0; - while (query.next()) - { - PersonInfo info; - slGetPersonInfoRec(query, info); - - // Check for end of page - // KLUDGE for now - if (getPageInfo && ctx.lfq(10) >= 1300.0f) - { - if (nline > pinfo.nlinesPerPage) - pinfo.nlinesPerPage = nline; - - pinfo.npages++; - nline = 0; - } - - if (nline == 0) - { - // If we are at the start of the page, we shall draw a header - pt->setBrush(QBrush(Qt::black)); - pt->setPen(QPen(Qt::black, 3, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); - - ctx.setPos(0, 0); - ctx.drawText( 5, 180, tr("Etunimi")); - ctx.drawText( 200, 230, tr("Sukunimi")); - ctx.drawText( 450, 190, tr("Lisätty")); - ctx.drawText( 650, 190, tr("Päivitetty")); - ctx.drawText( 870, 120, tr("Tase")); - ctx.lf(); - - pt->drawLine(0, ctx.m_pos.y(), 1000, ctx.m_pos.y()); - - ctx.move(0, 5); - } - - // Draw a gray bar under every second line - if (nline % 2 == 0) - { - pt->fillRect( - 0, - ctx.m_pos.y() - 1, - 1000, - ctx.boundRect().height() + 4, - QColor(0, 0, 0, 40)); - } - - ctx.drawText( 5, 180, info.firstName); - ctx.drawText( 200, 230, info.lastName); - ctx.drawText( 450, 190, slDateTimeToStr(info.added)); - ctx.drawText( 650, 190, slDateTimeToStr(info.updated)); - ctx.drawText( 870, 120, slMoneyValueToStr(info.balance), Qt::AlignRight); - - ctx.lf(10); - nline++; - } - - query.finish(); - - if (getPageInfo) - { - if (nline > pinfo.nlinesPerPage) - pinfo.nlinesPerPage = nline; - - pinfo.npages++; - } - else - { - ctx.setPos(0, 1240); - ctx.drawText(0, 1000, - tr("Sivu %1 / %2 (%3 / %4)"). - arg(npage - printer->fromPage() + 1). - arg(printer->toPage() - printer->fromPage() + 1). - arg(npage). - arg(printer->toPage()), - Qt::AlignHCenter); - } - - pt->restore(); - return true; -} - - void SyntilistaMainWindow::on_button_DeletePerson_clicked() { if (currPerson.id <= 0)