KD Reports API Documentation 2.2
Loading...
Searching...
No Matches
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 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
6**
7** SPDX-License-Identifier: MIT
8**
9****************************************************************************/
10
14#include "KDReportsReport.h"
15#include "KDReportsReport_p.h"
17
18#include <QDialogButtonBox>
19#include <QFileDialog>
20#include <QInputDialog>
21#include <QMessageBox>
22#include <QPushButton>
23#include <QVBoxLayout>
24
25class KDReports::PreviewDialogPrivate
26{
27public:
28 PreviewDialogPrivate(KDReports::PreviewDialog *q)
29 : q(q)
30 , m_previewWidget(nullptr)
31 , m_buttonBox(nullptr)
32 , m_quickPrintButton(nullptr)
33 , m_dirBrowsingEnabled(true)
34 {
35 }
36
37 void slotTableBreakingDialog() const;
38 void slotPrintWithDialog() const;
39 void slotQuickPrint() const;
40 void slotSave();
41
43 KDReports::PreviewWidget *m_previewWidget;
44 QDialogButtonBox *m_buttonBox;
45 QPushButton *m_quickPrintButton;
46 QString m_quickPrinterName;
47 QString m_defaultSaveDirectory;
48 QString m_savedFileName;
49 bool m_dirBrowsingEnabled;
50};
51
53 : QDialog(parent)
54 , d(new PreviewDialogPrivate(this))
55{
56 d->m_previewWidget = new KDReports::PreviewWidget(this);
57 d->m_previewWidget->setReport(report);
58 auto *topLayout = new QVBoxLayout(this);
59 topLayout->addWidget(d->m_previewWidget);
60 auto *bottomLayout = new QHBoxLayout();
61 topLayout->addLayout(bottomLayout);
62
63 connect(d->m_previewWidget, &KDReports::PreviewWidget::tableSettingsClicked, this, [this]() { d->slotTableBreakingDialog(); });
65
66 d->m_buttonBox = new QDialogButtonBox(Qt::Horizontal, this);
67 bottomLayout->addWidget(d->m_buttonBox);
68
69 auto *printWithDialogButton = new QPushButton(tr("&Print..."), this);
70 d->m_buttonBox->addButton(printWithDialogButton, QDialogButtonBox::ActionRole);
71 connect(printWithDialogButton, &QPushButton::clicked, this, [this]() { d->slotPrintWithDialog(); });
72
73 d->m_quickPrintButton = new QPushButton(this); // create it here for the ordering
74 d->m_buttonBox->addButton(d->m_quickPrintButton, QDialogButtonBox::ActionRole);
75
76 auto *saveButton = new QPushButton(tr("&Save..."), this);
77 d->m_buttonBox->addButton(saveButton, QDialogButtonBox::ActionRole);
78 connect(saveButton, &QPushButton::clicked, this, [this]() { d->slotSave(); });
79
80 auto *cancelButton = new QPushButton(tr("Cancel"), this);
81 d->m_buttonBox->addButton(cancelButton, QDialogButtonBox::RejectRole);
82 connect(cancelButton, &QPushButton::clicked, this, &QDialog::reject);
83
84 d->m_quickPrintButton->hide();
85}
86
90
92{
93 if (!printerName.isEmpty()) {
94 // QPrinter::setPrinterName has no effect on the QPrintDialog which uses the CUPS default printer anyway...
95 // So we only use this for the separate Print button.
96 // This is why it's not called setDefaultPrinterName.
97 d->m_quickPrinterName = printerName;
98 d->m_quickPrintButton->setText(tr("Print &with %1").arg(printerName));
99 d->m_quickPrintButton->show();
100 connect(d->m_quickPrintButton, &QPushButton::clicked, this, [this]() { d->slotQuickPrint(); });
101 }
102}
103
105{
106 d->m_defaultSaveDirectory = path;
107}
108
110{
111 d->m_dirBrowsingEnabled = allowed;
112}
113
119
120void KDReports::PreviewDialogPrivate::slotTableBreakingDialog() const
121{
122 if (q->showTableSettingsDialog(m_previewWidget->report())) {
123 m_previewWidget->repaint();
124 }
125}
126
127void KDReports::PreviewDialogPrivate::slotPrintWithDialog() const
128{
129 if (m_previewWidget->printWithDialog()) {
131 q->accept();
132 }
133}
134
135void KDReports::PreviewDialogPrivate::slotQuickPrint() const
136{
137 KDReports::Report *report = m_previewWidget->report();
138 QPrinter printer;
139 report->setupPrinter(&printer);
140 printer.setPrinterName(m_quickPrinterName);
141 report->print(&printer, q);
143 q->accept();
144}
145
146void KDReports::PreviewDialogPrivate::slotSave()
147{
148 KDReports::Report *report = m_previewWidget->report();
149 QString file;
150 if (m_dirBrowsingEnabled) {
151 file = QFileDialog::getSaveFileName(q, PreviewDialog::tr("Save Report as PDF"),
152 m_defaultSaveDirectory, PreviewDialog::tr("PDF Files (*.pdf)"));
153 } else {
154 bool ok;
155 Q_FOREVER
156 {
157 const QString text = PreviewDialog::tr("Saving as PDF in %1\n\nEnter the file name:").arg(m_defaultSaveDirectory);
158 QString fileName = QInputDialog::getText(q, PreviewDialog::tr("Save Report as PDF"), text, QLineEdit::Normal, report->documentName() + QStringLiteral(".pdf"), &ok);
159 if (!fileName.endsWith(QLatin1String(".pdf"), Qt::CaseInsensitive)) {
160 fileName += QLatin1String(".pdf");
161 }
162 if (!ok || fileName.isEmpty())
163 return;
164 file = m_defaultSaveDirectory + QLatin1Char('/') + fileName;
165 if (QFile::exists(file)) {
166 const QString msg = PreviewDialog::tr("%1 already exists. Do you want to replace it?").arg(fileName);
168 break; // overwrite
169 }
170 } else {
171 // All OK
172 break;
173 }
174 }
175 }
176 if (!file.isEmpty()) {
177 QPrinter printer;
178 report->setupPrinter(&printer);
180 printer.setOutputFileName(file);
181 m_savedFileName = file;
182 report->print(&printer, q);
183 if (QFile::exists(file)) {
185 } else {
187 }
188 q->accept();
189 }
190}
191
193{
194 d->m_previewWidget->setPageSizeChangeAllowed(b);
195}
196
198{
199 d->m_previewWidget->setShowTableSettingsDialog(b);
200}
201
203{
204 d->m_previewWidget->setWidthForEndlessPrinter(widthMM);
205}
206
207bool KDReports::PreviewDialog::isSelected(int pageNumber) const
208{
209 return d->m_previewWidget->isSelected(pageNumber);
210}
211
216
221
223{
224 return d->m_previewWidget;
225}
226
228{
229 return d->m_savedFileName;
230}
virtual bool showTableSettingsDialog(KDReports::Report *report)
KDReports::PreviewWidget * previewWidget()
void setWidthForEndlessPrinter(qreal widthMM)
PreviewDialog(KDReports::Report *report, QWidget *parent=nullptr)
void linkActivated(const QUrl &url)
bool isSelected(int pageNumber) const
void setDirectoryBrowsingEnabled(bool allowed)
void accept() override
Reimplemented for internal purposes. .
void reject() override
Reimplemented for internal purposes. .
void setDefaultSaveDirectory(const QString &path)
void setQuickPrinterName(const QString &printerName)
void tableSettingsClicked()
Emitted when the table settings button has been clicked.
void linkActivated(const QUrl &url)
bool print(QPrinter *printer, QWidget *parent=nullptr)
void clicked(bool checked)
virtual void accept()
virtual int exec()
virtual void reject()
bool exists() const const
QString getSaveFileName(QWidget *parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedFilter, QFileDialog::Options options)
QString getText(QWidget *parent, const QString &title, const QString &label, QLineEdit::EchoMode mode, const QString &text, bool *ok, Qt::WindowFlags flags, Qt::InputMethodHints inputMethodHints)
QMessageBox::StandardButton warning(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton)
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QString tr(const char *sourceText, const char *disambiguation, int n)
void setOutputFileName(const QString &fileName)
void setOutputFormat(QPrinter::OutputFormat format)
void setPrinterName(const QString &name)
QString arg(qlonglong a, int fieldWidth, int base, QChar fillChar) const const
bool endsWith(const QString &s, Qt::CaseSensitivity cs) const const
bool isEmpty() const const
CaseInsensitive
Horizontal

© 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 Wed Apr 24 2024 04:08:14 for KD Reports API Documentation by doxygen 1.9.8