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