1 /*****************************************************************************
2 * Copyright (C) 2005 Csaba Karai <krusader@users.sourceforge.net> *
3 * Copyright (C) 2005-2019 Krusader Krew [https://krusader.org] *
4 * *
5 * This file is part of Krusader [https://krusader.org]. *
6 * *
7 * Krusader is free software: you can redistribute it and/or modify *
8 * it under the terms of the GNU General Public License as published by *
9 * the Free Software Foundation, either version 2 of the License, or *
10 * (at your option) any later version. *
11 * *
12 * Krusader is distributed in the hope that it will be useful, *
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15 * GNU General Public License for more details. *
16 * *
17 * You should have received a copy of the GNU General Public License *
18 * along with Krusader. If not, see [http://www.gnu.org/licenses/]. *
19 *****************************************************************************/
20
21 #include "kurllistrequester.h"
22 #include "../FileSystem/filesystem.h"
23 #include "../icon.h"
24
25 // QtGui
26 #include <QPixmap>
27 #include <QCursor>
28 #include <QKeyEvent>
29 // QtWidgets
30 #include <QFileDialog>
31 #include <QLayout>
32 #include <QGridLayout>
33 #include <QMenu>
34
35 #include <KI18n/KLocalizedString>
36 #include <KWidgetsAddons/KMessageBox>
37
38 #define DELETE_ITEM_ID 100
39
KURLListRequester(Mode requestMode,QWidget * parent)40 KURLListRequester::KURLListRequester(Mode requestMode, QWidget *parent)
41 : QWidget(parent), mode(requestMode)
42 {
43 // Creating the widget
44
45 QGridLayout *urlListRequesterGrid = new QGridLayout(this);
46 urlListRequesterGrid->setSpacing(0);
47 urlListRequesterGrid->setContentsMargins(0, 0, 0, 0);
48
49 urlLineEdit = new KLineEdit(this);
50 urlListRequesterGrid->addWidget(urlLineEdit, 0, 0);
51
52 urlListBox = new KrListWidget(this);
53 urlListBox->setSelectionMode(QAbstractItemView::ExtendedSelection);
54 urlListRequesterGrid->addWidget(urlListBox, 1, 0, 1, 3);
55
56 urlAddBtn = new QToolButton(this);
57 urlAddBtn->setText("");
58 urlAddBtn->setIcon(Icon("arrow-down"));
59 urlListRequesterGrid->addWidget(urlAddBtn, 0, 1);
60
61 urlBrowseBtn = new QToolButton(this);
62 urlBrowseBtn->setText("");
63 urlBrowseBtn->setIcon(Icon("folder"));
64 urlListRequesterGrid->addWidget(urlBrowseBtn, 0, 2);
65
66 // add shell completion
67
68 completion.setMode(KUrlCompletion::FileCompletion);
69 urlLineEdit->setCompletionObject(&completion);
70
71 // connection table
72
73 connect(urlAddBtn, SIGNAL(clicked()), this, SLOT(slotAdd()));
74 connect(urlBrowseBtn, SIGNAL(clicked()), this, SLOT(slotBrowse()));
75 connect(urlLineEdit, SIGNAL(returnPressed(QString)), this, SLOT(slotAdd()));
76 connect(urlListBox, SIGNAL(itemRightClicked(QListWidgetItem*,QPoint)), this,
77 SLOT(slotRightClicked(QListWidgetItem*,QPoint)));
78 connect(urlLineEdit, SIGNAL(textChanged(QString)), this, SIGNAL(changed()));
79 }
80
slotAdd()81 void KURLListRequester::slotAdd()
82 {
83 QString text = urlLineEdit->text().simplified();
84 if (text.length()) {
85 QString error;
86 emit checkValidity(text, error);
87
88 if (!error.isNull())
89 KMessageBox::error(this, error);
90 else {
91 urlListBox->addItem(text);
92 urlLineEdit->clear();
93 emit changed();
94 }
95 }
96 }
97
slotBrowse()98 void KURLListRequester::slotBrowse()
99 {
100 QUrl url;
101 switch (mode) {
102 case RequestFiles:
103 url = QFileDialog::getOpenFileUrl(this);
104 break;
105 case RequestDirs:
106 url = QFileDialog::getExistingDirectoryUrl(this);
107 break;
108 }
109 if (!url.isEmpty())
110 urlLineEdit->setText(url.toDisplayString(QUrl::PreferLocalFile));
111 urlLineEdit->setFocus();
112 }
113
keyPressEvent(QKeyEvent * e)114 void KURLListRequester::keyPressEvent(QKeyEvent *e)
115 {
116 if (e->key() == Qt::Key_Delete) {
117 if (urlListBox->hasFocus()) {
118 deleteSelectedItems();
119 return;
120 }
121 }
122
123 QWidget::keyPressEvent(e);
124 }
125
deleteSelectedItems()126 void KURLListRequester::deleteSelectedItems()
127 {
128 QList<QListWidgetItem *> delList = urlListBox->selectedItems();
129 for (int i = 0; i != delList.count(); i++)
130 delete delList[ i ];
131 emit changed();
132 }
133
slotRightClicked(QListWidgetItem * item,const QPoint & pos)134 void KURLListRequester::slotRightClicked(QListWidgetItem *item, const QPoint &pos)
135 {
136 if (item == 0)
137 return;
138
139 QMenu popupMenu(this);
140 QAction * menuAction = popupMenu.addAction(i18n("Delete"));
141
142 if (menuAction == popupMenu.exec(pos)) {
143 if (item->isSelected())
144 deleteSelectedItems();
145 else {
146 delete item;
147 emit changed();
148 }
149 }
150 }
151
urlList()152 QList<QUrl> KURLListRequester::urlList()
153 {
154 QList<QUrl> urls;
155
156 QString text = urlLineEdit->text().simplified();
157 if (!text.isEmpty()) {
158 QString error;
159 emit checkValidity(text, error);
160 if (error.isNull())
161 urls.append(QUrl::fromUserInput(text, QString(), QUrl::AssumeLocalFile));
162 }
163
164 for (int i = 0; i != urlListBox->count(); i++) {
165 QListWidgetItem *item = urlListBox->item(i);
166
167 QString text = item->text().simplified();
168
169 QString error;
170 emit checkValidity(text, error);
171 if (error.isNull())
172 urls.append(QUrl::fromUserInput(text, QString(), QUrl::AssumeLocalFile));
173 }
174
175 return urls;
176 }
177
setUrlList(QList<QUrl> urlList)178 void KURLListRequester::setUrlList(QList<QUrl> urlList)
179 {
180 urlLineEdit->clear();
181 urlListBox->clear();
182
183 QList<QUrl>::iterator it;
184
185 for (it = urlList.begin(); it != urlList.end(); ++it)
186 urlListBox->addItem(it->toDisplayString(QUrl::PreferLocalFile));
187
188 emit changed();
189 }
190
191