1/****************************************************************************
2**
3** Copyright (C) 2016 The Qt Company Ltd.
4** Contact: https://www.qt.io/licensing/
5**
6** This file is part of the QtWidgets module of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and The Qt Company. For licensing terms
14** and conditions see https://www.qt.io/terms-conditions. For further
15** information use the contact form at https://www.qt.io/contact-us.
16**
17** GNU Lesser General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU Lesser
19** General Public License version 3 as published by the Free Software
20** Foundation and appearing in the file LICENSE.LGPL3 included in the
21** packaging of this file. Please review the following information to
22** ensure the GNU Lesser General Public License version 3 requirements
23** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24**
25** GNU General Public License Usage
26** Alternatively, this file may be used under the terms of the GNU
27** General Public License version 2.0 or (at your option) the GNU General
28** Public license version 3 or any later version approved by the KDE Free
29** Qt Foundation. The licenses are as published by the Free Software
30** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31** included in the packaging of this file. Please review the following
32** information to ensure the GNU General Public License requirements will
33** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34** https://www.gnu.org/licenses/gpl-3.0.html.
35**
36** $QT_END_LICENSE$
37**
38****************************************************************************/
39
40#ifndef QFILEDIALOG_H
41#define QFILEDIALOG_H
42
43#include <QtWidgets/qtwidgetsglobal.h>
44#include <QtCore/qdir.h>
45#include <QtCore/qstring.h>
46#include <QtCore/qurl.h>
47#include <QtWidgets/qdialog.h>
48
49#include <functional>
50
51QT_REQUIRE_CONFIG(filedialog);
52
53QT_BEGIN_NAMESPACE
54
55class QModelIndex;
56class QItemSelection;
57struct QFileDialogArgs;
58class QFileDialogPrivate;
59class QAbstractFileIconProvider;
60class QAbstractItemDelegate;
61class QAbstractProxyModel;
62
63class Q_WIDGETS_EXPORT QFileDialog : public QDialog
64{
65 Q_OBJECT
66 Q_PROPERTY(ViewMode viewMode READ viewMode WRITE setViewMode)
67 Q_PROPERTY(FileMode fileMode READ fileMode WRITE setFileMode)
68 Q_PROPERTY(AcceptMode acceptMode READ acceptMode WRITE setAcceptMode)
69 Q_PROPERTY(QString defaultSuffix READ defaultSuffix WRITE setDefaultSuffix)
70 Q_PROPERTY(Options options READ options WRITE setOptions)
71 Q_PROPERTY(QStringList supportedSchemes READ supportedSchemes WRITE setSupportedSchemes)
72
73public:
74 enum ViewMode { Detail, List };
75 Q_ENUM(ViewMode)
76 enum FileMode { AnyFile, ExistingFile, Directory, ExistingFiles };
77 Q_ENUM(FileMode)
78 enum AcceptMode { AcceptOpen, AcceptSave };
79 Q_ENUM(AcceptMode)
80 enum DialogLabel { LookIn, FileName, FileType, Accept, Reject };
81
82 enum Option
83 {
84 ShowDirsOnly = 0x00000001,
85 DontResolveSymlinks = 0x00000002,
86 DontConfirmOverwrite = 0x00000004,
87 DontUseNativeDialog = 0x00000008,
88 ReadOnly = 0x00000010,
89 HideNameFilterDetails = 0x00000020,
90 DontUseCustomDirectoryIcons = 0x00000040
91 };
92 Q_ENUM(Option)
93 Q_DECLARE_FLAGS(Options, Option)
94 Q_FLAG(Options)
95
96 QFileDialog(QWidget *parent, Qt::WindowFlags f);
97 explicit QFileDialog(QWidget *parent = nullptr,
98 const QString &caption = QString(),
99 const QString &directory = QString(),
100 const QString &filter = QString());
101 ~QFileDialog();
102
103 void setDirectory(const QString &directory);
104 inline void setDirectory(const QDir &directory);
105 QDir directory() const;
106
107 void setDirectoryUrl(const QUrl &directory);
108 QUrl directoryUrl() const;
109
110 void selectFile(const QString &filename);
111 QStringList selectedFiles() const;
112
113 void selectUrl(const QUrl &url);
114 QList<QUrl> selectedUrls() const;
115
116 void setNameFilter(const QString &filter);
117 void setNameFilters(const QStringList &filters);
118 QStringList nameFilters() const;
119 void selectNameFilter(const QString &filter);
120 QString selectedMimeTypeFilter() const;
121 QString selectedNameFilter() const;
122
123#if QT_CONFIG(mimetype)
124 void setMimeTypeFilters(const QStringList &filters);
125 QStringList mimeTypeFilters() const;
126 void selectMimeTypeFilter(const QString &filter);
127#endif
128
129 QDir::Filters filter() const;
130 void setFilter(QDir::Filters filters);
131
132 void setViewMode(ViewMode mode);
133 ViewMode viewMode() const;
134
135 void setFileMode(FileMode mode);
136 FileMode fileMode() const;
137
138 void setAcceptMode(AcceptMode mode);
139 AcceptMode acceptMode() const;
140
141 void setSidebarUrls(const QList<QUrl> &urls);
142 QList<QUrl> sidebarUrls() const;
143
144 QByteArray saveState() const;
145 bool restoreState(const QByteArray &state);
146
147 void setDefaultSuffix(const QString &suffix);
148 QString defaultSuffix() const;
149
150 void setHistory(const QStringList &paths);
151 QStringList history() const;
152
153 void setItemDelegate(QAbstractItemDelegate *delegate);
154 QAbstractItemDelegate *itemDelegate() const;
155
156 void setIconProvider(QAbstractFileIconProvider *provider);
157 QAbstractFileIconProvider *iconProvider() const;
158
159 void setLabelText(DialogLabel label, const QString &text);
160 QString labelText(DialogLabel label) const;
161
162 void setSupportedSchemes(const QStringList &schemes);
163 QStringList supportedSchemes() const;
164
165#if QT_CONFIG(proxymodel)
166 void setProxyModel(QAbstractProxyModel *model);
167 QAbstractProxyModel *proxyModel() const;
168#endif
169
170 void setOption(Option option, bool on = true);
171 bool testOption(Option option) const;
172 void setOptions(Options options);
173 Options options() const;
174
175 using QDialog::open;
176 void open(QObject *receiver, const char *member);
177 void setVisible(bool visible) override;
178
179Q_SIGNALS:
180 void fileSelected(const QString &file);
181 void filesSelected(const QStringList &files);
182 void currentChanged(const QString &path);
183 void directoryEntered(const QString &directory);
184
185 void urlSelected(const QUrl &url);
186 void urlsSelected(const QList<QUrl> &urls);
187 void currentUrlChanged(const QUrl &url);
188 void directoryUrlEntered(const QUrl &directory);
189
190 void filterSelected(const QString &filter);
191
192public:
193
194 static QString getOpenFileName(QWidget *parent = nullptr,
195 const QString &caption = QString(),
196 const QString &dir = QString(),
197 const QString &filter = QString(),
198 QString *selectedFilter = nullptr,
199 Options options = Options());
200
201 static QUrl getOpenFileUrl(QWidget *parent = nullptr,
202 const QString &caption = QString(),
203 const QUrl &dir = QUrl(),
204 const QString &filter = QString(),
205 QString *selectedFilter = nullptr,
206 Options options = Options(),
207 const QStringList &supportedSchemes = QStringList());
208
209 static QString getSaveFileName(QWidget *parent = nullptr,
210 const QString &caption = QString(),
211 const QString &dir = QString(),
212 const QString &filter = QString(),
213 QString *selectedFilter = nullptr,
214 Options options = Options());
215
216 static QUrl getSaveFileUrl(QWidget *parent = nullptr,
217 const QString &caption = QString(),
218 const QUrl &dir = QUrl(),
219 const QString &filter = QString(),
220 QString *selectedFilter = nullptr,
221 Options options = Options(),
222 const QStringList &supportedSchemes = QStringList());
223
224 static QString getExistingDirectory(QWidget *parent = nullptr,
225 const QString &caption = QString(),
226 const QString &dir = QString(),
227 Options options = ShowDirsOnly);
228
229 static QUrl getExistingDirectoryUrl(QWidget *parent = nullptr,
230 const QString &caption = QString(),
231 const QUrl &dir = QUrl(),
232 Options options = ShowDirsOnly,
233 const QStringList &supportedSchemes = QStringList());
234
235 static QStringList getOpenFileNames(QWidget *parent = nullptr,
236 const QString &caption = QString(),
237 const QString &dir = QString(),
238 const QString &filter = QString(),
239 QString *selectedFilter = nullptr,
240 Options options = Options());
241
242 static QList<QUrl> getOpenFileUrls(QWidget *parent = nullptr,
243 const QString &caption = QString(),
244 const QUrl &dir = QUrl(),
245 const QString &filter = QString(),
246 QString *selectedFilter = nullptr,
247 Options options = Options(),
248 const QStringList &supportedSchemes = QStringList());
249
250 static void getOpenFileContent(const QString &nameFilter,
251 const std::function<void(const QString &, const QByteArray &)> &fileContentsReady);
252 static void saveFileContent(const QByteArray &fileContent, const QString &fileNameHint = QString());
253
254protected:
255 QFileDialog(const QFileDialogArgs &args);
256 void done(int result) override;
257 void accept() override;
258 void changeEvent(QEvent *e) override;
259
260private:
261 Q_DECLARE_PRIVATE(QFileDialog)
262 Q_DISABLE_COPY(QFileDialog)
263
264 Q_PRIVATE_SLOT(d_func(), void _q_pathChanged(const QString &))
265
266 Q_PRIVATE_SLOT(d_func(), void _q_navigateBackward())
267 Q_PRIVATE_SLOT(d_func(), void _q_navigateForward())
268 Q_PRIVATE_SLOT(d_func(), void _q_navigateToParent())
269 Q_PRIVATE_SLOT(d_func(), void _q_createDirectory())
270 Q_PRIVATE_SLOT(d_func(), void _q_showListView())
271 Q_PRIVATE_SLOT(d_func(), void _q_showDetailsView())
272 Q_PRIVATE_SLOT(d_func(), void _q_showContextMenu(const QPoint &))
273 Q_PRIVATE_SLOT(d_func(), void _q_renameCurrent())
274 Q_PRIVATE_SLOT(d_func(), void _q_deleteCurrent())
275 Q_PRIVATE_SLOT(d_func(), void _q_showHidden())
276 Q_PRIVATE_SLOT(d_func(), void _q_updateOkButton())
277 Q_PRIVATE_SLOT(d_func(), void _q_currentChanged(const QModelIndex &index))
278 Q_PRIVATE_SLOT(d_func(), void _q_enterDirectory(const QModelIndex &index))
279 Q_PRIVATE_SLOT(d_func(), void _q_emitUrlSelected(const QUrl &))
280 Q_PRIVATE_SLOT(d_func(), void _q_emitUrlsSelected(const QList<QUrl> &))
281 Q_PRIVATE_SLOT(d_func(), void _q_nativeCurrentChanged(const QUrl &))
282 Q_PRIVATE_SLOT(d_func(), void _q_nativeEnterDirectory(const QUrl&))
283 Q_PRIVATE_SLOT(d_func(), void _q_goToDirectory(const QString &path))
284 Q_PRIVATE_SLOT(d_func(), void _q_useNameFilter(int index))
285 Q_PRIVATE_SLOT(d_func(), void _q_selectionChanged())
286 Q_PRIVATE_SLOT(d_func(), void _q_goToUrl(const QUrl &url))
287 Q_PRIVATE_SLOT(d_func(), void _q_goHome())
288 Q_PRIVATE_SLOT(d_func(), void _q_showHeader(QAction *))
289 Q_PRIVATE_SLOT(d_func(), void _q_autoCompleteFileName(const QString &text))
290 Q_PRIVATE_SLOT(d_func(), void _q_rowsInserted(const QModelIndex & parent))
291 Q_PRIVATE_SLOT(d_func(), void _q_fileRenamed(const QString &path,
292 const QString &oldName,
293 const QString &newName))
294 friend class QPlatformDialogHelper;
295};
296
297inline void QFileDialog::setDirectory(const QDir &adirectory)
298{ setDirectory(adirectory.absolutePath()); }
299
300Q_DECLARE_OPERATORS_FOR_FLAGS(QFileDialog::Options)
301
302QT_END_NAMESPACE
303
304#endif // QFILEDIALOG_H
305