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 }