QPlatformDialogHelper: change ButtonRole flags to ensure 32-bit size
[qt:qtbase.git] / src / gui / kernel / qplatformdialoghelper.h
1 /****************************************************************************
2 **
3 ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/legal
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 Digia.  For licensing terms and
14 ** conditions see http://qt.digia.com/licensing.  For further information
15 ** use the contact form at http://qt.digia.com/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 2.1 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL included in the
21 ** packaging of this file.  Please review the following information to
22 ** ensure the GNU Lesser General Public License version 2.1 requirements
23 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24 **
25 ** In addition, as a special exception, Digia gives you certain additional
26 ** rights.  These rights are described in the Digia Qt LGPL Exception
27 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
28 **
29 ** GNU General Public License Usage
30 ** Alternatively, this file may be used under the terms of the GNU
31 ** General Public License version 3.0 as published by the Free Software
32 ** Foundation and appearing in the file LICENSE.GPL included in the
33 ** packaging of this file.  Please review the following information to
34 ** ensure the GNU General Public License version 3.0 requirements will be
35 ** met: http://www.gnu.org/copyleft/gpl.html.
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41
42 #ifndef QPLATFORMDIALOGHELPER_H
43 #define QPLATFORMDIALOGHELPER_H
44
45 //
46 //  W A R N I N G
47 //  -------------
48 //
49 // This file is part of the QPA API and is not meant to be used
50 // in applications. Usage of this API may make your code
51 // source and binary incompatible with future versions of Qt.
52 //
53
54 #include <QtCore/QtGlobal>
55 #include <QtCore/QObject>
56 #include <QtCore/QList>
57 #include <QtCore/QSharedDataPointer>
58 #include <QtCore/QSharedPointer>
59 #include <QtCore/QDir>
60 #include <QtCore/QUrl>
61 #include <QtGui/QRgb>
62
63 QT_BEGIN_NAMESPACE
64
65
66 class QString;
67 class QColor;
68 class QFont;
69 class QWindow;
70 class QVariant;
71 class QUrl;
72 class QColorDialogOptionsPrivate;
73 class QFontDialogOptionsPrivate;
74 class QFileDialogOptionsPrivate;
75 class QMessageDialogOptionsPrivate;
76
77 class Q_GUI_EXPORT QPlatformDialogHelper : public QObject
78 {
79     Q_OBJECT
80 public:
81     enum StyleHint {
82     };
83     enum DialogCode { Rejected, Accepted };
84
85     enum StandardButton {
86         // keep this in sync with QDialogButtonBox::StandardButton and QMessageBox::StandardButton
87         NoButton           = 0x00000000,
88         Ok                 = 0x00000400,
89         Save               = 0x00000800,
90         SaveAll            = 0x00001000,
91         Open               = 0x00002000,
92         Yes                = 0x00004000,
93         YesToAll           = 0x00008000,
94         No                 = 0x00010000,
95         NoToAll            = 0x00020000,
96         Abort              = 0x00040000,
97         Retry              = 0x00080000,
98         Ignore             = 0x00100000,
99         Close              = 0x00200000,
100         Cancel             = 0x00400000,
101         Discard            = 0x00800000,
102         Help               = 0x01000000,
103         Apply              = 0x02000000,
104         Reset              = 0x04000000,
105         RestoreDefaults    = 0x08000000,
106
107
108         FirstButton        = Ok,                // internal
109         LastButton         = RestoreDefaults,   // internal
110         LowestBit          = 10,                // internal: log2(FirstButton)
111         HighestBit         = 27                 // internal: log2(LastButton)
112     };
113
114     Q_DECLARE_FLAGS(StandardButtons, StandardButton)
115
116     enum ButtonRole {
117         // keep this in sync with QDialogButtonBox::ButtonRole and QMessageBox::ButtonRole
118         // TODO Qt 6: make the enum copies explicit, and make InvalidRole == 0 so that
119         // AcceptRole can be or'ed with flags, and EOL can be the same as InvalidRole (null-termination)
120         InvalidRole = -1,
121         AcceptRole,
122         RejectRole,
123         DestructiveRole,
124         ActionRole,
125         HelpRole,
126         YesRole,
127         NoRole,
128         ResetRole,
129         ApplyRole,
130
131         NRoles,
132
133         RoleMask        = 0x0FFFFFFF,
134         AlternateRole   = 0x10000000,
135         Stretch         = 0x20000000,
136         Reverse         = 0x40000000,
137         EOL             = InvalidRole
138     };
139
140     enum ButtonLayout {
141         // keep this in sync with QDialogButtonBox::ButtonLayout and QMessageBox::ButtonLayout
142         UnknownLayout = -1,
143         WinLayout,
144         MacLayout,
145         KdeLayout,
146         GnomeLayout,
147         MacModelessLayout
148     };
149
150     QPlatformDialogHelper();
151     virtual ~QPlatformDialogHelper();
152
153     virtual QVariant styleHint(StyleHint hint) const;
154
155     virtual void exec() = 0;
156     virtual bool show(Qt::WindowFlags windowFlags,
157                           Qt::WindowModality windowModality,
158                           QWindow *parent) = 0;
159     virtual void hide() = 0;
160
161     static QVariant defaultStyleHint(QPlatformDialogHelper::StyleHint hint);
162
163     static const int *buttonLayout(Qt::Orientation orientation = Qt::Horizontal, ButtonLayout policy = UnknownLayout);
164     static ButtonRole buttonRole(StandardButton button);
165
166 Q_SIGNALS:
167     void accept();
168     void reject();
169 };
170
171 class Q_GUI_EXPORT QColorDialogOptions
172 {
173 public:
174     enum ColorDialogOption {
175         ShowAlphaChannel    = 0x00000001,
176         NoButtons           = 0x00000002,
177         DontUseNativeDialog = 0x00000004
178     };
179
180     Q_DECLARE_FLAGS(ColorDialogOptions, ColorDialogOption)
181
182     QColorDialogOptions();
183     QColorDialogOptions(const QColorDialogOptions &rhs);
184     QColorDialogOptions &operator=(const QColorDialogOptions &rhs);
185     ~QColorDialogOptions();
186
187     void swap(QColorDialogOptions &other) { qSwap(d, other.d); }
188
189     QString windowTitle() const;
190     void setWindowTitle(const QString &);
191
192     void setOption(ColorDialogOption option, bool on = true);
193     bool testOption(ColorDialogOption option) const;
194     void setOptions(ColorDialogOptions options);
195     ColorDialogOptions options() const;
196
197     static int customColorCount();
198     static QRgb customColor(int index);
199     static QRgb *customColors();
200     static void setCustomColor(int index, QRgb color);
201
202     static QRgb *standardColors();
203     static QRgb standardColor(int index);
204     static void setStandardColor(int index, QRgb color);
205
206 private:
207     QSharedDataPointer<QColorDialogOptionsPrivate> d;
208 };
209
210 Q_DECLARE_SHARED(QColorDialogOptions)
211
212 class Q_GUI_EXPORT QPlatformColorDialogHelper : public QPlatformDialogHelper
213 {
214     Q_OBJECT
215 public:
216     const QSharedPointer<QColorDialogOptions> &options() const;
217     void setOptions(const QSharedPointer<QColorDialogOptions> &options);
218
219     virtual void setCurrentColor(const QColor &) = 0;
220     virtual QColor currentColor() const = 0;
221
222 Q_SIGNALS:
223     void currentColorChanged(const QColor &color);
224     void colorSelected(const QColor &color);
225
226 private:
227     QSharedPointer<QColorDialogOptions> m_options;
228 };
229
230 class Q_GUI_EXPORT QFontDialogOptions
231 {
232 public:
233     enum FontDialogOption {
234         NoButtons           = 0x00000001,
235         DontUseNativeDialog = 0x00000002,
236         ScalableFonts       = 0x00000004,
237         NonScalableFonts    = 0x00000008,
238         MonospacedFonts     = 0x00000010,
239         ProportionalFonts   = 0x00000020
240     };
241
242     Q_DECLARE_FLAGS(FontDialogOptions, FontDialogOption)
243
244     QFontDialogOptions();
245     QFontDialogOptions(const QFontDialogOptions &rhs);
246     QFontDialogOptions &operator=(const QFontDialogOptions &rhs);
247     ~QFontDialogOptions();
248
249     void swap(QFontDialogOptions &other) { qSwap(d, other.d); }
250
251     QString windowTitle() const;
252     void setWindowTitle(const QString &);
253
254     void setOption(FontDialogOption option, bool on = true);
255     bool testOption(FontDialogOption option) const;
256     void setOptions(FontDialogOptions options);
257     FontDialogOptions options() const;
258
259 private:
260     QSharedDataPointer<QFontDialogOptionsPrivate> d;
261 };
262
263 Q_DECLARE_SHARED(QFontDialogOptions)
264
265 class Q_GUI_EXPORT QPlatformFontDialogHelper : public QPlatformDialogHelper
266 {
267     Q_OBJECT
268 public:
269     virtual void setCurrentFont(const QFont &) = 0;
270     virtual QFont currentFont() const = 0;
271
272     const QSharedPointer<QFontDialogOptions> &options() const;
273     void setOptions(const QSharedPointer<QFontDialogOptions> &options);
274
275 Q_SIGNALS:
276     void currentFontChanged(const QFont &font);
277     void fontSelected(const QFont &font);
278
279 private:
280     QSharedPointer<QFontDialogOptions> m_options;
281 };
282
283 class Q_GUI_EXPORT QFileDialogOptions
284 {
285 public:
286     enum ViewMode { Detail, List };
287     enum FileMode { AnyFile, ExistingFile, Directory, ExistingFiles, DirectoryOnly };
288     enum AcceptMode { AcceptOpen, AcceptSave };
289     enum DialogLabel { LookIn, FileName, FileType, Accept, Reject, DialogLabelCount };
290
291     enum FileDialogOption
292     {
293         ShowDirsOnly                = 0x00000001,
294         DontResolveSymlinks         = 0x00000002,
295         DontConfirmOverwrite        = 0x00000004,
296         DontUseSheet                = 0x00000008,
297         DontUseNativeDialog         = 0x00000010,
298         ReadOnly                    = 0x00000020,
299         HideNameFilterDetails       = 0x00000040,
300         DontUseCustomDirectoryIcons = 0x00000080
301     };
302     Q_DECLARE_FLAGS(FileDialogOptions, FileDialogOption)
303
304     QFileDialogOptions();
305     QFileDialogOptions(const QFileDialogOptions &rhs);
306     QFileDialogOptions &operator=(const QFileDialogOptions &rhs);
307     ~QFileDialogOptions();
308
309     void swap(QFileDialogOptions &other) { qSwap(d, other.d); }
310
311     QString windowTitle() const;
312     void setWindowTitle(const QString &);
313
314     void setOption(FileDialogOption option, bool on = true);
315     bool testOption(FileDialogOption option) const;
316     void setOptions(FileDialogOptions options);
317     FileDialogOptions options() const;
318
319     QDir::Filters filter() const;
320     void setFilter(QDir::Filters filters);
321
322     void setViewMode(ViewMode mode);
323     ViewMode viewMode() const;
324
325     void setFileMode(FileMode mode);
326     FileMode fileMode() const;
327
328     void setAcceptMode(AcceptMode mode);
329     AcceptMode acceptMode() const;
330
331     void setSidebarUrls(const QList<QUrl> &urls);
332     QList<QUrl> sidebarUrls() const;
333
334     void setNameFilters(const QStringList &filters);
335     QStringList nameFilters() const;
336
337     void setMimeTypeFilters(const QStringList &filters);
338     QStringList mimeTypeFilters() const;
339
340     void setDefaultSuffix(const QString &suffix);
341     QString defaultSuffix() const;
342
343     void setHistory(const QStringList &paths);
344     QStringList history() const;
345
346     void setLabelText(DialogLabel label, const QString &text);
347     QString labelText(DialogLabel label) const;
348     bool isLabelExplicitlySet(DialogLabel label);
349
350     QUrl initialDirectory() const;
351     void setInitialDirectory(const QUrl &);
352
353     QString initiallySelectedNameFilter() const;
354     void setInitiallySelectedNameFilter(const QString &);
355
356     QList<QUrl> initiallySelectedFiles() const;
357     void setInitiallySelectedFiles(const QList<QUrl> &);
358
359 private:
360     QSharedDataPointer<QFileDialogOptionsPrivate> d;
361 };
362
363 Q_DECLARE_SHARED(QFileDialogOptions)
364
365 class Q_GUI_EXPORT QPlatformFileDialogHelper : public QPlatformDialogHelper
366 {
367     Q_OBJECT
368 public:
369     virtual bool defaultNameFilterDisables() const = 0;
370     virtual void setDirectory(const QUrl &directory) = 0;
371     virtual QUrl directory() const = 0;
372     virtual void selectFile(const QUrl &filename) = 0;
373     virtual QList<QUrl> selectedFiles() const = 0;
374     virtual void setFilter() = 0;
375     virtual void selectNameFilter(const QString &filter) = 0;
376     virtual QString selectedNameFilter() const = 0;
377
378     virtual bool isSupportedUrl(const QUrl &url) const;
379
380     const QSharedPointer<QFileDialogOptions> &options() const;
381     void setOptions(const QSharedPointer<QFileDialogOptions> &options);
382
383     static QStringList cleanFilterList(const QString &filter);
384     static const char *filterRegExp;
385
386 Q_SIGNALS:
387     void fileSelected(const QUrl &file);
388     void filesSelected(const QList<QUrl> &files);
389     void currentChanged(const QUrl &path);
390     void directoryEntered(const QUrl &directory);
391     void filterSelected(const QString &filter);
392
393 private:
394     QSharedPointer<QFileDialogOptions> m_options;
395 };
396
397 class Q_GUI_EXPORT QMessageDialogOptions
398 {
399 public:
400     // Keep in sync with QMessageBox::Icon
401     enum Icon { NoIcon, Information, Warning, Critical, Question };
402
403     QMessageDialogOptions();
404     QMessageDialogOptions(const QMessageDialogOptions &rhs);
405     QMessageDialogOptions &operator=(const QMessageDialogOptions &rhs);
406     ~QMessageDialogOptions();
407
408     void swap(QMessageDialogOptions &other) { qSwap(d, other.d); }
409
410     QString windowTitle() const;
411     void setWindowTitle(const QString &);
412
413     void setIcon(Icon icon);
414     Icon icon() const;
415
416     void setText(const QString &text);
417     QString text() const;
418
419     void setInformativeText(const QString &text);
420     QString informativeText() const;
421
422     void setDetailedText(const QString &text);
423     QString detailedText() const;
424
425     void setStandardButtons(QPlatformDialogHelper::StandardButtons buttons);
426     QPlatformDialogHelper::StandardButtons standardButtons() const;
427
428 private:
429     QSharedDataPointer<QMessageDialogOptionsPrivate> d;
430 };
431
432 Q_DECLARE_SHARED(QMessageDialogOptions)
433
434 class Q_GUI_EXPORT QPlatformMessageDialogHelper : public QPlatformDialogHelper
435 {
436     Q_OBJECT
437 public:
438     const QSharedPointer<QMessageDialogOptions> &options() const;
439     void setOptions(const QSharedPointer<QMessageDialogOptions> &options);
440
441 Q_SIGNALS:
442     void clicked(QPlatformDialogHelper::StandardButton button, QPlatformDialogHelper::ButtonRole role);
443
444 private:
445     QSharedPointer<QMessageDialogOptions> m_options;
446 };
447
448 QT_END_NAMESPACE
449
450 #endif // QPLATFORMDIALOGHELPER_H