File indexing completed on 2024-04-28 05:36:49

0001 /*
0002  * SPDX-FileCopyrightText: 2016-2019 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_APPCHOOSER_DIALOG_H
0010 #define XDG_DESKTOP_PORTAL_KDE_APPCHOOSER_DIALOG_H
0011 
0012 #include "quickdialog.h"
0013 
0014 #include <QAbstractListModel>
0015 #include <QSortFilterProxyModel>
0016 #include <qmimetype.h>
0017 
0018 #include <KService>
0019 
0020 class ApplicationItem
0021 {
0022 public:
0023     enum ApplicationCategory {
0024         PreferredApplication,
0025         AllApplications,
0026     };
0027 
0028     explicit ApplicationItem(const QString &name, const KService::Ptr &service);
0029 
0030     QString applicationName() const;
0031     QString applicationGenericName() const;
0032     QString applicationUntranslatedGenericName() const;
0033     QString applicationIcon() const;
0034     QString applicationDesktopFile() const;
0035     QList<QMimeType> supportedMimeTypes() const;
0036 
0037     void setApplicationCategory(ApplicationCategory category);
0038     ApplicationCategory applicationCategory() const;
0039 
0040     bool operator==(const ApplicationItem &item) const;
0041 
0042 private:
0043     QString m_applicationName;
0044     KService::Ptr m_applicationService;
0045     QList<QMimeType> m_supportedMimeTypes;
0046     ApplicationCategory m_applicationCategory;
0047 };
0048 
0049 class AppFilterModel : public QSortFilterProxyModel
0050 {
0051     Q_OBJECT
0052     Q_PROPERTY(bool showOnlyPreferredApps READ showOnlyPreferredApps WRITE setShowOnlyPreferredApps NOTIFY showOnlyPreferredAppsChanged)
0053     Q_PROPERTY(QString filter READ filter WRITE setFilter NOTIFY filterChanged)
0054 
0055 public:
0056     explicit AppFilterModel(QObject *parent = nullptr);
0057 
0058     void setShowOnlyPreferredApps(bool show);
0059     bool showOnlyPreferredApps() const;
0060 
0061     void setDefaultApp(const QString &);
0062     QString defaultApp() const;
0063 
0064     void setLastUsedApp(const QString &);
0065     QString lastUsedApp() const;
0066 
0067     void setFilter(const QString &text);
0068     QString filter() const;
0069 
0070 Q_SIGNALS:
0071     void showOnlyPreferredAppsChanged();
0072     void filterChanged();
0073 
0074 protected:
0075     bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override;
0076     bool lessThan(const QModelIndex &left, const QModelIndex &right) const override;
0077 
0078 private:
0079     bool m_showOnlyPreferredApps = true;
0080     QString m_filter;
0081     QString m_defaultApp;
0082     QString m_lastUsedApp;
0083 };
0084 
0085 class AppChooserData : public QObject
0086 {
0087     Q_OBJECT
0088     Q_PROPERTY(QString fileName READ fileName WRITE setFileName NOTIFY fileNameChanged)
0089     Q_PROPERTY(QString defaultApp READ defaultApp WRITE setDefaultApp NOTIFY defaultAppChanged)
0090     Q_PROPERTY(QString lastUsedApp READ lastUsedApp WRITE setLastUsedApp NOTIFY lastUsedAppChanged)
0091     Q_PROPERTY(QString mimeName READ mimeName WRITE setMimeName NOTIFY mimeNameChanged)
0092     Q_PROPERTY(QString mimeDesc READ mimeDesc NOTIFY mimeDescChanged)
0093 
0094 public:
0095     explicit AppChooserData(QObject *parent = nullptr);
0096 
0097     QString fileName() const;
0098     void setFileName(const QString &fileName);
0099     Q_SIGNAL void fileNameChanged();
0100 
0101     QString defaultApp() const;
0102     void setDefaultApp(const QString &defaultApp);
0103     Q_SIGNAL void defaultAppChanged();
0104 
0105     QString lastUsedApp() const;
0106     void setLastUsedApp(const QString &lastUsedApp);
0107     Q_SIGNAL void lastUsedAppChanged();
0108 
0109     QString mimeName() const;
0110     void setMimeName(const QString &mimeName);
0111     Q_SIGNAL void mimeNameChanged();
0112 
0113     QString mimeDesc() const;
0114     void setMimeDesc(const QString &mimeDesc);
0115     Q_SIGNAL void mimeDescChanged();
0116 
0117     Q_SIGNAL void applicationSelected(const QString &desktopFile, bool remember = false);
0118     Q_SIGNAL void openDiscover();
0119 
0120 private:
0121     QString m_defaultApp;
0122     QString m_lastUsedApp;
0123     QString m_fileName;
0124     QString m_mimeName;
0125 };
0126 
0127 class AppModel : public QAbstractListModel
0128 {
0129     Q_OBJECT
0130     Q_PROPERTY(bool hasPreferredApps MEMBER m_hasPreferredApps NOTIFY hasPreferredAppsChanged)
0131 public:
0132     enum ItemRoles {
0133         ApplicationNameRole = Qt::UserRole + 1,
0134         ApplicationGenericNameRole,
0135         ApplicationUntranslatedGenericNameRole,
0136         ApplicationIconRole,
0137         ApplicationDesktopFileRole,
0138         ApplicationCategoryRole,
0139         ApplicationSupportedMimeTypesRole,
0140     };
0141 
0142     explicit AppModel(QObject *parent = nullptr);
0143 
0144     void setPreferredApps(const QStringList &list);
0145 
0146     QVariant data(const QModelIndex &index, int role) const override;
0147     int rowCount(const QModelIndex &parent) const override;
0148     QHash<int, QByteArray> roleNames() const override;
0149 
0150 Q_SIGNALS:
0151     void hasPreferredAppsChanged();
0152 
0153 private:
0154     void loadApplications();
0155 
0156     QList<ApplicationItem> m_list;
0157     QHash<QString, QString> m_noDisplayAliasesFor;
0158     bool m_hasPreferredApps = false;
0159 };
0160 
0161 class AppChooserDialog : public QuickDialog
0162 {
0163     Q_OBJECT
0164 public:
0165     explicit AppChooserDialog(const QStringList &choices,
0166                               const QString &lastUsedApp,
0167                               const QString &fileName,
0168                               const QString &mimeName = QString(),
0169                               QObject *parent = nullptr);
0170     void updateChoices(const QStringList &choices);
0171 
0172     QString selectedApplication() const;
0173 private Q_SLOTS:
0174     void onApplicationSelected(const QString &desktopFile, const bool remember = false);
0175     void onOpenDiscover();
0176 
0177 private:
0178     AppModel *const m_model;
0179     QString m_selectedApplication;
0180     AppChooserData *const m_appChooserData;
0181 };
0182 
0183 #endif // XDG_DESKTOP_PORTAL_KDE_APPCHOOSER_DIALOG_H