File indexing completed on 2024-04-28 17:05:54
0001 /* 0002 SPDX-FileCopyrightText: 2005 Csaba Karai <krusader@users.sourceforge.net> 0003 SPDX-FileCopyrightText: 2005-2022 Krusader Krew <https://krusader.org> 0004 0005 SPDX-License-Identifier: GPL-2.0-or-later 0006 */ 0007 0008 #include "kurllistrequester.h" 0009 #include "../FileSystem/filesystem.h" 0010 #include "../compat.h" 0011 #include "../icon.h" 0012 0013 // QtGui 0014 #include <QCursor> 0015 #include <QKeyEvent> 0016 #include <QPixmap> 0017 // QtWidgets 0018 #include <QFileDialog> 0019 #include <QGridLayout> 0020 #include <QLayout> 0021 #include <QMenu> 0022 0023 #include <KI18n/KLocalizedString> 0024 #include <KWidgetsAddons/KMessageBox> 0025 0026 #define DELETE_ITEM_ID 100 0027 0028 KURLListRequester::KURLListRequester(Mode requestMode, QWidget *parent) 0029 : QWidget(parent) 0030 , mode(requestMode) 0031 { 0032 // Creating the widget 0033 0034 auto *urlListRequesterGrid = new QGridLayout(this); 0035 urlListRequesterGrid->setSpacing(0); 0036 urlListRequesterGrid->setContentsMargins(0, 0, 0, 0); 0037 0038 urlLineEdit = new KLineEdit(this); 0039 urlListRequesterGrid->addWidget(urlLineEdit, 0, 0); 0040 0041 urlAddBtn = new QToolButton(this); 0042 urlAddBtn->setText(""); 0043 urlAddBtn->setIcon(Icon("arrow-down")); 0044 urlListRequesterGrid->addWidget(urlAddBtn, 0, 1); 0045 0046 urlBrowseBtn = new QToolButton(this); 0047 urlBrowseBtn->setText(""); 0048 urlBrowseBtn->setIcon(Icon("folder")); 0049 urlListRequesterGrid->addWidget(urlBrowseBtn, 0, 2); 0050 0051 urlListBox = new KrListWidget(this); 0052 urlListBox->setSelectionMode(QAbstractItemView::ExtendedSelection); 0053 urlListRequesterGrid->addWidget(urlListBox, 1, 0, 1, 3); 0054 0055 // add shell completion 0056 0057 completion.setMode(KUrlCompletion::FileCompletion); 0058 urlLineEdit->setCompletionObject(&completion); 0059 0060 // connection table 0061 0062 connect(urlAddBtn, &QToolButton::clicked, this, &KURLListRequester::slotAdd); 0063 connect(urlBrowseBtn, &QToolButton::clicked, this, &KURLListRequester::slotBrowse); 0064 connect(urlLineEdit, &KLineEdit::KLINEEDIT_RETURNKEYPRESSED, this, &KURLListRequester::slotAdd); 0065 connect(urlListBox, &KrListWidget::itemRightClicked, this, &KURLListRequester::slotRightClicked); 0066 connect(urlLineEdit, &KLineEdit::textChanged, this, &KURLListRequester::changed); 0067 } 0068 0069 void KURLListRequester::slotAdd() 0070 { 0071 QString text = urlLineEdit->text().simplified(); 0072 if (text.length()) { 0073 QString error; 0074 emit checkValidity(text, error); 0075 0076 if (!error.isNull()) 0077 KMessageBox::error(this, error); 0078 else { 0079 urlListBox->addItem(text); 0080 urlLineEdit->clear(); 0081 emit changed(); 0082 } 0083 } 0084 } 0085 0086 void KURLListRequester::slotBrowse() 0087 { 0088 QUrl url; 0089 switch (mode) { 0090 case RequestFiles: 0091 url = QFileDialog::getOpenFileUrl(this); 0092 break; 0093 case RequestDirs: 0094 url = QFileDialog::getExistingDirectoryUrl(this); 0095 break; 0096 } 0097 if (!url.isEmpty()) 0098 urlLineEdit->setText(url.toDisplayString(QUrl::PreferLocalFile)); 0099 urlLineEdit->setFocus(); 0100 } 0101 0102 void KURLListRequester::keyPressEvent(QKeyEvent *e) 0103 { 0104 if (e->key() == Qt::Key_Delete) { 0105 if (urlListBox->hasFocus()) { 0106 deleteSelectedItems(); 0107 return; 0108 } 0109 } 0110 0111 QWidget::keyPressEvent(e); 0112 } 0113 0114 void KURLListRequester::deleteSelectedItems() 0115 { 0116 const QList<QListWidgetItem *> selectedItems = urlListBox->selectedItems(); 0117 for (QListWidgetItem *item : selectedItems) 0118 delete item; 0119 emit changed(); 0120 } 0121 0122 void KURLListRequester::slotRightClicked(QListWidgetItem *item, const QPoint &pos) 0123 { 0124 if (item == nullptr) 0125 return; 0126 0127 QMenu popupMenu(this); 0128 QAction *menuAction = popupMenu.addAction(i18n("Delete")); 0129 0130 if (menuAction == popupMenu.exec(pos)) { 0131 if (item->isSelected()) 0132 deleteSelectedItems(); 0133 else { 0134 delete item; 0135 emit changed(); 0136 } 0137 } 0138 } 0139 0140 QList<QUrl> KURLListRequester::urlList() 0141 { 0142 QStringList lines; 0143 0144 const QString lineEditText = urlLineEdit->text().simplified(); 0145 if (!lineEditText.isEmpty()) { 0146 lines.append(lineEditText); 0147 } 0148 0149 for (int i = 0; i != urlListBox->count(); i++) { 0150 QListWidgetItem *item = urlListBox->item(i); 0151 lines.append(item->text().simplified()); 0152 } 0153 0154 QList<QUrl> urls; 0155 for (QString text : lines) { 0156 QString error; 0157 emit checkValidity(text, error); 0158 if (error.isNull()) 0159 urls.append(QUrl::fromUserInput(text, QString(), QUrl::AssumeLocalFile)); 0160 } 0161 0162 return urls; 0163 } 0164 0165 void KURLListRequester::setUrlList(const QList<QUrl> &urlList) 0166 { 0167 urlLineEdit->clear(); 0168 urlListBox->clear(); 0169 0170 for (const QUrl &url : urlList) { 0171 urlListBox->addItem(url.toDisplayString(QUrl::PreferLocalFile)); 0172 } 0173 0174 emit changed(); 0175 }