17#include <QPrintDialog>
18#include <QProgressDialog>
24#include "ui_previewdialogbase.h"
33class PagePreviewWidget :
public QWidget
43 void setPixmap(
const QPixmap &pixmap)
48 int pixmapWidth()
const
50 return m_pixmap.width();
52 int pixmapHeight()
const
54 return m_pixmap.height();
56 QSize pixmapSize()
const
58 return m_pixmap.size();
66 QPoint pixmapOffset()
const
68 return QPoint((
width() - m_pixmap.width()) / 2, (
height() - m_pixmap.height()) / 2);
75 painter.drawPixmap(pixmapOffset(), m_pixmap);
80 Q_EMIT mouseMoved(ev->
pos() - pixmapOffset());
85 Q_EMIT mouseClicked(ev->
pos() - pixmapOffset());
92class KDReports::PreviewWidgetPrivate :
public Ui::PreviewWidgetBase
101 QPixmap paintPreview(
int index)
const;
102 void printSelectedPages();
103 void setupComboBoxes();
104 void pageCountChanged();
105 void centerPreview();
107 void fillZoomCombo();
108 void updatePageButtons();
109 void updatePreview();
110 void pageNumberReturnPressed();
113 void handleMouseMove(
QPoint pos);
114 void handleMouseRelease(
QPoint pos);
115 void slotCurrentPageChanged();
116 void slotFirstPage();
120 void slotPaperSizeActivated(
int);
121 void slotPaperOrientationActivated(
int);
124 void slotZoomChanged();
125 void previewNextItems();
127 PagePreviewWidget *m_previewWidget;
129 qreal m_zoomFactor = 1.0;
130 qreal m_endlessPrinterWidth = 114.0;
135 int m_firstDirtyPreviewItem = -1;
136 bool m_eatPageNumberClick =
false;
137 bool m_onAnchor =
false;
141 : m_previewWidget(new PagePreviewWidget)
146 handleMouseMove(pos);
149 handleMouseRelease(pos);
153void KDReports::PreviewWidgetPrivate::init()
156 actionBar->setEnabled(
false);
158 m_printer.setFullPage(
true);
163 previewArea->setWidget(m_previewWidget);
165 previewArea->setFocus();
182 auto *nextPageShortcut =
new QShortcut(q);
185 auto *prevPageShortcut =
new QShortcut(q);
188 pageNumber->setValidator(
new QIntValidator(1, 100000, pageNumber));
189 pageNumber->installEventFilter(q);
192void KDReports::PreviewWidgetPrivate::paintItem(
QListWidgetItem *item,
int index)
const
199 const QSizeF paperSize = m_report->paperSize();
200 const qreal longestSide = qMax(paperSize.
width(), paperSize.
height());
201 qreal width = img.width() * paperSize.
width() / longestSide;
202 qreal height = img.height() * paperSize.
height() / longestSide;
204 img.fill(qRgba(0, 0, 0, 0));
207 painter.translate((img.width() - width) / 2, (img.height() - height) / 2);
209 painter.scale(img.width() / longestSide, img.height() / longestSide);
210 m_report->paintPage(index, painter);
211 painter.setPen(
QPen(1));
217void KDReports::PreviewWidgetPrivate::previewNextItems()
219 if (m_firstDirtyPreviewItem == -1 || m_firstDirtyPreviewItem >= m_pageCount) {
220 m_previewTimer.stop();
221 m_firstDirtyPreviewItem = -1;
224 paintItem(pageList->item(m_firstDirtyPreviewItem), m_firstDirtyPreviewItem);
225 ++m_firstDirtyPreviewItem;
229QPixmap KDReports::PreviewWidgetPrivate::paintPreview(
int index)
const
231 const QSizeF paperSize = m_report->paperSize();
232 const int width = qCeil(paperSize.
width() * m_zoomFactor);
233 const int height = qCeil(paperSize.
height() * m_zoomFactor);
244 painter.scale(m_zoomFactor, m_zoomFactor);
245 m_report->paintPage(index, painter);
246 painter.setPen(
QPen(1));
252void KDReports::PreviewWidgetPrivate::handleMouseMove(
QPoint pos)
254 const QPoint unscaledPos = pos / m_zoomFactor;
255 const QString link = m_report->anchorAt(pageList->currentRow(), unscaledPos);
259 }
else if (!m_onAnchor) {
265void KDReports::PreviewWidgetPrivate::handleMouseRelease(
QPoint pos)
267 const QPoint unscaledPos = pos / m_zoomFactor;
268 const QString link = m_report->anchorAt(pageList->currentRow(), unscaledPos);
270 Q_EMIT q->linkActivated(link);
274void KDReports::PreviewWidgetPrivate::printSelectedPages()
278 m_report->setPageSize(m_printer.pageLayout().pageSize());
279 m_report->setPageOrientation(m_printer.pageLayout().orientation());
286 for (
int pageIndex = 0; pageIndex < pageList->count(); ++pageIndex) {
287 if (pageList->item(pageIndex)->checkState() ==
Qt::Checked)
295 painter.
begin(&m_printer);
298 bool firstPage =
true;
299 for (
int pageIndex = 0; pageIndex < m_pageCount; ++pageIndex) {
302 qApp->processEvents();
304 if (dialog.wasCanceled())
307 if (q->isSelected(pageIndex)) {
312 m_report->paintPage(pageIndex, painter);
313 dialog.setValue(++printed);
320void KDReports::PreviewWidgetPrivate::setupComboBoxes()
322 paperSizeCombo->addItem(PreviewWidget::tr(
"A0 (841 x 1189 mm)"),
QPageSize::A0);
323 paperSizeCombo->addItem(PreviewWidget::tr(
"A1 (594 x 841 mm)"),
QPageSize::A1);
324 paperSizeCombo->addItem(PreviewWidget::tr(
"A2 (420 x 594 mm)"),
QPageSize::A2);
325 paperSizeCombo->addItem(PreviewWidget::tr(
"A3 (297 x 420 mm)"),
QPageSize::A3);
326 paperSizeCombo->addItem(PreviewWidget::tr(
"A4 (210 x 297 mm)"),
QPageSize::A4);
327 paperSizeCombo->addItem(PreviewWidget::tr(
"A5 (148 x 210 mm)"),
QPageSize::A5);
328 paperSizeCombo->addItem(PreviewWidget::tr(
"A6 (105 x 148 mm)"),
QPageSize::A6);
329 paperSizeCombo->addItem(PreviewWidget::tr(
"A7 (74 x 105 mm)"),
QPageSize::A7);
330 paperSizeCombo->addItem(PreviewWidget::tr(
"A8 (52 x 74 mm)"),
QPageSize::A8);
332 paperSizeCombo->addItem(PreviewWidget::tr(
"B0 (1000 x 1414 mm)"),
QPageSize::B0);
333 paperSizeCombo->addItem(PreviewWidget::tr(
"B1 (707 x 1000 mm)"),
QPageSize::B1);
334 paperSizeCombo->addItem(PreviewWidget::tr(
"B2 (500 x 707 mm)"),
QPageSize::B2);
335 paperSizeCombo->addItem(PreviewWidget::tr(
"B3 (353 x 500 mm)"),
QPageSize::B3);
336 paperSizeCombo->addItem(PreviewWidget::tr(
"B4 (250 x 353 mm)"),
QPageSize::B4);
337 paperSizeCombo->addItem(PreviewWidget::tr(
"B5 (176 x 250 mm)"),
QPageSize::B5);
338 paperSizeCombo->addItem(PreviewWidget::tr(
"B6 (125 x 176 mm)"),
QPageSize::B6);
339 paperSizeCombo->addItem(PreviewWidget::tr(
"B7 (88 x 125 mm)"),
QPageSize::B7);
340 paperSizeCombo->addItem(PreviewWidget::tr(
"B8 (62 x 88 mm)"),
QPageSize::B8);
343 paperSizeCombo->addItem(PreviewWidget::tr(
"C5E (163 x 229 mm)"),
QPageSize::C5E);
344 paperSizeCombo->addItem(PreviewWidget::tr(
"DLE (110 x 220 mm)"),
QPageSize::DLE);
345 paperSizeCombo->addItem(PreviewWidget::tr(
"Executive (7.5 x 10 inches)"),
QPageSize::Executive);
346 paperSizeCombo->addItem(PreviewWidget::tr(
"Folio (210 x 330 mm)"),
QPageSize::Folio);
347 paperSizeCombo->addItem(PreviewWidget::tr(
"Ledger (432 x 279 mm)"),
QPageSize::Ledger);
348 paperSizeCombo->addItem(PreviewWidget::tr(
"Legal (8.5 x 14 inches)"),
QPageSize::Legal);
349 paperSizeCombo->addItem(PreviewWidget::tr(
"Letter (8.5 x 11 inches)"),
QPageSize::Letter);
350 paperSizeCombo->addItem(PreviewWidget::tr(
"Tabloid (279 x 432 mm)"),
QPageSize::Tabloid);
351 paperSizeCombo->addItem(PreviewWidget::tr(
"US #10 Envelope (105 x 241 mm)"),
QPageSize::Comm10E);
352 paperSizeCombo->addItem(PreviewWidget::tr(
"Endless printer (%1 mm wide)").arg(m_endlessPrinterWidth),
QPageSize::Custom);
358void KDReports::PreviewWidgetPrivate::slotCurrentPageChanged()
364void KDReports::PreviewWidgetPrivate::updatePageButtons()
366 prevPage->setEnabled(pageList->currentRow() > 0);
367 nextPage->setEnabled(pageList->currentRow() < pageList->count() - 1);
371void KDReports::PreviewWidgetPrivate::updatePreview()
373 if (!pageList->currentItem())
375 const QSize oldSize = m_previewWidget->pixmapSize();
376 const QPixmap pixmap = paintPreview(pageList->currentRow());
377 m_previewWidget->setPixmap(pixmap);
378 if (pixmap.
size() != oldSize) {
383void KDReports::PreviewWidgetPrivate::pageNumberReturnPressed()
386 const int newPageNumber = pageNumber->text().toInt(&ok) - 1;
387 if (!ok || newPageNumber < 0 || newPageNumber > pageList->count() - 1)
389 pageList->setCurrentRow(newPageNumber);
392void KDReports::PreviewWidgetPrivate::slotFirstPage()
394 pageList->setCurrentRow(0);
397void KDReports::PreviewWidgetPrivate::slotPrevPage()
399 if (!pageList->currentItem() || pageList->currentRow() == 0)
401 pageList->setCurrentRow(pageList->currentRow() - 1);
404void KDReports::PreviewWidgetPrivate::slotNextPage()
406 if (!pageList->currentItem() || pageList->currentRow() >= pageList->count() - 1)
408 pageList->setCurrentRow(pageList->currentRow() + 1);
411void KDReports::PreviewWidgetPrivate::slotLastPage()
413 if (pageList->count() == 0)
415 pageList->setCurrentRow(pageList->count() - 1);
418void KDReports::PreviewWidgetPrivate::slotPaperSizeActivated(
int index)
421 m_printer.setPageSize(qPageSize);
423 m_report->setWidthForEndlessPrinter(m_endlessPrinterWidth);
425 m_report->setWidthForEndlessPrinter(0);
426 m_report->setPageSize(qPageSize);
429#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
432 emit q->pageSizeChanged(qPageSize);
436void KDReports::PreviewWidgetPrivate::slotPaperOrientationActivated(
int index)
439 m_printer.setPageOrientation(orientation);
440 m_report->setPageOrientation(orientation);
442#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
445 emit q->orientationChanged(orientation);
449void KDReports::PreviewWidgetPrivate::pageCountChanged()
456 m_pageCount = m_report->numberOfPages();
460#if QT_VERSION < QT_VERSION_CHECK(5, 11, 0)
461 int numberWidth = 20 + pageNumber->fontMetrics().width(
QString::number(m_pageCount));
463 int numberWidth = 20 + pageNumber->fontMetrics().horizontalAdvance(
QString::number(m_pageCount));
465 pageNumber->setMinimumWidth(numberWidth);
466 pageNumber->setMaximumWidth(numberWidth);
467 pageCount->setText(QStringLiteral(
" / ") +
QString::number(m_pageCount));
470 int numberOfItems = pageList->count();
471 while (numberOfItems < m_pageCount) {
477 if (pageList->currentRow() >= m_pageCount) {
479 pageList->setCurrentRow(m_pageCount - 1);
481 while (numberOfItems > m_pageCount) {
482 delete pageList->item(numberOfItems - 1);
489 for (
int index = 0; index < m_pageCount; ++index)
490 pageList->item(index)->setIcon(whitePixmap);
492 m_firstDirtyPreviewItem = 0;
494#ifdef PAINT_ALL_PREVIEWS
497 while (m_firstDirtyPreviewItem != -1) {
502 qDebug() << m_pageCount <<
"previews in" << dt.
elapsed() / 1000.0 <<
"s";
504 m_previewTimer.start(0);
510 qApp->restoreOverrideCursor();
513void KDReports::PreviewWidgetPrivate::centerPreview()
517 const QPoint offset( ( previewArea->width() - m_previewWidget->width() ) / 2,
518 ( previewArea->height() - m_previewWidget->height() ) / 2 );
519 qDebug() <<
"Moving to " << offset;
520 m_previewWidget->move( offset );
523 int width = qMax(m_previewWidget->pixmapWidth(), previewArea->viewport()->width());
524 int height = qMax(m_previewWidget->pixmapHeight(), previewArea->viewport()->height());
525 m_previewWidget->resize(width, height);
528void KDReports::PreviewWidgetPrivate::slotZoomIn()
530 if (m_zoomFactor > 1.99)
531 m_zoomFactor = qMin<qreal>(4.0, m_zoomFactor + 0.5);
532 else if (m_zoomFactor > 0.99)
540void KDReports::PreviewWidgetPrivate::slotZoomOut()
542 if (m_zoomFactor > 1.99)
544 else if (m_zoomFactor > 0.99)
546 else if (m_zoomFactor >= 0.2)
552void KDReports::PreviewWidgetPrivate::slotZoomChanged()
554 QString str = zoomCombo->currentText();
559void KDReports::PreviewWidgetPrivate::zoomChanged()
566void KDReports::PreviewWidgetPrivate::fillZoomCombo()
568 static const double s_zoomFactors[] = {0.125, 0.25, 0.333, 0.5, 0.667, 0.75, 1, 1.25, 1.50, 2, 4};
571 bool currentZoomFound =
false;
572 for (
const qreal val : s_zoomFactors) {
573 if (!currentZoomFound && m_zoomFactor <= val - 0.001) {
575 zoomCombo->setCurrentIndex(zoomCombo->count() - 1);
576 currentZoomFound =
true;
579 if (m_zoomFactor > val - 0.001 && m_zoomFactor < val + 0.001) {
580 zoomCombo->setCurrentIndex(zoomCombo->count() - 1);
581 currentZoomFound =
true;
590 , d(new PreviewWidgetPrivate(this))
601 if (pageNumber >= 0 && pageNumber < d->pageList->count())
602 return (d->pageList->item(pageNumber)->checkState() ==
Qt::Checked);
614 d->paperSizeCombo->setVisible(b);
615 d->paperOrientationCombo->setVisible(b);
616 d->labelPaperSize->setVisible(b);
617 d->labelOrientation->setVisible(b);
622 d->tableBreakingButton->setVisible(b);
629 if (obj == d->pageNumber) {
631 auto *keyev =
static_cast<QKeyEvent *
>(ev);
633 d->pageNumberReturnPressed();
635 d->previewArea->setFocus();
639 d->m_eatPageNumberClick =
true;
640 d->pageNumber->selectAll();
642 d->m_eatPageNumberClick =
false;
652 d->m_endlessPrinterWidth = widthMM;
670 for (
int pageIndex = 0; pageIndex < d->pageList->count(); ++pageIndex) {
671 d->pageList->item(pageIndex)->setCheckState(
Qt::Checked);
674 const int fromPage = dialog->fromPage() - 1;
675 const int toPage = dialog->toPage() - 1;
677 for (
int pageIndex = 0; pageIndex < d->pageList->count(); ++pageIndex) {
678 const bool checked = (pageIndex >= fromPage && pageIndex <= toPage);
682 d->printSelectedPages();
691 d->setReport(report);
698 actionBar->setEnabled(
true);
701#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
702 paperSizeCombo->setCurrentIndex(paperSizeCombo->findData(m_report->pageSize()));
704 paperSizeCombo->setCurrentIndex(paperSizeCombo->findData(m_report->pageSize().id()));
706 paperOrientationCombo->setCurrentIndex(paperOrientationCombo->findData(m_report->pageOrientation()));
710 m_report->setupPrinter(&m_printer);
712 if (!pageList->currentItem()) {
714 pageList->setCurrentItem(pageList->item(0));
716 slotCurrentPageChanged();
717 pageList->scrollToTop();
722 d->pageList->setVisible(show);
727 d->pageCountChanged();
728 d->slotCurrentPageChanged();
733 return QSize(800, 600);
736#include "KDReportsPreviewWidget.moc"
void activated(int index)
QEvent::Type type() const const
void setText(const QString &text)
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
virtual bool eventFilter(QObject *watched, QEvent *event)
QObject * parent() const const
QString tr(const char *sourceText, const char *disambiguation, int n)
bool begin(QPaintDevice *device)
QPixmap fromImage(const QImage &image, Qt::ImageConversionFlags flags)
qreal height() const const
qreal width() const const
int indexOf(QChar ch, int from, Qt::CaseSensitivity cs) const const
bool isEmpty() const const
QString number(int n, int base)
QString & remove(int position, int n)
double toDouble(bool *ok) const const
int elapsed() const const