File indexing completed on 2024-12-08 10:27:19

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     layout->addSpacing(layout->spacing());
0055 
0056     QWidget *inputWidget = new QWidget(this);
0057 
0058     QGridLayout *inputWidgetLayout = new QGridLayout(inputWidget);
0059     inputWidgetLayout->setContentsMargins(0, 0, 0, 0);
0060 
0061     QLabel *fileLabel = new QLabel(i18n("File:"), inputWidget);
0062     m_fileInput = new KUrlRequester(QUrl::fromLocalFile(QDir::homePath() + QDir::separator()), inputWidget);
0063     m_fileInput->setMode(KFile::File | KFile::LocalOnly | KFile::ExistingOnly);
0064     connect(m_fileInput, &KUrlComboRequester::textChanged, this, &Smb4KPrintDialog::slotUrlChanged);
0065 
0066     inputWidgetLayout->addWidget(fileLabel, 0, 0);
0067     inputWidgetLayout->addWidget(m_fileInput, 0, 1);
0068 
0069     QLabel *copiesLabel = new QLabel(i18n("Copies:"), inputWidget);
0070     m_copiesInput = new QSpinBox(inputWidget);
0071     m_copiesInput->setValue(1);
0072     m_copiesInput->setMinimum(1);
0073     connect(m_copiesInput, &QSpinBox::valueChanged, this, &Smb4KPrintDialog::slotCopiesChanged);
0074 
0075     inputWidgetLayout->addWidget(copiesLabel, 1, 0);
0076     inputWidgetLayout->addWidget(m_copiesInput, 1, 1);
0077 
0078     layout->addWidget(inputWidget);
0079 
0080     QDialogButtonBox *buttonBox = new QDialogButtonBox(this);
0081 
0082     m_cancelButton = buttonBox->addButton(QDialogButtonBox::Cancel);
0083     m_cancelButton->setShortcut(QKeySequence::Cancel);
0084     m_cancelButton->setDefault(true);
0085     connect(m_cancelButton, &QPushButton::clicked, this, &Smb4KPrintDialog::reject);
0086 
0087     m_printButton = buttonBox->addButton(i18n("Print"), QDialogButtonBox::ActionRole);
0088     m_printButton->setShortcut(QKeySequence::Print);
0089     m_printButton->setEnabled(false);
0090     connect(m_printButton, &QPushButton::clicked, this, &Smb4KPrintDialog::slotPrintFile);
0091 
0092     layout->addWidget(buttonBox);
0093 
0094     setMinimumWidth(sizeHint().width() > 350 ? sizeHint().width() : 350);
0095 
0096     create();
0097 
0098     KConfigGroup dialogGroup(Smb4KSettings::self()->config(), QStringLiteral("PrintDialog"));
0099     QSize dialogSize;
0100 
0101     // FIXME: Insert completion objects?
0102 
0103     if (dialogGroup.exists()) {
0104         KWindowConfig::restoreWindowSize(windowHandle(), dialogGroup);
0105         dialogSize = windowHandle()->size();
0106     } else {
0107         dialogSize = sizeHint();
0108     }
0109 
0110     resize(dialogSize); // workaround for QTBUG-40584
0111 }
0112 
0113 Smb4KPrintDialog::~Smb4KPrintDialog()
0114 {
0115 }
0116 
0117 bool Smb4KPrintDialog::setPrinterShare(SharePtr printer)
0118 {
0119     if (!printer->isPrinter()) {
0120         return false;
0121     }
0122 
0123     m_descriptionText->setText(i18n("Print a file to printer <b>%1</b>.", printer->displayString()));
0124 
0125     m_printer = printer;
0126 
0127     return true;
0128 }
0129 
0130 void Smb4KPrintDialog::enablePrintButton()
0131 {
0132     QUrl pathUrl = m_fileInput->url();
0133     int copies = m_copiesInput->value();
0134 
0135     m_printButton->setEnabled(pathUrl.isValid() && copies > 0);
0136 }
0137 
0138 void Smb4KPrintDialog::slotPrintFile()
0139 {
0140     Smb4KClient::self()->printFile(m_printer, KFileItem(m_fileInput->url()), m_copiesInput->value());
0141 
0142     KConfigGroup dialogGroup(Smb4KSettings::self()->config(), QStringLiteral("PrintDialog"));
0143     KWindowConfig::saveWindowSize(windowHandle(), dialogGroup);
0144 
0145     // FIXME: Save completion objects?
0146 
0147     accept();
0148 }
0149 
0150 void Smb4KPrintDialog::slotUrlChanged(const QString &path)
0151 {
0152     Q_UNUSED(path)
0153     enablePrintButton();
0154 }
0155 
0156 void Smb4KPrintDialog::slotCopiesChanged(int copies)
0157 {
0158     Q_UNUSED(copies)
0159     enablePrintButton();
0160 }