1 /****************************************************************************
2 **
3 ** Copyright (C) 2018 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the QtGui 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 QPLATFORMDIALOGHELPER_H
41 #define QPLATFORMDIALOGHELPER_H
42 
43 //
44 //  W A R N I N G
45 //  -------------
46 //
47 // This file is part of the QPA API and is not meant to be used
48 // in applications. Usage of this API may make your code
49 // source and binary incompatible with future versions of Qt.
50 //
51 
52 #include <QtGui/qtguiglobal.h>
53 #include <QtCore/QtGlobal>
54 #include <QtCore/QObject>
55 #include <QtCore/QList>
56 #include <QtCore/QSharedDataPointer>
57 #include <QtCore/QSharedPointer>
58 #include <QtCore/QDir>
59 #include <QtCore/QUrl>
60 #include <QtGui/QRgb>
61 
62 QT_BEGIN_NAMESPACE
63 
64 
65 class QString;
66 class QColor;
67 class QFont;
68 class QWindow;
69 class QVariant;
70 class QUrl;
71 class QColorDialogOptionsPrivate;
72 class QFontDialogOptionsPrivate;
73 class QFileDialogOptionsPrivate;
74 class QMessageDialogOptionsPrivate;
75 
76 #define QPLATFORMDIALOGHELPERS_HAS_CREATE
77 
78 class Q_GUI_EXPORT QPlatformDialogHelper : public QObject
79 {
80     Q_OBJECT
81 public:
82     enum StyleHint {
83         DialogIsQtWindow
84     };
85     enum DialogCode { Rejected, Accepted };
86 
87     enum StandardButton {
88         // keep this in sync with QDialogButtonBox::StandardButton and QMessageBox::StandardButton
89         NoButton           = 0x00000000,
90         Ok                 = 0x00000400,
91         Save               = 0x00000800,
92         SaveAll            = 0x00001000,
93         Open               = 0x00002000,
94         Yes                = 0x00004000,
95         YesToAll           = 0x00008000,
96         No                 = 0x00010000,
97         NoToAll            = 0x00020000,
98         Abort              = 0x00040000,
99         Retry              = 0x00080000,
100         Ignore             = 0x00100000,
101         Close              = 0x00200000,
102         Cancel             = 0x00400000,
103         Discard            = 0x00800000,
104         Help               = 0x01000000,
105         Apply              = 0x02000000,
106         Reset              = 0x04000000,
107         RestoreDefaults    = 0x08000000,
108 
109 
110         FirstButton        = Ok,                // internal
111         LastButton         = RestoreDefaults,   // internal
112         LowestBit          = 10,                // internal: log2(FirstButton)
113         HighestBit         = 27                 // internal: log2(LastButton)
114     };
115 
116     Q_DECLARE_FLAGS(StandardButtons, StandardButton)
117     Q_FLAG(StandardButtons)
118 
119     enum ButtonRole {
120         // keep this in sync with QDialogButtonBox::ButtonRole and QMessageBox::ButtonRole
121         // TODO Qt 6: make the enum copies explicit, and make InvalidRole == 0 so that
122         // AcceptRole can be or'ed with flags, and EOL can be the same as InvalidRole (null-termination)
123         InvalidRole = -1,
124         AcceptRole,
125         RejectRole,
126         DestructiveRole,
127         ActionRole,
128         HelpRole,
129         YesRole,
130         NoRole,
131         ResetRole,
132         ApplyRole,
133 
134         NRoles,
135 
136         RoleMask        = 0x0FFFFFFF,
137         AlternateRole   = 0x10000000,
138         Stretch         = 0x20000000,
139         Reverse         = 0x40000000,
140         EOL             = InvalidRole
141     };
142     Q_ENUM(ButtonRole)
143 
144     enum ButtonLayout {
145         // keep this in sync with QDialogButtonBox::ButtonLayout
146         UnknownLayout = -1,
147         WinLayout,
148         MacLayout,
149         KdeLayout,
150         GnomeLayout,
151         MacModelessLayout,
152         AndroidLayout
153     };
154     Q_ENUM(ButtonLayout)
155 
156     QPlatformDialogHelper();
157     ~QPlatformDialogHelper();
158 
159     virtual QVariant styleHint(StyleHint hint) const;
160 
161     virtual void exec() = 0;
162     virtual bool show(Qt::WindowFlags windowFlags,
163                           Qt::WindowModality windowModality,
164                           QWindow *parent) = 0;
165     virtual void hide() = 0;
166 
167     static QVariant defaultStyleHint(QPlatformDialogHelper::StyleHint hint);
168 
169     static const int *buttonLayout(Qt::Orientation orientation = Qt::Horizontal, ButtonLayout policy = UnknownLayout);
170     static ButtonRole buttonRole(StandardButton button);
171 
172 Q_SIGNALS:
173     void accept();
174     void reject();
175 };
176 
177 QT_END_NAMESPACE
Q_DECLARE_METATYPE(QPlatformDialogHelper::StandardButton)178 Q_DECLARE_METATYPE(QPlatformDialogHelper::StandardButton)
179 Q_DECLARE_METATYPE(QPlatformDialogHelper::ButtonRole)
180 QT_BEGIN_NAMESPACE
181 
182 class Q_GUI_EXPORT QColorDialogOptions
183 {
184     Q_GADGET
185     Q_DISABLE_COPY(QColorDialogOptions)
186 protected:
187     explicit QColorDialogOptions(QColorDialogOptionsPrivate *dd);
188     ~QColorDialogOptions();
189 public:
190     enum ColorDialogOption {
191         ShowAlphaChannel    = 0x00000001,
192         NoButtons           = 0x00000002,
193         DontUseNativeDialog = 0x00000004
194     };
195 
196     Q_DECLARE_FLAGS(ColorDialogOptions, ColorDialogOption)
197     Q_FLAG(ColorDialogOptions)
198 
199     static QSharedPointer<QColorDialogOptions> create();
200     QSharedPointer<QColorDialogOptions> clone() const;
201 
202     QString windowTitle() const;
203     void setWindowTitle(const QString &);
204 
205     void setOption(ColorDialogOption option, bool on = true);
206     bool testOption(ColorDialogOption option) const;
207     void setOptions(ColorDialogOptions options);
208     ColorDialogOptions options() const;
209 
210     static int customColorCount();
211     static QRgb customColor(int index);
212     static QRgb *customColors();
213     static void setCustomColor(int index, QRgb color);
214 
215     static QRgb *standardColors();
216     static QRgb standardColor(int index);
217     static void setStandardColor(int index, QRgb color);
218 
219 private:
220     QColorDialogOptionsPrivate *d;
221 };
222 
223 class Q_GUI_EXPORT QPlatformColorDialogHelper : public QPlatformDialogHelper
224 {
225     Q_OBJECT
226 public:
227     const QSharedPointer<QColorDialogOptions> &options() const;
228     void setOptions(const QSharedPointer<QColorDialogOptions> &options);
229 
230     virtual void setCurrentColor(const QColor &) = 0;
231     virtual QColor currentColor() const = 0;
232 
233 Q_SIGNALS:
234     void currentColorChanged(const QColor &color);
235     void colorSelected(const QColor &color);
236 
237 private:
238     QSharedPointer<QColorDialogOptions> m_options;
239 };
240 
241 class Q_GUI_EXPORT QFontDialogOptions
242 {
243     Q_GADGET
244     Q_DISABLE_COPY(QFontDialogOptions)
245 protected:
246     explicit QFontDialogOptions(QFontDialogOptionsPrivate *dd);
247     ~QFontDialogOptions();
248 
249 public:
250     enum FontDialogOption {
251         NoButtons           = 0x00000001,
252         DontUseNativeDialog = 0x00000002,
253         ScalableFonts       = 0x00000004,
254         NonScalableFonts    = 0x00000008,
255         MonospacedFonts     = 0x00000010,
256         ProportionalFonts   = 0x00000020
257     };
258 
259     Q_DECLARE_FLAGS(FontDialogOptions, FontDialogOption)
260     Q_FLAG(FontDialogOptions)
261 
262     static QSharedPointer<QFontDialogOptions> create();
263     QSharedPointer<QFontDialogOptions> clone() const;
264 
265     QString windowTitle() const;
266     void setWindowTitle(const QString &);
267 
268     void setOption(FontDialogOption option, bool on = true);
269     bool testOption(FontDialogOption option) const;
270     void setOptions(FontDialogOptions options);
271     FontDialogOptions options() const;
272 
273 private:
274     QFontDialogOptionsPrivate *d;
275 };
276 
277 class Q_GUI_EXPORT QPlatformFontDialogHelper : public QPlatformDialogHelper
278 {
279     Q_OBJECT
280 public:
281     virtual void setCurrentFont(const QFont &) = 0;
282     virtual QFont currentFont() const = 0;
283 
284     const QSharedPointer<QFontDialogOptions> &options() const;
285     void setOptions(const QSharedPointer<QFontDialogOptions> &options);
286 
287 Q_SIGNALS:
288     void currentFontChanged(const QFont &font);
289     void fontSelected(const QFont &font);
290 
291 private:
292     QSharedPointer<QFontDialogOptions> m_options;
293 };
294 
295 class Q_GUI_EXPORT QFileDialogOptions
296 {
297     Q_GADGET
298     Q_DISABLE_COPY(QFileDialogOptions)
299 protected:
300     QFileDialogOptions(QFileDialogOptionsPrivate *dd);
301     ~QFileDialogOptions();
302 
303 public:
304     enum ViewMode { Detail, List };
305     Q_ENUM(ViewMode)
306 
307     enum FileMode { AnyFile, ExistingFile, Directory, ExistingFiles, DirectoryOnly };
308     Q_ENUM(FileMode)
309 
310     enum AcceptMode { AcceptOpen, AcceptSave };
311     Q_ENUM(AcceptMode)
312 
313     enum DialogLabel { LookIn, FileName, FileType, Accept, Reject, DialogLabelCount };
314     Q_ENUM(DialogLabel)
315 
316     enum FileDialogOption
317     {
318         ShowDirsOnly                = 0x00000001,
319         DontResolveSymlinks         = 0x00000002,
320         DontConfirmOverwrite        = 0x00000004,
321 #if QT_DEPRECATED_SINCE(5, 14)
322         DontUseSheet Q_DECL_ENUMERATOR_DEPRECATED = 0x00000008,
323 #endif
324         DontUseNativeDialog         = 0x00000010,
325         ReadOnly                    = 0x00000020,
326         HideNameFilterDetails       = 0x00000040,
327         DontUseCustomDirectoryIcons = 0x00000080
328     };
329     Q_DECLARE_FLAGS(FileDialogOptions, FileDialogOption)
330     Q_FLAG(FileDialogOptions)
331 
332     static QSharedPointer<QFileDialogOptions> create();
333     QSharedPointer<QFileDialogOptions> clone() const;
334 
335     QString windowTitle() const;
336     void setWindowTitle(const QString &);
337 
338     void setOption(FileDialogOption option, bool on = true);
339     bool testOption(FileDialogOption option) const;
340     void setOptions(FileDialogOptions options);
341     FileDialogOptions options() const;
342 
343     QDir::Filters filter() const;
344     void setFilter(QDir::Filters filters);
345 
346     void setViewMode(ViewMode mode);
347     ViewMode viewMode() const;
348 
349     void setFileMode(FileMode mode);
350     FileMode fileMode() const;
351 
352     void setAcceptMode(AcceptMode mode);
353     AcceptMode acceptMode() const;
354 
355     void setSidebarUrls(const QList<QUrl> &urls);
356     QList<QUrl> sidebarUrls() const;
357 
358     bool useDefaultNameFilters() const;
359     void setUseDefaultNameFilters(bool d);
360 
361     void setNameFilters(const QStringList &filters);
362     QStringList nameFilters() const;
363 
364     void setMimeTypeFilters(const QStringList &filters);
365     QStringList mimeTypeFilters() const;
366 
367     void setDefaultSuffix(const QString &suffix);
368     QString defaultSuffix() const;
369 
370     void setHistory(const QStringList &paths);
371     QStringList history() const;
372 
373     void setLabelText(DialogLabel label, const QString &text);
374     QString labelText(DialogLabel label) const;
375     bool isLabelExplicitlySet(DialogLabel label);
376 
377     QUrl initialDirectory() const;
378     void setInitialDirectory(const QUrl &);
379 
380     QString initiallySelectedMimeTypeFilter() const;
381     void setInitiallySelectedMimeTypeFilter(const QString &);
382 
383     QString initiallySelectedNameFilter() const;
384     void setInitiallySelectedNameFilter(const QString &);
385 
386     QList<QUrl> initiallySelectedFiles() const;
387     void setInitiallySelectedFiles(const QList<QUrl> &);
388 
389     void setSupportedSchemes(const QStringList &schemes);
390     QStringList supportedSchemes() const;
391 
392     static QString defaultNameFilterString();
393 
394 private:
395     QFileDialogOptionsPrivate *d;
396 };
397 
398 class Q_GUI_EXPORT QPlatformFileDialogHelper : public QPlatformDialogHelper
399 {
400     Q_OBJECT
401 public:
402     virtual bool defaultNameFilterDisables() const = 0;
403     virtual void setDirectory(const QUrl &directory) = 0;
404     virtual QUrl directory() const = 0;
405     virtual void selectFile(const QUrl &filename) = 0;
406     virtual QList<QUrl> selectedFiles() const = 0;
407     virtual void setFilter() = 0;
408     virtual void selectMimeTypeFilter(const QString &filter);
409     virtual void selectNameFilter(const QString &filter) = 0;
410     virtual QString selectedMimeTypeFilter() const;
411     virtual QString selectedNameFilter() const = 0;
412 
413     virtual bool isSupportedUrl(const QUrl &url) const;
414 
415     const QSharedPointer<QFileDialogOptions> &options() const;
416     void setOptions(const QSharedPointer<QFileDialogOptions> &options);
417 
418     static QStringList cleanFilterList(const QString &filter);
419     static const char filterRegExp[];
420 
421 Q_SIGNALS:
422     void fileSelected(const QUrl &file);
423     void filesSelected(const QList<QUrl> &files);
424     void currentChanged(const QUrl &path);
425     void directoryEntered(const QUrl &directory);
426     void filterSelected(const QString &filter);
427 
428 private:
429     QSharedPointer<QFileDialogOptions> m_options;
430 };
431 
432 class Q_GUI_EXPORT QMessageDialogOptions
433 {
434     Q_GADGET
435     Q_DISABLE_COPY(QMessageDialogOptions)
436 protected:
437     QMessageDialogOptions(QMessageDialogOptionsPrivate *dd);
438     ~QMessageDialogOptions();
439 
440 public:
441     // Keep in sync with QMessageBox::Icon
442     enum Icon { NoIcon, Information, Warning, Critical, Question };
443     Q_ENUM(Icon)
444 
445     static QSharedPointer<QMessageDialogOptions> create();
446     QSharedPointer<QMessageDialogOptions> clone() const;
447 
448     QString windowTitle() const;
449     void setWindowTitle(const QString &);
450 
451     void setIcon(Icon icon);
452     Icon icon() const;
453 
454     void setText(const QString &text);
455     QString text() const;
456 
457     void setInformativeText(const QString &text);
458     QString informativeText() const;
459 
460     void setDetailedText(const QString &text);
461     QString detailedText() const;
462 
463     void setStandardButtons(QPlatformDialogHelper::StandardButtons buttons);
464     QPlatformDialogHelper::StandardButtons standardButtons() const;
465 
466     struct CustomButton {
467         explicit CustomButton(
468                 int id = -1, const QString &label = QString(),
469                 QPlatformDialogHelper::ButtonRole role = QPlatformDialogHelper::InvalidRole,
470                 void *button = nullptr) :
labelCustomButton471             label(label), role(role), id(id), button(button)
472         {}
473 
474         QString label;
475         QPlatformDialogHelper::ButtonRole role;
476         int id;
477         void *button; // strictly internal use only
478     };
479 
480     int addButton(const QString &label, QPlatformDialogHelper::ButtonRole role,
481                   void *buttonImpl = nullptr);
482     void removeButton(int id);
483     const QVector<CustomButton> &customButtons();
484     const CustomButton *customButton(int id);
485 
486 private:
487     QMessageDialogOptionsPrivate *d;
488 };
489 
490 class Q_GUI_EXPORT QPlatformMessageDialogHelper : public QPlatformDialogHelper
491 {
492     Q_OBJECT
493 public:
494     const QSharedPointer<QMessageDialogOptions> &options() const;
495     void setOptions(const QSharedPointer<QMessageDialogOptions> &options);
496 
497 Q_SIGNALS:
498     void clicked(QPlatformDialogHelper::StandardButton button, QPlatformDialogHelper::ButtonRole role);
499 
500 private:
501     QSharedPointer<QMessageDialogOptions> m_options;
502 };
503 
504 QT_END_NAMESPACE
505 
506 #endif // QPLATFORMDIALOGHELPER_H
507