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 }