1 /*
2     SPDX-FileCopyrightText: 2010-2018 Daniel Nicoletti <dantti12@gmail.com>
3 
4     SPDX-License-Identifier: GPL-2.0-or-later
5 */
6 
7 #include "PageAddPrinter.h"
8 #include "ui_PageAddPrinter.h"
9 
10 #include <KCupsRequest.h>
11 #include <KLocalizedString>
12 
13 #include <QPainter>
14 #include <QPointer>
15 #include <QRegExpValidator>
16 #include <QDebug>
17 
PageAddPrinter(QWidget * parent)18 PageAddPrinter::PageAddPrinter(QWidget *parent) :
19     GenericPage(parent),
20     ui(new Ui::PageAddPrinter)
21 {
22     ui->setupUi(this);
23     setAttribute(Qt::WA_DeleteOnClose);
24 
25     // setup default options
26     setWindowTitle(i18nc("@title:window", "Select a Printer to Add"));
27 
28     const int printerSize = 128;
29     const int overlaySize = 48;
30 
31     QPixmap printerIcon = QIcon::fromTheme(QStringLiteral("printer")).pixmap(printerSize);
32     const QPixmap preferencesIcon = QIcon::fromTheme(QStringLiteral("dialog-information")).pixmap(overlaySize);
33 
34     QPainter painter(&printerIcon);
35 
36     // bottom right corner
37     const QPoint startPoint = QPoint(printerSize - overlaySize - 2,
38                                      printerSize - overlaySize - 2);
39     painter.drawPixmap(startPoint, preferencesIcon);
40 
41     ui->printerL->setPixmap(printerIcon);
42 
43     // May contain any printable characters except "/", "#", and space
44     QRegExp rx(QLatin1String("[^/#\\ ]*"));
45     auto validator = new QRegExpValidator(rx, this);
46     ui->nameLE->setValidator(validator);
47 
48     // Hide the message widget
49     ui->messageWidget->setWordWrap(true);
50     ui->messageWidget->setMessageType(KMessageWidget::Error);
51     ui->messageWidget->hide();
52 }
53 
~PageAddPrinter()54 PageAddPrinter::~PageAddPrinter()
55 {
56     delete ui;
57 }
58 
setValues(const QVariantHash & args)59 void PageAddPrinter::setValues(const QVariantHash &args)
60 {
61     if (m_args != args) {
62         QString name;
63         if (!args[KCUPS_PRINTER_NAME].toString().isEmpty()) {
64             name = args[KCUPS_PRINTER_NAME].toString();
65         } else if (!args[KCUPS_DEVICE_MAKE_AND_MODEL].toString().isEmpty()) {
66             name = args[KCUPS_DEVICE_MAKE_AND_MODEL].toString();
67         } else if (!args[KCUPS_DEVICE_INFO].toString().isEmpty()) {
68             name = args[KCUPS_DEVICE_INFO].toString();
69         }
70 
71         if (!args[KCUPS_PRINTER_INFO].toString().isEmpty()) {
72             ui->descriptionLE->setText(args[KCUPS_PRINTER_INFO].toString());
73         } else {
74             ui->descriptionLE->setText(name);
75         }
76 
77         name.replace(QLatin1Char(' '), QLatin1Char('_'));
78         name.replace(QLatin1Char('/'), QLatin1Char('-'));
79         name.replace(QLatin1Char('#'), QLatin1Char('='));
80         ui->nameLE->setText(name);
81         ui->locationLE->setText(args[KCUPS_DEVICE_LOCATION].toString());
82         ui->shareCB->setChecked(true);
83         ui->shareCB->setVisible(args[ADDING_PRINTER].toBool());
84 
85         m_args = args;
86     }
87 }
88 
load()89 void PageAddPrinter::load()
90 {
91 }
92 
canProceed() const93 bool PageAddPrinter::canProceed() const
94 {
95     return !ui->nameLE->text().isEmpty();
96 }
97 
finishClicked()98 bool PageAddPrinter::finishClicked()
99 {
100     bool ret = false;
101     QVariantHash args = values();
102     args[KCUPS_PRINTER_IS_ACCEPTING_JOBS] = true;
103     args[KCUPS_PRINTER_STATE] = IPP_PRINTER_IDLE;
104 
105     // Check if it's a printer or a class that we are adding
106     bool isClass = !args.take(ADDING_PRINTER).toBool();
107     QString destName = args[KCUPS_PRINTER_NAME].toString();
108     QString filename = args.take(FILENAME).toString();
109 
110     QPointer<KCupsRequest> request = new KCupsRequest;
111     if (isClass) {
112         request->addOrModifyClass(destName, args);
113     } else {
114         request->addOrModifyPrinter(destName, args, filename);
115     }
116     request->waitTillFinished();
117     if (request) {
118         if (request->hasError()) {
119             qDebug() << request->error() << request->errorMsg();
120             QString message;
121             if (isClass) {
122                 message = i18nc("@info", "Failed to add class: '%1'", request->errorMsg());
123             } else {
124                 message = i18nc("@info", "Failed to configure printer: '%1'", request->errorMsg());
125             }
126             ui->messageWidget->setText(message);
127             ui->messageWidget->animatedShow();
128         } else {
129             ret = true;
130         }
131         request->deleteLater();
132     }
133 
134     return ret;
135 }
136 
values() const137 QVariantHash PageAddPrinter::values() const
138 {
139     QVariantHash ret = m_args;
140     ret[KCUPS_PRINTER_NAME] = ui->nameLE->text();
141     ret[KCUPS_PRINTER_LOCATION] = ui->locationLE->text();
142     ret[KCUPS_PRINTER_INFO] = ui->descriptionLE->text();
143     if (ret[ADDING_PRINTER].toBool()) {
144          ret[KCUPS_PRINTER_IS_SHARED] = ui->shareCB->isChecked();
145     }
146     return ret;
147 }
148 
on_nameLE_textChanged(const QString & text)149 void PageAddPrinter::on_nameLE_textChanged(const QString &text)
150 {
151     emit allowProceed(!text.isEmpty());
152 }
153 
checkSelected()154 void PageAddPrinter::checkSelected()
155 {
156 //     emit allowProceed(!devicesLV->selectionModel()->selection().isEmpty());
157 }
158 
159 #include "moc_PageAddPrinter.cpp"
160