File indexing completed on 2024-04-28 17:05:53

0001 /*
0002     SPDX-FileCopyrightText: 2000 Shie Erlich <erlich@users.sourceforge.net>
0003     SPDX-FileCopyrightText: 2000 Rafi Yanai <yanai@users.sourceforge.net>
0004     SPDX-FileCopyrightText: 2004-2022 Krusader Krew <https://krusader.org>
0005 
0006     SPDX-License-Identifier: GPL-2.0-or-later
0007 */
0008 
0009 #include "krdialogs.h"
0010 
0011 // QtCore
0012 #include <QDebug>
0013 #include <QDir>
0014 // QtGui
0015 #include <QFontMetrics>
0016 #include <QKeyEvent>
0017 // QtWidgets
0018 #include <QApplication>
0019 #include <QCheckBox>
0020 #include <QDialogButtonBox>
0021 #include <QFrame>
0022 #include <QLabel>
0023 #include <QVBoxLayout>
0024 
0025 #include <KCompletion/KLineEdit>
0026 #include <KI18n/KLocalizedString>
0027 #include <KIOCore/KRecentDocument>
0028 #include <KIOWidgets/KUrlCompletion>
0029 #include <KIOWidgets/KUrlRequester>
0030 #include <KWidgetsAddons/KGuiItem>
0031 
0032 #include "../FileSystem/filesystem.h"
0033 #include "../JobMan/jobman.h"
0034 #include "../defaults.h"
0035 #include "../krglobal.h"
0036 
0037 QUrl KChooseDir::getFile(const QString &text, const QUrl &url, const QUrl &cwd)
0038 {
0039     return get(text, url, cwd, KFile::File);
0040 }
0041 
0042 QUrl KChooseDir::getDir(const QString &text, const QUrl &url, const QUrl &cwd)
0043 {
0044     return get(text, url, cwd, KFile::Directory);
0045 }
0046 
0047 QUrl KChooseDir::get(const QString &text, const QUrl &url, const QUrl &cwd, KFile::Modes mode)
0048 {
0049     QScopedPointer<KUrlRequesterDialog> dlg(new KUrlRequesterDialog(url, text, krMainWindow));
0050     dlg->urlRequester()->setStartDir(cwd);
0051     dlg->urlRequester()->setMode(mode);
0052     dlg->exec();
0053     QUrl u = dlg->selectedUrl(); // empty if cancelled
0054     if (u.scheme() == "zip" || u.scheme() == "krarc" || u.scheme() == "tar" || u.scheme() == "iso") {
0055         if (QDir(u.path()).exists()) {
0056             u.setScheme("file");
0057         }
0058     }
0059     return u;
0060 }
0061 
0062 KChooseDir::ChooseResult KChooseDir::getCopyDir(const QString &text, const QUrl &url, const QUrl &cwd)
0063 {
0064     QScopedPointer<KUrlRequesterDlgForCopy> dlg(new KUrlRequesterDlgForCopy(url, text, krMainWindow, true));
0065 
0066     dlg->urlRequester()->setStartDir(cwd);
0067     dlg->urlRequester()->setMode(KFile::Directory);
0068     dlg->exec();
0069     QUrl u = dlg->selectedURL();
0070     if (u.scheme() == "zip" || u.scheme() == "krarc" || u.scheme() == "tar" || u.scheme() == "iso") {
0071         if (QDir(u.path()).exists()) {
0072             u.setScheme("file");
0073         }
0074     }
0075 
0076     ChooseResult result;
0077     result.url = u;
0078     result.enqueue = dlg->isQueued();
0079     return result;
0080 }
0081 
0082 KUrlRequesterDlgForCopy::KUrlRequesterDlgForCopy(const QUrl &urlName, const QString &_text, QWidget *parent, bool modal)
0083     : QDialog(parent)
0084 {
0085     setWindowModality(modal ? Qt::WindowModal : Qt::NonModal);
0086 
0087     auto *mainLayout = new QVBoxLayout;
0088     setLayout(mainLayout);
0089 
0090     QLabel *label = new QLabel;
0091     label->setWordWrap(true);
0092     label->setText(_text);
0093     mainLayout->addWidget(label);
0094 
0095     urlRequester_ = new KUrlRequester(urlName, this);
0096     urlRequester_->setMinimumWidth(urlRequester_->sizeHint().width() * 3);
0097     mainLayout->addWidget(urlRequester_);
0098 
0099     QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
0100     mainLayout->addWidget(buttonBox);
0101     okButton = buttonBox->button(QDialogButtonBox::Ok);
0102     okButton->setDefault(true);
0103     okButton->setShortcut(Qt::CTRL | Qt::Key_Return);
0104 
0105     QPushButton *queueButton = new QPushButton(krJobMan->isQueueModeEnabled() ? i18n("F2 Delay Job Start") : i18n("F2 Queue"), this);
0106     queueButton->setToolTip(krJobMan->isQueueModeEnabled() ? i18n("Do not start the job now.")
0107                                                            : i18n("Enqueue the job if another job is running. Otherwise start immediately."));
0108     buttonBox->addButton(queueButton, QDialogButtonBox::ActionRole);
0109 
0110     connect(buttonBox, &QDialogButtonBox::accepted, this, &KUrlRequesterDlgForCopy::accept);
0111     connect(buttonBox, &QDialogButtonBox::rejected, this, &KUrlRequesterDlgForCopy::reject);
0112     connect(queueButton, &QPushButton::clicked, this, &KUrlRequesterDlgForCopy::slotQueueButtonClicked);
0113     connect(urlRequester_, &KUrlRequester::textChanged, this, &KUrlRequesterDlgForCopy::slotTextChanged);
0114 
0115     urlRequester_->setFocus();
0116     bool state = !urlName.isEmpty();
0117     okButton->setEnabled(state);
0118 }
0119 
0120 void KUrlRequesterDlgForCopy::keyPressEvent(QKeyEvent *e)
0121 {
0122     switch (e->key()) {
0123     case Qt::Key_F2:
0124         slotQueueButtonClicked();
0125         return;
0126     default:
0127         QDialog::keyPressEvent(e);
0128     }
0129 }
0130 
0131 void KUrlRequesterDlgForCopy::slotQueueButtonClicked()
0132 {
0133     queueStart = true;
0134     accept();
0135 }
0136 
0137 void KUrlRequesterDlgForCopy::slotTextChanged(const QString &text)
0138 {
0139     bool state = !text.trimmed().isEmpty();
0140     okButton->setEnabled(state);
0141 }
0142 
0143 QUrl KUrlRequesterDlgForCopy::selectedURL() const
0144 {
0145     if (result() == QDialog::Accepted) {
0146         QUrl url = urlRequester_->url();
0147         qDebug() << "requester returned URL=" << url.toDisplayString();
0148         if (url.isValid())
0149             KRecentDocument::add(url);
0150         return url;
0151     } else
0152         return QUrl();
0153 }
0154 
0155 KUrlRequester *KUrlRequesterDlgForCopy::urlRequester()
0156 {
0157     return urlRequester_;
0158 }
0159 
0160 KrGetDate::KrGetDate(QDate date, QWidget *parent)
0161     : QDialog(parent, Qt::MSWindowsFixedSizeDialogHint)
0162 {
0163     setWindowModality(Qt::WindowModal);
0164     dateWidget = new KDatePicker(this);
0165     dateWidget->setDate(date);
0166     dateWidget->resize(dateWidget->sizeHint());
0167     setMinimumSize(dateWidget->sizeHint());
0168     setMaximumSize(dateWidget->sizeHint());
0169     resize(minimumSize());
0170     connect(dateWidget, &KDatePicker::dateSelected, this, &KrGetDate::setDate);
0171     connect(dateWidget, &KDatePicker::dateEntered, this, &KrGetDate::setDate);
0172 
0173     // keep the original date - incase ESC is pressed
0174     originalDate = date;
0175 }
0176 
0177 QDate KrGetDate::getDate()
0178 {
0179     if (exec() == QDialog::Rejected)
0180         chosenDate = QDate();
0181     hide();
0182     return chosenDate;
0183 }
0184 
0185 void KrGetDate::setDate(QDate date)
0186 {
0187     chosenDate = date;
0188     accept();
0189 }