File indexing completed on 2024-04-28 05:36:50
0001 /* 0002 * SPDX-FileCopyrightText: 2016-2018 Red Hat Inc 0003 * 0004 * SPDX-License-Identifier: LGPL-2.0-or-later 0005 * 0006 * SPDX-FileCopyrightText: 2016-2018 Jan Grulich <jgrulich@redhat.com> 0007 */ 0008 0009 #ifndef XDG_DESKTOP_PORTAL_KDE_FILECHOOSER_H 0010 #define XDG_DESKTOP_PORTAL_KDE_FILECHOOSER_H 0011 0012 #include <QCheckBox> 0013 #include <QComboBox> 0014 #include <QDBusAbstractAdaptor> 0015 #include <QDBusObjectPath> 0016 #include <QDialog> 0017 0018 #include <KConfigGroup> 0019 #include <KFileFilter> 0020 0021 class KFileWidget; 0022 class QDialogButtonBox; 0023 class MobileFileDialog; 0024 0025 class FileDialog : public QDialog 0026 { 0027 Q_OBJECT 0028 public: 0029 friend class FileChooserPortal; 0030 0031 explicit FileDialog(QDialog *parent = nullptr, Qt::WindowFlags flags = {}); 0032 ~FileDialog() override; 0033 Q_DISABLE_COPY_MOVE(FileDialog) 0034 0035 private: 0036 QDialogButtonBox *m_buttons; 0037 0038 protected: 0039 KFileWidget *const m_fileWidget; 0040 KConfigGroup m_configGroup; 0041 }; 0042 0043 class FileChooserPortal : public QDBusAbstractAdaptor 0044 { 0045 Q_OBJECT 0046 Q_CLASSINFO("D-Bus Interface", "org.freedesktop.impl.portal.FileChooser") 0047 public: 0048 // Keep in sync with qflatpakfiledialog from flatpak-platform-plugin 0049 typedef struct { 0050 uint type; 0051 QString filterString; 0052 } Filter; 0053 typedef QList<Filter> Filters; 0054 0055 typedef struct { 0056 QString userVisibleName; 0057 Filters filters; 0058 } FilterList; 0059 typedef QList<FilterList> FilterListList; 0060 0061 typedef struct { 0062 QString id; 0063 QString value; 0064 } Choice; 0065 typedef QList<Choice> Choices; 0066 0067 typedef struct { 0068 QString id; 0069 QString label; 0070 Choices choices; 0071 QString initialChoiceId; 0072 } Option; 0073 typedef QList<Option> OptionList; 0074 0075 explicit FileChooserPortal(QObject *parent); 0076 0077 public Q_SLOTS: 0078 uint OpenFile(const QDBusObjectPath &handle, 0079 const QString &app_id, 0080 const QString &parent_window, 0081 const QString &title, 0082 const QVariantMap &options, 0083 QVariantMap &results); 0084 0085 uint SaveFile(const QDBusObjectPath &handle, 0086 const QString &app_id, 0087 const QString &parent_window, 0088 const QString &title, 0089 const QVariantMap &options, 0090 QVariantMap &results); 0091 0092 private: 0093 static QWidget *CreateChoiceControls(const OptionList &optionList, QMap<QString, QCheckBox *> &checkboxes, QMap<QString, QComboBox *> &comboboxes); 0094 0095 static QVariant EvaluateSelectedChoices(const QMap<QString, QCheckBox *> &checkboxes, const QMap<QString, QComboBox *> &comboboxes); 0096 0097 static QString ExtractAcceptLabel(const QVariantMap &options); 0098 0099 struct FilterExtract { 0100 QVector<KFileFilter> filters; 0101 KFileFilter currentFilter; 0102 }; 0103 0104 static FilterExtract ExtractFilters(const QVariantMap &options); 0105 0106 static bool isMobile(); 0107 0108 static FilterList fileFilterToFilterList(const KFileFilter &filter); 0109 static KFileFilter filterListToFileFilter(const FilterList &list); 0110 0111 MobileFileDialog *m_mobileFileDialog = nullptr; 0112 }; 0113 0114 #endif // XDG_DESKTOP_PORTAL_KDE_FILECHOOSER_H