File indexing completed on 2023-12-03 05:04:27

0001 /*
0002  *  Print dialog
0003  *
0004  *  SPDX-FileCopyrightText: 2023 Alexander Reinholdt <alexander.reinholdt@kdemail.net>
0005  *  SPDX-License-Identifier: GPL-2.0-or-later
0006  */
0007 
0008 // application specific includes
0009 #include "smb4kprintdialog.h"
0010 #include "core/smb4kclient.h"
0011 #include "core/smb4ksettings.h"
0012 
0013 // Qt includes
0014 #include <QDialogButtonBox>
0015 #include <QDir>
0016 #include <QVBoxLayout>
0017 #include <QWindow>
0018 
0019 // KDE includes
0020 #include <KConfigGroup>
0021 #include <KFileItem>
0022 #include <KIconLoader>
0023 #include <KLocalizedString>
0024 #include <KWindowConfig>
0025 
0026 Smb4KPrintDialog::Smb4KPrintDialog(QWidget *parent)
0027     : QDialog(parent)
0028 {
0029     setWindowTitle(i18n("Print Dialog"));
0030     setAttribute(Qt::WA_DeleteOnClose, true);
0031 
0032     QVBoxLayout *layout = new QVBoxLayout(this);
0033 
0034     QWidget *descriptionWidget = new QWidget(this);
0035 
0036     QHBoxLayout *descriptionWidgetLayout = new QHBoxLayout(descriptionWidget);
0037 
0038     QLabel *descriptionPixmap = new QLabel(descriptionWidget);
0039     descriptionPixmap->setPixmap(KDE::icon(QStringLiteral("printer")).pixmap(KIconLoader::SizeHuge));
0040     descriptionPixmap->setAlignment(Qt::AlignBottom);
0041     descriptionPixmap->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
0042 
0043     descriptionWidgetLayout->addWidget(descriptionPixmap);
0044 
0045     m_descriptionText = new QLabel(this);
0046     m_descriptionText->setText(i18n("Print a file."));
0047     m_descriptionText->setWordWrap(true);
0048     m_descriptionText->setAlignment(Qt::AlignBottom);
0049     m_descriptionText->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
0050 
0051     descriptionWidgetLayout->addWidget(m_descriptionText);
0052 
0053     layout->addWidget(descriptionWidget);
0054 
0055     QWidget *inputWidget = new QWidget(this);
0056 
0057     QGridLayout *inputWidgetLayout = new QGridLayout(inputWidget);
0058     inputWidgetLayout->setContentsMargins(0, 0, 0, 0);
0059 
0060     QLabel *fileLabel = new QLabel(i18n("File:"), inputWidget);
0061     m_fileInput = new KUrlRequester(QUrl::fromLocalFile(QDir::homePath() + QDir::separator()), inputWidget);
0062     m_fileInput->setMode(KFile::File | KFile::LocalOnly | KFile::ExistingOnly);
0063     connect(m_fileInput, &KUrlComboRequester::textChanged, this, &Smb4KPrintDialog::slotUrlChanged);
0064 
0065     inputWidgetLayout->addWidget(fileLabel, 0, 0);
0066     inputWidgetLayout->addWidget(m_fileInput, 0, 1);
0067 
0068     QLabel *copiesLabel = new QLabel(i18n("Copies:"), inputWidget);
0069     m_copiesInput = new QSpinBox(inputWidget);
0070     m_copiesInput->setValue(1);
0071     m_copiesInput->setMinimum(1);
0072     connect(m_copiesInput, &QSpinBox::valueChanged, this, &Smb4KPrintDialog::slotCopiesChanged);
0073 
0074     inputWidgetLayout->addWidget(copiesLabel, 1, 0);
0075     inputWidgetLayout->addWidget(m_copiesInput, 1, 1);
0076 
0077     layout->addWidget(inputWidget);
0078 
0079     QDialogButtonBox *buttonBox = new QDialogButtonBox(this);
0080 
0081     m_cancelButton = buttonBox->addButton(QDialogButtonBox::Cancel);
0082     m_cancelButton->setShortcut(QKeySequence::Cancel);
0083     m_cancelButton->setDefault(true);
0084     connect(m_cancelButton, &QPushButton::clicked, this, &Smb4KPrintDialog::reject);
0085 
0086     m_printButton = buttonBox->addButton(i18n("Print"), QDialogButtonBox::ActionRole);
0087     m_printButton->setShortcut(QKeySequence::Print);
0088     m_printButton->setEnabled(false);
0089     connect(m_printButton, &QPushButton::clicked, this, &Smb4KPrintDialog::slotPrintFile);
0090 
0091     layout->addWidget(buttonBox);
0092 
0093     setMinimumWidth(sizeHint().width() > 350 ? sizeHint().width() : 350);
0094 
0095     create();
0096 
0097     KConfigGroup group(Smb4KSettings::self()->config(), "PrintDialog");
0098     QSize dialogSize;
0099 
0100     // FIXME: Insert completion objects?
0101 
0102     if (group.exists()) {
0103         KWindowConfig::restoreWindowSize(windowHandle(), group);
0104         dialogSize = windowHandle()->size();
0105     } else {
0106         dialogSize = sizeHint();
0107     }
0108 
0109     resize(dialogSize); // workaround for QTBUG-40584
0110 }
0111 
0112 Smb4KPrintDialog::~Smb4KPrintDialog()
0113 {
0114 }
0115 
0116 bool Smb4KPrintDialog::setPrinterShare(SharePtr printer)
0117 {
0118     if (!printer->isPrinter()) {
0119         return false;
0120     }
0121 
0122     m_descriptionText->setText(i18n("Print a file to printer <b>%1</b>.", printer->displayString()));
0123 
0124     m_printer = printer;
0125 
0126     return true;
0127 }
0128 
0129 void Smb4KPrintDialog::enablePrintButton()
0130 {
0131     QUrl pathUrl = m_fileInput->url();
0132     int copies = m_copiesInput->value();
0133 
0134     m_printButton->setEnabled(pathUrl.isValid() && copies > 0);
0135 }
0136 
0137 void Smb4KPrintDialog::slotPrintFile()
0138 {
0139     Smb4KClient::self()->printFile(m_printer, KFileItem(m_fileInput->url()), m_copiesInput->value());
0140 
0141     KConfigGroup group(Smb4KSettings::self()->config(), "PrintDialog");
0142     KWindowConfig::saveWindowSize(windowHandle(), group);
0143 
0144     // FIXME: Save completion objects?
0145 
0146     accept();
0147 }
0148 
0149 void Smb4KPrintDialog::slotUrlChanged(const QString &path)
0150 {
0151     Q_UNUSED(path)
0152     enablePrintButton();
0153 }
0154 
0155 void Smb4KPrintDialog::slotCopiesChanged(int copies)
0156 {
0157     Q_UNUSED(copies)
0158     enablePrintButton();
0159 }