|
1 | 1 | /*
|
2 | 2 | * Bittorrent Client using Qt and libtorrent.
|
3 |
| - * Copyright (C) 2022 Mike Tzou (Chocobo1) |
4 |
| - * Copyright (C) 2016 Eugene Shalygin |
| 3 | + * Copyright (C) 2024 Vladimir Golovnev <[email protected]> |
| 4 | + * Copyright (C) 2022 Mike Tzou (Chocobo1) |
| 5 | + * Copyright (C) 2016 Eugene Shalygin |
5 | 6 | *
|
6 | 7 | * This program is free software; you can redistribute it and/or
|
7 | 8 | * modify it under the terms of the GNU General Public License
|
|
32 | 33 | #include <QCompleter>
|
33 | 34 | #include <QContextMenuEvent>
|
34 | 35 | #include <QDir>
|
| 36 | +#include <QFileIconProvider> |
35 | 37 | #include <QFileInfo>
|
36 | 38 | #include <QFileSystemModel>
|
37 | 39 | #include <QMenu>
|
@@ -160,36 +162,33 @@ QValidator::State Private::FileSystemPathValidator::validate(QString &input, int
|
160 | 162 | }
|
161 | 163 |
|
162 | 164 | Private::FileLineEdit::FileLineEdit(QWidget *parent)
|
163 |
| - : QLineEdit {parent} |
164 |
| - , m_completerModel {new QFileSystemModel(this)} |
165 |
| - , m_completer {new QCompleter(this)} |
| 165 | + : QLineEdit(parent) |
166 | 166 | {
|
167 |
| - m_iconProvider.setOptions(QFileIconProvider::DontUseCustomDirectoryIcons); |
168 |
| - |
169 |
| - m_completerModel->setIconProvider(&m_iconProvider); |
170 |
| - m_completerModel->setOptions(QFileSystemModel::DontWatchForChanges); |
171 |
| - |
172 |
| - m_completer->setModel(m_completerModel); |
173 |
| - setCompleter(m_completer); |
174 |
| - |
175 | 167 | connect(this, &QLineEdit::textChanged, this, &FileLineEdit::validateText);
|
176 | 168 | }
|
177 | 169 |
|
178 | 170 | Private::FileLineEdit::~FileLineEdit()
|
179 | 171 | {
|
180 | 172 | delete m_completerModel; // has to be deleted before deleting the m_iconProvider object
|
| 173 | + delete m_iconProvider; |
181 | 174 | }
|
182 | 175 |
|
183 | 176 | void Private::FileLineEdit::completeDirectoriesOnly(const bool completeDirsOnly)
|
184 | 177 | {
|
185 |
| - const QDir::Filters filters = QDir::NoDotAndDotDot |
186 |
| - | (completeDirsOnly ? QDir::Dirs : QDir::AllEntries); |
187 |
| - m_completerModel->setFilter(filters); |
| 178 | + m_completeDirectoriesOnly = completeDirsOnly; |
| 179 | + if (m_completerModel) |
| 180 | + { |
| 181 | + const QDir::Filters filters = QDir::NoDotAndDotDot |
| 182 | + | (completeDirsOnly ? QDir::Dirs : QDir::AllEntries); |
| 183 | + m_completerModel->setFilter(filters); |
| 184 | + } |
188 | 185 | }
|
189 | 186 |
|
190 | 187 | void Private::FileLineEdit::setFilenameFilters(const QStringList &filters)
|
191 | 188 | {
|
192 |
| - m_completerModel->setNameFilters(filters); |
| 189 | + m_filenameFilters = filters; |
| 190 | + if (m_completerModel) |
| 191 | + m_completerModel->setNameFilters(m_filenameFilters); |
193 | 192 | }
|
194 | 193 |
|
195 | 194 | void Private::FileLineEdit::setBrowseAction(QAction *action)
|
@@ -223,6 +222,24 @@ void Private::FileLineEdit::keyPressEvent(QKeyEvent *e)
|
223 | 222 |
|
224 | 223 | if ((e->key() == Qt::Key_Space) && (e->modifiers() == Qt::CTRL))
|
225 | 224 | {
|
| 225 | + if (!m_completer) |
| 226 | + { |
| 227 | + m_iconProvider = new QFileIconProvider; |
| 228 | + m_iconProvider->setOptions(QFileIconProvider::DontUseCustomDirectoryIcons); |
| 229 | + |
| 230 | + m_completerModel = new QFileSystemModel(this); |
| 231 | + m_completerModel->setIconProvider(m_iconProvider); |
| 232 | + m_completerModel->setOptions(QFileSystemModel::DontWatchForChanges); |
| 233 | + m_completerModel->setNameFilters(m_filenameFilters); |
| 234 | + const QDir::Filters filters = QDir::NoDotAndDotDot |
| 235 | + | (m_completeDirectoriesOnly ? QDir::Dirs : QDir::AllEntries); |
| 236 | + m_completerModel->setFilter(filters); |
| 237 | + |
| 238 | + m_completer = new QCompleter(this); |
| 239 | + m_completer->setModel(m_completerModel); |
| 240 | + setCompleter(m_completer); |
| 241 | + } |
| 242 | + |
226 | 243 | m_completerModel->setRootPath(Path(text()).data());
|
227 | 244 | showCompletionPopup();
|
228 | 245 | }
|
|
0 commit comments