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