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 }