KD Reports API Documentation  2.0
KDReportsPreviewDialog.cpp
Go to the documentation of this file.
1 /****************************************************************************
2 **
3 ** This file is part of the KD Reports library.
4 **
5 ** SPDX-FileCopyrightText: 2007-2022 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
6 **
7 ** SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDAB-KDReports OR LicenseRef-KDAB-KDReports-US
8 **
9 ** Licensees holding valid commercial KD Reports licenses may use this file in
10 ** accordance with the KD Reports Commercial License Agreement provided with
11 ** the Software.
12 **
13 ** Contact info@kdab.com if any conditions of this licensing are not clear to you.
14 **
15 ****************************************************************************/
16 
17 #include "KDReportsPreviewDialog.h"
19 #include "KDReportsPreviewWidget.h"
20 #include "KDReportsReport.h"
21 #include "KDReportsReport_p.h"
23 
24 #include <QDialogButtonBox>
25 #include <QFileDialog>
26 #include <QInputDialog>
27 #include <QMessageBox>
28 #include <QPushButton>
29 #include <QVBoxLayout>
30 
31 class KDReports::PreviewDialogPrivate
32 {
33 public:
34  PreviewDialogPrivate(KDReports::PreviewDialog *q)
35  : q(q)
36  , m_previewWidget(nullptr)
37  , m_buttonBox(nullptr)
38  , m_quickPrintButton(nullptr)
39  , m_dirBrowsingEnabled(true)
40  {
41  }
42 
43  void slotTableBreakingDialog() const;
44  void slotPrintWithDialog() const;
45  void slotQuickPrint() const;
46  void slotSave();
47 
49  KDReports::PreviewWidget *m_previewWidget;
50  QDialogButtonBox *m_buttonBox;
51  QPushButton *m_quickPrintButton;
52  QString m_quickPrinterName;
53  QString m_defaultSaveDirectory;
54  QString m_savedFileName;
55  bool m_dirBrowsingEnabled;
56 };
57 
59  : QDialog(parent)
60  , d(new PreviewDialogPrivate(this))
61 {
62  d->m_previewWidget = new KDReports::PreviewWidget(this);
63  d->m_previewWidget->setReport(report);
64  auto *topLayout = new QVBoxLayout(this);
65  topLayout->addWidget(d->m_previewWidget);
66  auto *bottomLayout = new QHBoxLayout();
67  topLayout->addLayout(bottomLayout);
68 
69  connect(d->m_previewWidget, &KDReports::PreviewWidget::tableSettingsClicked, this, [this]() { d->slotTableBreakingDialog(); } );
71 
72  d->m_buttonBox = new QDialogButtonBox(Qt::Horizontal, this);
73  bottomLayout->addWidget(d->m_buttonBox);
74 
75  auto *printWithDialogButton = new QPushButton(tr("&Print..."), this);
76  d->m_buttonBox->addButton(printWithDialogButton, QDialogButtonBox::ActionRole);
77  connect(printWithDialogButton, &QPushButton::clicked, this, [this]() { d->slotPrintWithDialog(); } );
78 
79  d->m_quickPrintButton = new QPushButton(this); // create it here for the ordering
80  d->m_buttonBox->addButton(d->m_quickPrintButton, QDialogButtonBox::ActionRole);
81 
82  auto *saveButton = new QPushButton(tr("&Save..."), this);
83  d->m_buttonBox->addButton(saveButton, QDialogButtonBox::ActionRole);
84  connect(saveButton, &QPushButton::clicked, this, [this]() { d->slotSave(); } );
85 
86  auto *cancelButton = new QPushButton(tr("Cancel"), this);
87  d->m_buttonBox->addButton(cancelButton, QDialogButtonBox::RejectRole);
88  connect(cancelButton, &QPushButton::clicked, this, &QDialog::reject);
89 
90  d->m_quickPrintButton->hide();
91 }
92 
94 {
95  delete d;
96 }
97 
98 void KDReports::PreviewDialog::setQuickPrinterName(const QString &printerName)
99 {
100  if (!printerName.isEmpty()) {
101  // QPrinter::setPrinterName has no effect on the QPrintDialog which uses the CUPS default printer anyway...
102  // So we only use this for the separate Print button.
103  // This is why it's not called setDefaultPrinterName.
104  d->m_quickPrinterName = printerName;
105  d->m_quickPrintButton->setText(tr("Print &with %1").arg(printerName));
106  d->m_quickPrintButton->show();
107  connect(d->m_quickPrintButton, &QPushButton::clicked, this, [this]() { d->slotQuickPrint(); } );
108  }
109 }
110 
112 {
113  d->m_defaultSaveDirectory = path;
114 }
115 
117 {
118  d->m_dirBrowsingEnabled = allowed;
119 }
120 
122 {
124  return dialog.exec();
125 }
126 
127 void KDReports::PreviewDialogPrivate::slotTableBreakingDialog() const
128 {
129  if (q->showTableSettingsDialog(m_previewWidget->report())) {
130  m_previewWidget->repaint();
131  }
132 }
133 
134 void KDReports::PreviewDialogPrivate::slotPrintWithDialog() const
135 {
136  if (m_previewWidget->printWithDialog()) {
137  q->setResult(KDReports::PreviewDialog::Printed);
138  q->accept();
139  }
140 }
141 
142 void KDReports::PreviewDialogPrivate::slotQuickPrint() const
143 {
144  KDReports::Report *report = m_previewWidget->report();
145  QPrinter printer;
146  report->setupPrinter(&printer);
147  printer.setPrinterName(m_quickPrinterName);
148  report->print(&printer, q);
149  q->setResult(KDReports::PreviewDialog::Printed);
150  q->accept();
151 }
152 
153 void KDReports::PreviewDialogPrivate::slotSave()
154 {
155  KDReports::Report *report = m_previewWidget->report();
156  QString file;
157  if (m_dirBrowsingEnabled) {
158  file = QFileDialog::getSaveFileName(q, PreviewDialog::tr("Save Report as PDF"),
159  m_defaultSaveDirectory, PreviewDialog::tr("PDF Files (*.pdf)"));
160  } else {
161  bool ok;
162  Q_FOREVER {
163  const QString text = PreviewDialog::tr("Saving as PDF in %1\n\nEnter the file name:").arg(m_defaultSaveDirectory);
164  QString fileName = QInputDialog::getText(q, PreviewDialog::tr("Save Report as PDF"), text, QLineEdit::Normal, report->documentName() + QStringLiteral(".pdf"), &ok);
165  if (!fileName.endsWith(QLatin1String(".pdf"), Qt::CaseInsensitive)) {
166  fileName += QLatin1String(".pdf");
167  }
168  if (!ok || fileName.isEmpty())
169  return;
170  file = m_defaultSaveDirectory + QLatin1Char('/') + fileName;
171  if (QFile::exists(file)) {
172  const QString msg = PreviewDialog::tr("%1 already exists. Do you want to replace it?").arg(fileName);
173  if (QMessageBox::warning(q, PreviewDialog::tr("Overwrite?"), msg, QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) {
174  break; // overwrite
175  }
176  } else {
177  // All OK
178  break;
179  }
180  }
181  }
182  if (!file.isEmpty()) {
183  QPrinter printer;
184  report->setupPrinter(&printer);
185  printer.setOutputFormat(QPrinter::PdfFormat);
186  printer.setOutputFileName(file);
187  m_savedFileName = file;
188  report->print(&printer, q);
189  if (QFile::exists(file)) {
191  } else {
193  }
194  q->accept();
195  }
196 }
197 
199 {
200  d->m_previewWidget->setPageSizeChangeAllowed(b);
201 }
202 
204 {
205  d->m_previewWidget->setShowTableSettingsDialog(b);
206 }
207 
209 {
210  d->m_previewWidget->setWidthForEndlessPrinter(widthMM);
211 }
212 
213 bool KDReports::PreviewDialog::isSelected(int pageNumber) const
214 {
215  return d->m_previewWidget->isSelected(pageNumber);
216 }
217 
219 {
220  QDialog::accept();
221 }
222 
224 {
225  QDialog::reject();
226 }
227 
229 {
230  return d->m_previewWidget;
231 }
232 
234 {
235  return d->m_savedFileName;
236 }
KDReports::PreviewDialog::setDefaultSaveDirectory
void setDefaultSaveDirectory(const QString &path)
Definition: KDReportsPreviewDialog.cpp:111
KDReports::PreviewDialog
Definition: KDReportsPreviewDialog.h:47
KDReportsReport_p.h
KDReports::PreviewWidget
Definition: KDReportsPreviewWidget.h:48
KDReports::Report::print
bool print(QPrinter *printer, QWidget *parent=nullptr)
Definition: KDReportsReport.cpp:687
KDReports::PreviewDialog::setPageSizeChangeAllowed
void setPageSizeChangeAllowed(bool b)
Definition: KDReportsPreviewDialog.cpp:198
KDReports::PreviewDialog::isSelected
bool isSelected(int pageNumber) const
Definition: KDReportsPreviewDialog.cpp:213
KDReports::PreviewDialog::PreviewDialog
PreviewDialog(KDReports::Report *report, QWidget *parent=nullptr)
Definition: KDReportsPreviewDialog.cpp:58
KDReports::PreviewWidget::tableSettingsClicked
void tableSettingsClicked()
Emitted when the table settings button has been clicked.
KDReports::PreviewDialog::SavedSuccessfully
@ SavedSuccessfully
Definition: KDReportsPreviewDialog.h:135
KDReports::PreviewDialog::linkActivated
void linkActivated(const QUrl &url)
KDReports::Report
Definition: KDReportsReport.h:80
KDReports::Report::documentName
QString documentName
Definition: KDReportsReport.h:83
KDReportsPreviewDialog.h
KDReports::PreviewDialog::SaveError
@ SaveError
Definition: KDReportsPreviewDialog.h:136
KDReportsReport.h
KDReports::PreviewDialog::setDirectoryBrowsingEnabled
void setDirectoryBrowsingEnabled(bool allowed)
Definition: KDReportsPreviewDialog.cpp:116
KDReports::PreviewDialog::savedFileName
QString savedFileName() const
Definition: KDReportsPreviewDialog.cpp:233
KDReports::PreviewDialog::setWidthForEndlessPrinter
void setWidthForEndlessPrinter(qreal widthMM)
Definition: KDReportsPreviewDialog.cpp:208
KDReports::PreviewDialog::showTableSettingsDialog
virtual bool showTableSettingsDialog(KDReports::Report *report)
Definition: KDReportsPreviewDialog.cpp:121
KDReports::PreviewDialog::~PreviewDialog
~PreviewDialog() override
Definition: KDReportsPreviewDialog.cpp:93
KDReportsPreviewWidget.h
KDReports::PreviewDialog::setQuickPrinterName
void setQuickPrinterName(const QString &printerName)
Definition: KDReportsPreviewDialog.cpp:98
KDReportsLayoutHelper_p.h
KDReports::PreviewDialog::accept
void accept() override
Reimplemented for internal purposes. .
Definition: KDReportsPreviewDialog.cpp:218
KDReports::PreviewDialog::Printed
@ Printed
Definition: KDReportsPreviewDialog.h:134
KDReports::PreviewDialog::setShowTableSettingsDialog
void setShowTableSettingsDialog(bool b)
Definition: KDReportsPreviewDialog.cpp:203
KDReports::PreviewDialog::previewWidget
KDReports::PreviewWidget * previewWidget()
Definition: KDReportsPreviewDialog.cpp:228
KDReports::TableBreakingSettingsDialog
Definition: KDReportsTableBreakingSettingsDialog.h:51
KDReports::PreviewDialog::reject
void reject() override
Reimplemented for internal purposes. .
Definition: KDReportsPreviewDialog.cpp:223
KDReportsTableBreakingSettingsDialog.h
KDReports::PreviewWidget::linkActivated
void linkActivated(const QUrl &url)

© 2007-2021 Klarälvdalens Datakonsult AB (KDAB)
"The Qt, C++ and OpenGL Experts"
https://www.kdab.com/
https://www.kdab.com/development-resources/qt-tools/kd-reports/
Generated on Sat Jan 8 2022 02:38:32 for KD Reports API Documentation by doxygen 1.8.17