File indexing completed on 2024-04-21 16:20:01

0001 /*  This file is part of the KDE libraries
0002     SPDX-FileCopyrightText: 2013 Aleix Pol Gonzalez <aleixpol@blue-systems.com>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005 */
0006 
0007 #include <QApplication>
0008 #include <QCommandLineParser>
0009 #include <QDebug>
0010 #include <QFileDialog>
0011 #include <QMetaEnum>
0012 
0013 int main(int argc, char **argv)
0014 {
0015     QApplication app(argc, argv);
0016     app.setApplicationName(QStringLiteral("QFileDialogTest"));
0017     QCommandLineParser parser;
0018     parser.addHelpOption();
0019     parser.addOption(QCommandLineOption(QStringList(QStringLiteral("staticFunction")),
0020                                         QStringLiteral("Test one of the static convenience function: 'getOpenFileUrl', 'getExistingDirectory'"),
0021                                         QStringLiteral("function name")));
0022     parser.addOption(QCommandLineOption(QStringList(QStringLiteral("acceptMode")),
0023                                         QStringLiteral("File dialog acceptMode: 'open' or 'save'"),
0024                                         QStringLiteral("type"),
0025                                         QStringLiteral("open")));
0026     parser.addOption(QCommandLineOption(QStringList(QStringLiteral("confirmOverwrite")),
0027                                         QStringLiteral("Test overwrite option: 'on' or 'off'"),
0028                                         QStringLiteral("option"),
0029                                         QStringLiteral("on")));
0030     parser.addOption(QCommandLineOption(QStringList(QStringLiteral("nativeDialog")),
0031                                         QStringLiteral("Use the platform native dialog: 'on' or 'off'"),
0032                                         QStringLiteral("option"),
0033                                         QStringLiteral("on")));
0034     parser.addOption(QCommandLineOption(QStringList(QStringLiteral("fileMode")),
0035                                         QStringLiteral("File dialog fileMode: 'AnyFile' or 'ExistingFile' or 'Directory' or 'ExistingFiles'"),
0036                                         QStringLiteral("type")));
0037     parser.addOption(QCommandLineOption(QStringList(QStringLiteral("nameFilter")),
0038                                         QStringLiteral("Dialog nameFilter, e. g. 'cppfiles (*.cpp *.h *.hpp)', can be specified multiple times"),
0039                                         QStringLiteral("nameFilter"),
0040                                         QStringLiteral("Everything (*)")));
0041     parser.addOption(QCommandLineOption(QStringList(QStringLiteral("mimeTypeFilter")),
0042                                         QStringLiteral("Dialog mimeTypeFilter, e. g. 'application/json', can be specified multiple times"),
0043                                         QStringLiteral("mimeTypeFilter")));
0044     parser.addOption(QCommandLineOption(QStringList(QStringLiteral("selectNameFilter")),
0045                                         QStringLiteral("Initially selected nameFilter"),
0046                                         QStringLiteral("selectNameFilter")));
0047     parser.addOption(QCommandLineOption(QStringList(QStringLiteral("selectMimeTypeFilter")),
0048                                         QStringLiteral("Initially selected mimeTypeFilter"),
0049                                         QStringLiteral("selectMimeTypeFilter")));
0050     parser.addOption(QCommandLineOption(QStringList(QStringLiteral("selectFile")), QStringLiteral("Initially selected file"), QStringLiteral("filename")));
0051     parser.addOption(
0052         QCommandLineOption(QStringList(QStringLiteral("selectDirectory")), QStringLiteral("Initially selected directory"), QStringLiteral("dirname")));
0053     parser.addOption(
0054         QCommandLineOption(QStringList(QStringLiteral("modal")), QStringLiteral("Test modal dialog"), QStringLiteral("modality"), QStringLiteral("on")));
0055     parser.addOption(QCommandLineOption(QStringList(QStringLiteral("options")), QStringLiteral("See QFileDialog::Options"), QStringLiteral("option")));
0056     parser.process(app);
0057 
0058     const QString staticFunction = parser.value(QStringLiteral("staticFunction"));
0059     if (staticFunction == QLatin1String("getExistingDirectory")) {
0060         QString dir = QFileDialog::getExistingDirectory(nullptr, QStringLiteral("getExistingDirectory test"), QStringLiteral("/tmp"));
0061         qDebug() << dir;
0062         return 0;
0063     } else if (staticFunction == QLatin1String("getOpenFileUrl")) {
0064         qDebug() << QFileDialog::getOpenFileUrl(nullptr, QStringLiteral("getOpenFileUrl test"), QUrl::fromLocalFile(QDir::homePath()));
0065         return 0;
0066     }
0067 
0068     QFileDialog dialog;
0069     dialog.setAcceptMode(parser.value(QStringLiteral("acceptMode")) == QStringLiteral("open") ? QFileDialog::AcceptOpen : QFileDialog::AcceptSave);
0070 
0071     QString fileModeValue = parser.value(QStringLiteral("fileMode"));
0072     if (fileModeValue == QLatin1String("AnyFile")) {
0073         dialog.setFileMode(QFileDialog::AnyFile);
0074     } else if (fileModeValue == QLatin1String("ExistingFile")) {
0075         dialog.setFileMode(QFileDialog::ExistingFile);
0076     } else if (fileModeValue == QLatin1String("ExistingFiles")) {
0077         dialog.setFileMode(QFileDialog::ExistingFiles);
0078     } else if (fileModeValue == QLatin1String("Directory")) {
0079         dialog.setFileMode(QFileDialog::Directory);
0080     } else if (!fileModeValue.isEmpty()) {
0081         qDebug() << "Not implemented or not valid:" << fileModeValue;
0082         exit(0);
0083     }
0084 
0085     QStringList nameFilterList = parser.values(QStringLiteral("nameFilter"));
0086     if (nameFilterList.size() == 1) {
0087         dialog.setNameFilter(nameFilterList.first());
0088     } else {
0089         dialog.setNameFilters(nameFilterList);
0090     }
0091 
0092     if (parser.isSet(QStringLiteral("options"))) {
0093         auto optStrings = parser.values(QStringLiteral("options"));
0094         QFileDialog::Options options = {};
0095         const auto mo = QFileDialog::staticMetaObject;
0096         const auto enumerator = mo.indexOfEnumerator("Options");
0097         for (const auto &optString : qAsConst(optStrings)) {
0098             options |= QFileDialog::Option(mo.enumerator(enumerator).keyToValue(optString.toLatin1().constData()));
0099         }
0100         dialog.setOptions(options);
0101     }
0102 
0103     const auto mimeFilterList = parser.values(QStringLiteral("mimeTypeFilter"));
0104     if (!mimeFilterList.isEmpty()) {
0105         dialog.setMimeTypeFilters(mimeFilterList);
0106     }
0107 
0108     QString selectNameFilter = parser.value(QStringLiteral("selectNameFilter"));
0109     QString selectMimeTypeFilter = parser.value(QStringLiteral("selectMimeTypeFilter"));
0110     if (!selectNameFilter.isEmpty()) {
0111         dialog.selectNameFilter(selectNameFilter);
0112     } else if (!selectMimeTypeFilter.isEmpty()) {
0113         dialog.selectMimeTypeFilter(selectMimeTypeFilter);
0114     }
0115 
0116     if (parser.value(QStringLiteral("confirmOverwrite")) == QStringLiteral("off")) {
0117         dialog.setOption(QFileDialog::DontConfirmOverwrite, true);
0118     }
0119 
0120     if (parser.value(QStringLiteral("nativeDialog")) == QStringLiteral("off")) {
0121         dialog.setOption(QFileDialog::DontUseNativeDialog, true);
0122     }
0123 
0124     dialog.setDirectoryUrl(QUrl::fromUserInput(parser.value(QStringLiteral("selectDirectory")), {}, QUrl::AssumeLocalFile));
0125     dialog.selectFile(parser.value(QStringLiteral("selectFile")));
0126 
0127     int ret;
0128     if (parser.value(QStringLiteral("modal")) == QStringLiteral("off")) {
0129         dialog.show();
0130         ret = app.exec();
0131     } else {
0132         ret = dialog.exec();
0133     }
0134 
0135     if (dialog.result() == QDialog::Accepted) {
0136         qDebug() << "selected files" << dialog.selectedFiles();
0137         qDebug() << "selected urls" << dialog.selectedUrls();
0138         qDebug() << "selected mime type filter" << dialog.selectedMimeTypeFilter();
0139     }
0140 
0141     qDebug() << "mime type filter(s):" << dialog.mimeTypeFilters();
0142 
0143     return ret;
0144 }