Skip to content

Commit 753cdfd

Browse files
committed
Initialize completer for file system path widget on demand
PR qbittorrent#20586.
1 parent daaaa11 commit 753cdfd

File tree

2 files changed

+40
-20
lines changed

2 files changed

+40
-20
lines changed

src/gui/fspathedit_p.cpp

+34-17
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
/*
22
* 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
56
*
67
* This program is free software; you can redistribute it and/or
78
* modify it under the terms of the GNU General Public License
@@ -32,6 +33,7 @@
3233
#include <QCompleter>
3334
#include <QContextMenuEvent>
3435
#include <QDir>
36+
#include <QFileIconProvider>
3537
#include <QFileInfo>
3638
#include <QFileSystemModel>
3739
#include <QMenu>
@@ -160,36 +162,33 @@ QValidator::State Private::FileSystemPathValidator::validate(QString &input, int
160162
}
161163

162164
Private::FileLineEdit::FileLineEdit(QWidget *parent)
163-
: QLineEdit {parent}
164-
, m_completerModel {new QFileSystemModel(this)}
165-
, m_completer {new QCompleter(this)}
165+
: QLineEdit(parent)
166166
{
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-
175167
connect(this, &QLineEdit::textChanged, this, &FileLineEdit::validateText);
176168
}
177169

178170
Private::FileLineEdit::~FileLineEdit()
179171
{
180172
delete m_completerModel; // has to be deleted before deleting the m_iconProvider object
173+
delete m_iconProvider;
181174
}
182175

183176
void Private::FileLineEdit::completeDirectoriesOnly(const bool completeDirsOnly)
184177
{
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+
}
188185
}
189186

190187
void Private::FileLineEdit::setFilenameFilters(const QStringList &filters)
191188
{
192-
m_completerModel->setNameFilters(filters);
189+
m_filenameFilters = filters;
190+
if (m_completerModel)
191+
m_completerModel->setNameFilters(m_filenameFilters);
193192
}
194193

195194
void Private::FileLineEdit::setBrowseAction(QAction *action)
@@ -223,6 +222,24 @@ void Private::FileLineEdit::keyPressEvent(QKeyEvent *e)
223222

224223
if ((e->key() == Qt::Key_Space) && (e->modifiers() == Qt::CTRL))
225224
{
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+
226243
m_completerModel->setRootPath(Path(text()).data());
227244
showCompletionPopup();
228245
}

src/gui/fspathedit_p.h

+6-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/*
22
* Bittorrent Client using Qt and libtorrent.
3-
* Copyright (C) 2016 Eugene Shalygin
3+
* Copyright (C) 2024 Vladimir Golovnev <[email protected]>
4+
* Copyright (C) 2016 Eugene Shalygin
45
*
56
* This program is free software; you can redistribute it and/or
67
* modify it under the terms of the GNU General Public License
@@ -29,7 +30,6 @@
2930
#pragma once
3031

3132
#include <QComboBox>
32-
#include <QFileIconProvider>
3333
#include <QLineEdit>
3434
#include <QtContainerFwd>
3535
#include <QValidator>
@@ -39,6 +39,7 @@
3939
class QAction;
4040
class QCompleter;
4141
class QContextMenuEvent;
42+
class QFileIconProvider;
4243
class QFileSystemModel;
4344
class QKeyEvent;
4445

@@ -143,7 +144,9 @@ namespace Private
143144
QCompleter *m_completer = nullptr;
144145
QAction *m_browseAction = nullptr;
145146
QAction *m_warningAction = nullptr;
146-
QFileIconProvider m_iconProvider;
147+
QFileIconProvider *m_iconProvider = nullptr;
148+
bool m_completeDirectoriesOnly = false;
149+
QStringList m_filenameFilters;
147150
};
148151

149152
class FileComboEdit final : public QComboBox, public IFileEditorWithCompletion

0 commit comments

Comments
 (0)