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