File indexing completed on 2024-05-05 05:53:01

0001 //  SPDX-FileCopyrightText: 1998 Matthias Hoelzer <hoelzer@kde.org>
0002 //  SPDX-FileCopyrightText: 2002-2005 David Faure <faure@kde.org>
0003 //  SPDX-License-Identifier: GPL-2.0-or-later
0004 
0005 // Own
0006 #include <config-kdialog.h>
0007 #include "widgets.h"
0008 #include "utils.h"
0009 
0010 // Qt
0011 #include <QComboBox>
0012 #include <QDebug>
0013 #include <QFile>
0014 #include <QInputDialog>
0015 #include <QTextStream>
0016 #include <QTextCursor>
0017 #include <QLabel>
0018 #include <QVBoxLayout>
0019 #include <QPixmap>
0020 
0021 // KF
0022 #include <KPasswordDialog>
0023 #include <KNewPasswordDialog>
0024 #include <KTextEdit>
0025 #include <KDatePicker>
0026 #include <KLocalizedString>
0027 
0028 // Local
0029 #include "klistboxdialog.h"
0030 
0031 static void addButtonBox(QDialog &dlg, QDialogButtonBox::StandardButtons buttons = QDialogButtonBox::Ok | QDialogButtonBox::Cancel)
0032 {
0033     auto buttonBox = new QDialogButtonBox(buttons, &dlg);
0034     dlg.layout()->addWidget(buttonBox);
0035     QObject::connect(buttonBox, &QDialogButtonBox::accepted, &dlg, &QDialog::accept);
0036     QObject::connect(buttonBox, &QDialogButtonBox::rejected, &dlg, &QDialog::reject);
0037 }
0038 
0039 bool Widgets::inputBox(QWidget *parent, const QString &title, const QString &text, const QString &init, QString &result)
0040 {
0041     QInputDialog dlg(parent);
0042     dlg.setWindowTitle(title);
0043     dlg.setLabelText(text);
0044     dlg.setTextValue(init);
0045 
0046     Utils::handleXGeometry(&dlg);
0047 
0048     bool retcode = (dlg.exec() == QDialog::Accepted);
0049     if (retcode) {
0050         result = dlg.textValue();
0051     }
0052     return retcode;
0053 }
0054 
0055 bool Widgets::passwordBox(QWidget *parent, const QString &title, const QString &text, QString &result)
0056 {
0057     KPasswordDialog dlg(parent);
0058     dlg.setWindowTitle(title);
0059     dlg.setPrompt(text);
0060 
0061     Utils::handleXGeometry(&dlg);
0062 
0063     bool retcode = (dlg.exec() == QDialog::Accepted);
0064     if (retcode) {
0065         result = dlg.password();
0066     }
0067     return retcode;
0068 }
0069 
0070 bool Widgets::newPasswordBox(QWidget *parent, const QString &title, const QString &text, QString &result)
0071 {
0072     KNewPasswordDialog dlg(parent);
0073     dlg.setWindowTitle(title);
0074     dlg.setPrompt(text);
0075 
0076     Utils::handleXGeometry(&dlg);
0077 
0078     bool retcode = (dlg.exec() == QDialog::Accepted);
0079     if (retcode) {
0080         result = dlg.password();
0081     }
0082     return retcode;
0083 }
0084 
0085 int Widgets::textBox(QWidget *parent, int width, int height, const QString &title, const QString &file)
0086 {
0087     QDialog dlg(parent);
0088     dlg.setWindowTitle(title);
0089 
0090     auto mainLayout = new QVBoxLayout(&dlg);
0091 
0092     auto edit = new KTextEdit(&dlg);
0093     mainLayout->addWidget(edit);
0094     edit->setReadOnly(true);
0095     edit->setFocus();
0096 
0097     addButtonBox(dlg, QDialogButtonBox::Ok);
0098 
0099     if (file == QLatin1String("-")) {
0100         QTextStream s(stdin, QIODevice::ReadOnly);
0101         while (!s.atEnd()) {
0102             edit->append(s.readLine());
0103         }
0104     } else {
0105         QFile f(file);
0106         if (!f.open(QIODevice::ReadOnly)) {
0107             qWarning() << i18n("kdialog: could not open file %1", file);
0108             return -1;
0109         }
0110         QTextStream s(&f);
0111         while (!s.atEnd()) {
0112             edit->append(s.readLine());
0113         }
0114     }
0115 
0116     edit->setTextCursor(QTextCursor(edit->document()));
0117 
0118     if (width > 0 && height > 0) {
0119         dlg.resize(QSize(width, height));
0120     }
0121 
0122     Utils::handleXGeometry(&dlg);
0123     dlg.setWindowTitle(title);
0124     return (dlg.exec() == QDialog::Accepted) ? 0 : 1;
0125 }
0126 
0127 int Widgets::imgBox(QWidget *parent, const QString &title, const QString &file)
0128 {
0129     QDialog dlg(parent);
0130     dlg.setWindowTitle(title);
0131 
0132     auto mainLayout = new QVBoxLayout(&dlg);
0133 
0134     auto label = new QLabel(&dlg);
0135     mainLayout->addWidget(label);
0136 
0137     addButtonBox(dlg, QDialogButtonBox::Ok);
0138 
0139     QFile f(file);
0140     if (!f.open(QIODevice::ReadOnly)) {
0141         qWarning() << i18n("kdialog: could not open file %1", file);
0142         return -1;
0143     }
0144 
0145     label->setPixmap(QPixmap(file));
0146     Utils::handleXGeometry(&dlg);
0147     return (dlg.exec() == QDialog::Accepted) ? 0 : 1;
0148 }
0149 
0150 int Widgets::imgInputBox(QWidget *parent, const QString &title, const QString &file, const QString &text, QString &result)
0151 {
0152     QFile f(file);
0153     if (!f.open(QIODevice::ReadOnly)) {
0154         qWarning() << i18n("kdialog: could not open file %1", file);
0155         return -1;
0156     }
0157 
0158     QDialog dlg(parent);
0159     dlg.setWindowTitle(title);
0160 
0161     auto mainLayout = new QVBoxLayout(&dlg);
0162 
0163     if (!text.isEmpty()) {
0164         auto head = new QLabel(&dlg);
0165         head->setText(text);
0166         mainLayout->addWidget(head);
0167     }
0168 
0169     auto label = new QLabel(&dlg);
0170     mainLayout->addWidget(label);
0171 
0172     label->setPixmap(QPixmap(file));
0173 
0174     auto edit = new QLineEdit(&dlg);
0175     mainLayout->addWidget(edit);
0176     edit->setReadOnly(false);
0177     edit->setFocus();
0178 
0179     addButtonBox(dlg, QDialogButtonBox::Ok);
0180     Utils::handleXGeometry(&dlg);
0181 
0182     bool retcode = (dlg.exec() == QDialog::Accepted);
0183 
0184     if (retcode) {
0185         result = edit->text();
0186     }
0187 
0188     return retcode;
0189 }
0190 
0191 int Widgets::textInputBox(QWidget *parent, int width, int height, const QString &title, const QString &text, const QString &init, QString &result)
0192 {
0193     QDialog dlg(parent);
0194     dlg.setWindowTitle(title);
0195     auto mainLayout = new QVBoxLayout(&dlg);
0196 
0197     if (!text.isEmpty()) {
0198         auto label = new QLabel(&dlg);
0199         mainLayout->addWidget(label);
0200         label->setText(text);
0201     }
0202 
0203     auto edit = new KTextEdit(&dlg);
0204     mainLayout->addWidget(edit);
0205     edit->setReadOnly(false);
0206     edit->setFocus();
0207     edit->insertPlainText(init);
0208 
0209     addButtonBox(dlg, QDialogButtonBox::Ok);
0210 
0211     if (width > 0 && height > 0) {
0212         dlg.resize(QSize(width, height));
0213     }
0214 
0215     Utils::handleXGeometry(&dlg);
0216     dlg.setWindowTitle(title);
0217     const int returnDialogCode = dlg.exec();
0218     result = edit->toPlainText();
0219     return returnDialogCode == QDialog::Accepted ? 0 : 1;
0220 }
0221 
0222 bool Widgets::comboBox(QWidget *parent, const QString &title, const QString &text, const QStringList &args, const QString &defaultEntry, QString &result)
0223 {
0224     QDialog dlg(parent);
0225     dlg.setWindowTitle(title);
0226 
0227     auto mainLayout = new QVBoxLayout(&dlg);
0228 
0229     auto label = new QLabel(&dlg);
0230     label->setText(text);
0231     mainLayout->addWidget(label);
0232     auto combo = new QComboBox(&dlg);
0233     combo->addItems(args);
0234     combo->setCurrentIndex(combo->findText(defaultEntry));
0235     combo->setFocus();
0236     mainLayout->addWidget(combo);
0237     addButtonBox(dlg);
0238     Utils::handleXGeometry(&dlg);
0239 
0240     bool retcode = (dlg.exec() == QDialog::Accepted);
0241 
0242     if (retcode) {
0243         result = combo->currentText();
0244     }
0245 
0246     return retcode;
0247 }
0248 
0249 bool Widgets::listBox(QWidget *parent, const QString &title, const QString &text, const QStringList &args, const QString &defaultEntry, QString &result)
0250 {
0251     KListBoxDialog box(text, parent);
0252 
0253     box.setWindowTitle(title);
0254 
0255     for (int i = 0; i+1 < args.count(); i += 2) {
0256         box.insertItem(args[i+1]);
0257     }
0258     box.setCurrentItem(defaultEntry);
0259 
0260     Utils::handleXGeometry(&box);
0261 
0262     const bool retcode = (box.exec() == QDialog::Accepted);
0263     if (retcode) {
0264         result = args[ box.currentItem()*2 ];
0265     }
0266     return retcode;
0267 }
0268 
0269 bool Widgets::checkList(QWidget *parent, const QString &title, const QString &text, const QStringList &args, bool separateOutput, QStringList &result)
0270 {
0271     QStringList entries, tags;
0272 
0273     result.clear();
0274 
0275     KListBoxDialog box(text, parent);
0276 
0277     QListWidget &table = box.getTable();
0278 
0279     box.setWindowTitle(title);
0280 
0281     for (int i = 0; i+2 < args.count(); i += 3) {
0282         tags.append(args[i]);
0283         entries.append(args[i+1]);
0284     }
0285 
0286     table.addItems(entries);
0287     table.setSelectionMode(QListWidget::MultiSelection);
0288     table.setCurrentItem(nullptr); // This is to circumvent a Qt bug
0289 
0290     for (int i = 0; i+2 < args.count(); i += 3) {
0291         table.item(i/3)->setSelected(args[i+2] == QLatin1String("on"));
0292     }
0293 
0294     Utils::handleXGeometry(&box);
0295 
0296     const bool retcode = (box.exec() == QDialog::Accepted);
0297 
0298     if (retcode) {
0299         if (separateOutput) {
0300             for (int i = 0; i < table.count(); i++) {
0301                 if (table.item(i)->isSelected()) {
0302                     result.append(tags[i]);
0303                 }
0304             }
0305         } else {
0306             QString rs;
0307             for (int i = 0; i < table.count(); i++) {
0308                 if (table.item(i)->isSelected()) {
0309                     rs += QLatin1String("\"") + tags[i] + QLatin1String("\" ");
0310                 }
0311             }
0312             result.append(rs);
0313         }
0314     }
0315     return retcode;
0316 }
0317 
0318 bool Widgets::radioBox(QWidget *parent, const QString &title, const QString &text, const QStringList &args, QString &result)
0319 {
0320     QStringList entries, tags;
0321 
0322     KListBoxDialog box(text, parent);
0323 
0324     QListWidget &table = box.getTable();
0325 
0326     box.setWindowTitle(title);
0327 
0328     for (int i = 0; i+2 < args.count(); i += 3) {
0329         tags.append(args[i]);
0330         entries.append(args[i+1]);
0331     }
0332 
0333     table.addItems(entries);
0334 
0335     for (int i = 0; i+2 < args.count(); i += 3) {
0336         if (args[i+2] == QLatin1String("on")) {
0337             table.setCurrentRow(i/3);
0338         }
0339     }
0340 
0341     Utils::handleXGeometry(&box);
0342 
0343     const bool retcode = (box.exec() == QDialog::Accepted);
0344     if (retcode) {
0345         result = tags[ table.currentRow() ];
0346     }
0347     return retcode;
0348 }
0349 
0350 bool Widgets::slider(QWidget *parent, const QString &title, const QString &text, int minValue, int maxValue, int step, int &result)
0351 {
0352     QDialog dlg(parent);
0353     dlg.setWindowTitle(title);
0354 
0355     auto mainLayout = new QVBoxLayout(&dlg);
0356 
0357     auto label = new QLabel(&dlg);
0358     mainLayout->addWidget(label);
0359     label->setText(text);
0360     auto slider = new QSlider(&dlg);
0361     mainLayout->addWidget(slider);
0362     slider->setMinimum(minValue);
0363     slider->setMaximum(maxValue);
0364     slider->setSingleStep(step);
0365     slider->setTickInterval(step);
0366     slider->setTickPosition(QSlider::TicksAbove);
0367     slider->setOrientation(Qt::Horizontal);
0368     slider->setFocus();
0369     Utils::handleXGeometry(&dlg);
0370 
0371     addButtonBox(dlg);
0372 
0373     Utils::handleXGeometry(&dlg);
0374     const bool retcode = (dlg.exec() == QDialog::Accepted);
0375 
0376     if (retcode) {
0377         result = slider->value();
0378     }
0379 
0380     return retcode;
0381 }
0382 
0383 bool Widgets::calendar(QWidget *parent, const QString &title, const QString &text, QDate &result, QDate defaultEntry)
0384 {
0385     QDialog dlg(parent);
0386     dlg.setWindowTitle(title);
0387 
0388     auto mainLayout = new QVBoxLayout(&dlg);
0389 
0390     auto label = new QLabel(&dlg);
0391     mainLayout->addWidget(label);
0392     label->setText(text);
0393     auto dateWidget = new KDatePicker(defaultEntry, &dlg);
0394     mainLayout->addWidget(dateWidget);
0395     dateWidget->setFocus();
0396     addButtonBox(dlg);
0397     Utils::handleXGeometry(&dlg);
0398 
0399     const bool retcode = (dlg.exec() == QDialog::Accepted);
0400 
0401     if (retcode) {
0402         result = dateWidget->date();
0403     }
0404 
0405     return retcode;
0406 }