File indexing completed on 2024-12-08 03:40:50

0001 /*
0002     This file is part of the KDE libraries
0003     SPDX-FileCopyrightText: 2000 Wilco Greven <greven@kde.org>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #include "kurlrequesterdialog.h"
0009 
0010 #include <QDialogButtonBox>
0011 #include <QFileDialog>
0012 #include <QLabel>
0013 #include <QVBoxLayout>
0014 
0015 #include <KLineEdit>
0016 #include <KLocalizedString>
0017 #include <KStandardGuiItem>
0018 #include <krecentdocument.h>
0019 #include <kurlrequester.h>
0020 
0021 class KUrlRequesterDialogPrivate
0022 {
0023 public:
0024     explicit KUrlRequesterDialogPrivate(KUrlRequesterDialog *qq)
0025         : q(qq)
0026     {
0027     }
0028 
0029     KUrlRequesterDialog *const q;
0030 
0031     void initDialog(const QString &text, const QUrl &url);
0032 
0033     // slots
0034     void slotTextChanged(const QString &);
0035 
0036     KUrlRequester *urlRequester;
0037     QDialogButtonBox *buttonBox;
0038 };
0039 
0040 KUrlRequesterDialog::KUrlRequesterDialog(const QUrl &urlName, QWidget *parent)
0041     : QDialog(parent)
0042     , d(new KUrlRequesterDialogPrivate(this))
0043 {
0044     d->initDialog(i18n("Location:"), urlName);
0045 }
0046 
0047 KUrlRequesterDialog::KUrlRequesterDialog(const QUrl &urlName, const QString &_text, QWidget *parent)
0048     : QDialog(parent)
0049     , d(new KUrlRequesterDialogPrivate(this))
0050 {
0051     d->initDialog(_text, urlName);
0052 }
0053 
0054 KUrlRequesterDialog::~KUrlRequesterDialog() = default;
0055 
0056 void KUrlRequesterDialogPrivate::initDialog(const QString &text, const QUrl &urlName)
0057 {
0058     QVBoxLayout *topLayout = new QVBoxLayout(q);
0059 
0060     QLabel *label = new QLabel(text, q);
0061     label->setWordWrap(true);
0062     topLayout->addWidget(label);
0063 
0064     urlRequester = new KUrlRequester(urlName, q);
0065     urlRequester->setMinimumWidth(urlRequester->sizeHint().width() * 3);
0066     topLayout->addWidget(urlRequester);
0067     urlRequester->setFocus();
0068     QObject::connect(urlRequester->lineEdit(), &KLineEdit::textChanged, q, [this](const QString &text) {
0069         slotTextChanged(text);
0070     });
0071     /*
0072     KFile::Mode mode = static_cast<KFile::Mode>( KFile::File |
0073             KFile::ExistingOnly );
0074     urlRequester_->setMode( mode );
0075     */
0076 
0077     buttonBox = new QDialogButtonBox(q);
0078     buttonBox->setStandardButtons(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
0079     QObject::connect(buttonBox, &QDialogButtonBox::accepted, q, &QDialog::accept);
0080     QObject::connect(buttonBox, &QDialogButtonBox::rejected, q, &QDialog::reject);
0081     topLayout->addWidget(buttonBox);
0082 
0083     slotTextChanged(urlName.toString());
0084 }
0085 
0086 void KUrlRequesterDialogPrivate::slotTextChanged(const QString &text)
0087 {
0088     bool state = !text.trimmed().isEmpty();
0089     buttonBox->button(QDialogButtonBox::Ok)->setEnabled(state);
0090 }
0091 
0092 QUrl KUrlRequesterDialog::selectedUrl() const
0093 {
0094     if (result() == QDialog::Accepted) {
0095         return d->urlRequester->url();
0096     } else {
0097         return QUrl();
0098     }
0099 }
0100 
0101 QUrl KUrlRequesterDialog::getUrl(const QUrl &dir, QWidget *parent, const QString &title)
0102 {
0103     KUrlRequesterDialog dlg(dir, parent);
0104 
0105     dlg.setWindowTitle(title.isEmpty() ? i18n("Open") : title);
0106 
0107     dlg.exec();
0108 
0109     const QUrl &url = dlg.selectedUrl();
0110     if (url.isValid()) {
0111         KRecentDocument::add(url);
0112     }
0113 
0114     return url;
0115 }
0116 
0117 KUrlRequester *KUrlRequesterDialog::urlRequester()
0118 {
0119     return d->urlRequester;
0120 }
0121 
0122 #include "moc_kurlrequesterdialog.cpp"