QGCFileDialog.h 7.32 KB
Newer Older
Don Gagne's avatar
Don Gagne committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/*=====================================================================
 
 QGroundControl Open Source Ground Control Station
 
 (c) 2009 - 2014 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
 
 This file is part of the QGROUNDCONTROL project
 
 QGROUNDCONTROL is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, either version 3 of the License, or
 (at your option) any later version.
 
 QGROUNDCONTROL is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
 
 ======================================================================*/

#ifndef QGCFILEDIALOG_H
#define QGCFILEDIALOG_H

#include <QFileDialog>

/// @file
30
///     @brief Subclass of <a href="http://qt-project.org/doc/qt-5/qfiledialog.html">QFileDialog</a>
Don Gagne's avatar
Don Gagne committed
31
32
///     @author Don Gagne <don@thegagnes.com>

dogmaphobic's avatar
dogmaphobic committed
33
/*!
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
    Subclass of <a href="http://qt-project.org/doc/qt-5/qfiledialog.html">QFileDialog</a> which re-implements the static public functions. The reason for this
    is that the <a href="http://qt-project.org/doc/qt-5/qfiledialog.html">QFileDialog</a> implementations of these use the native os dialogs. On OSX these
    these can intermittently hang. So instead here we use the native dialogs. It also allows
    use to catch these dialogs for unit testing.
    @remark If you need to know what type of file was returned by these functions, you can use something like:
    @code{.cpp}
    QString filename = QGCFileDialog::getSaveFileName(this, tr("Save File"), "~/", "Foo files (*.foo);;All Files (*.*)", "foo");
    if (!filename.isEmpty()) {
        QFileInfo fi(filename);
        QString fileExtension(fi.suffix());
        if (fileExtension == QString("foo")) {
            // do something
        }
    }
    @endcode
dogmaphobic's avatar
dogmaphobic committed
49
50
*/

Don Gagne's avatar
Don Gagne committed
51
52
53
class QGCFileDialog : public QFileDialog {
    
public:
dogmaphobic's avatar
dogmaphobic committed
54
55
56

    //! Static helper that will return an existing directory selected by the user.
    /*!
dogmaphobic's avatar
dogmaphobic committed
57
58
59
60
61
62
        @param[in] parent The parent QWidget.
        @param[in] caption The caption displayed at the top of the dialog.
        @param[in] dir The initial directory shown to the user.
        @param[in] options Set the various options that affect the look and feel of the dialog.
        @return The chosen path or \c QString("") if none.
        @sa <a href="http://qt-project.org/doc/qt-5/qfiledialog.html#getExistingDirectory">QFileDialog::getExistingDirectory()</a>
dogmaphobic's avatar
dogmaphobic committed
63
    */
64
65
66
67
68
    static QString getExistingDirectory(
        QWidget* parent = 0,
        const QString& caption = QString(),
        const QString& dir = QString(),
        Options options = ShowDirsOnly);
Don Gagne's avatar
Don Gagne committed
69
    
dogmaphobic's avatar
dogmaphobic committed
70
71
    //! Static helper that invokes a File Open dialog where the user can select a file to be opened.
    /*!
dogmaphobic's avatar
dogmaphobic committed
72
73
74
75
76
77
78
        @param[in] parent The parent QWidget.
        @param[in] caption The caption displayed at the top of the dialog.
        @param[in] dir The initial directory shown to the user.
        @param[in] filter The filter used for selecting the file type.
        @param[in] options Set the various options that affect the look and feel of the dialog.
        @return The full path and filename to be opened or \c QString("") if none.
        @sa <a href="http://qt-project.org/doc/qt-5/qfiledialog.html#getOpenFileName">QFileDialog::getOpenFileName()</a>
dogmaphobic's avatar
dogmaphobic committed
79
    */
80
81
82
83
84
85
    static QString getOpenFileName(
        QWidget* parent = 0,
        const QString& caption = QString(),
        const QString& dir = QString(),
        const QString& filter = QString(),
        Options options = 0);
Don Gagne's avatar
Don Gagne committed
86
    
dogmaphobic's avatar
dogmaphobic committed
87
88
    //! Static helper that invokes a File Open dialog where the user can select one or more files to be opened.
    /*!
dogmaphobic's avatar
dogmaphobic committed
89
90
91
92
93
94
95
        @param[in] parent The parent QWidget.
        @param[in] caption The caption displayed at the top of the dialog.
        @param[in] dir The initial directory shown to the user.
        @param[in] filter The filter used for selecting the file type.
        @param[in] options Set the various options that affect the look and feel of the dialog.
        @return A <a href="http://qt-project.org/doc/qt-5/qstringlist.html">QStringList</a> object containing zero or more files to be opened.
        @sa <a href="http://qt-project.org/doc/qt-5/qfiledialog.html#getOpenFileNames">QFileDialog::getOpenFileNames()</a>
dogmaphobic's avatar
dogmaphobic committed
96
    */
97
98
99
100
101
102
    static QStringList getOpenFileNames(
        QWidget* parent = 0,
        const QString& caption = QString(),
        const QString& dir = QString(),
        const QString& filter = QString(),
        Options options = 0);
Don Gagne's avatar
Don Gagne committed
103
    
dogmaphobic's avatar
dogmaphobic committed
104
105
    //! Static helper that invokes a File Save dialog where the user can select a directory and enter a filename to be saved.
    /*!
dogmaphobic's avatar
dogmaphobic committed
106
107
108
109
110
111
112
113
114
115
116
117
118
119
        @param[in] parent The parent QWidget.
        @param[in] caption The caption displayed at the top of the dialog.
        @param[in] dir The initial directory shown to the user.
        @param[in] filter The filter used for selecting the file type.
        @param[in] defaultSuffix Specifies a string that will be added to the filename if it has no suffix already. The suffix is typically used to indicate the file type (e.g. "txt" indicates a text file).
        @param[in] strict Makes the default suffix mandatory. Only files with those extensions will be allowed.
        @param[in] options Set the various options that affect the look and feel of the dialog.
        @return The full path and filename to be used to save the file or \c QString("") if none.
        @sa <a href="http://qt-project.org/doc/qt-5/qfiledialog.html#getSaveFileName">QFileDialog::getSaveFileName()</a>
        @remark If a default suffix is given, it will be appended to the filename if the user does not enter one themselves. That is, if the user simply enters \e foo and the default suffix is set to \e bar,
        the returned filename will be \e foo.bar. However, if the user specifies a suffix, the \e strict flag will determine what is done. If the user enters \e foo.txt and \e strict is false, the function
        returns \e foo.txt (no suffix enforced). If \e strict is true however, the default suffix is appended no matter what. In the case above, the function will return \e foo.txt.bar (suffix enforced).
        @remark If \e strict is set and the file name given by the user is renamed (the \e foo.txt.bar example above), the function will check and see if the file already exists. If that's the case, it will
        ask the user if they want to overwrite it.
dogmaphobic's avatar
dogmaphobic committed
120
    */
121
122
123
124
125
    static QString getSaveFileName(
        QWidget* parent = 0,
        const QString& caption = QString(),
        const QString& dir = QString(),
        const QString& filter = QString(),
126
        const QString& defaultSuffix = QString(),
127
        bool strict = false,
128
129
        Options options = 0);

Don Gagne's avatar
Don Gagne committed
130
private slots:
dogmaphobic's avatar
dogmaphobic committed
131
    /// @brief The exec slot is private because we only want QGCFileDialog users to use the static methods. Otherwise it will break
132
    ///        unit testing.
Don Gagne's avatar
Don Gagne committed
133
134
135
    int exec(void) { return QGCFileDialog::exec(); }
    
private:
136
    static void    _validate(Options& options);
137
138
    static bool    _validateExtension(const QString& filter, const QString& extension);
    static QString _getFirstExtensionInFilter(const QString& filter);
Don Gagne's avatar
Don Gagne committed
139
140
141
142
};


#endif