File indexing completed on 2024-04-14 05:46:50

0001 /*
0002  * SPDX-FileCopyrightText: 2021 by Alexander Stippich <a.stippich@gmx.net>
0003  *
0004  * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005  */
0006 
0007 #include "FormatModel.h"
0008 
0009 #include <QImageWriter>
0010 #include <QMimeType>
0011 #include <QMimeDatabase>
0012 
0013 #include <KLocalizedString>
0014 
0015 class FormatModelPrivate
0016 {
0017 public:
0018     QList<QMimeType> m_formatList;
0019     QVariantList m_formatFilter;
0020 };
0021 
0022 FormatModel::FormatModel(QObject *parent)
0023     : QAbstractListModel(parent)
0024     , d(std::make_unique<FormatModelPrivate>())
0025 {
0026     QList<QByteArray> tempList = QImageWriter::supportedMimeTypes();
0027     const QMimeDatabase mimeDB;
0028     // Put first class citizens at first place
0029     tempList.removeAll(QByteArray("image/jpeg"));
0030     tempList.removeAll(QByteArray("image/png"));
0031     int count = tempList.removeAll(QByteArray("image/tiff")); // TIFF is not on the base list of formats
0032     tempList.insert(0, QByteArray("application/pdf"));
0033     tempList.insert(1, QByteArray("image/png"));
0034     tempList.insert(2, QByteArray("image/jpeg"));
0035     if (count > 0) tempList.insert(3, QByteArray("image/tiff"));
0036 
0037     for (const auto &mimeString : tempList) {
0038         const QMimeType mimeType = mimeDB.mimeTypeForName(QString::fromLatin1(mimeString));
0039         d->m_formatList.append(mimeType);
0040         // craft a string that QML's FileDialog understands
0041         d->m_formatFilter.append({mimeType.comment() + QStringLiteral("(*.") + mimeType.preferredSuffix() + QStringLiteral(")")});
0042     }
0043 }
0044 
0045 FormatModel::~FormatModel()
0046 {
0047 }
0048 
0049 QHash<int, QByteArray> FormatModel::roleNames() const
0050 {
0051     QHash<int, QByteArray> roles;
0052     roles[NameRole] = "name";
0053     roles[SuffixRole] = "suffix";
0054     roles[CommentRole] = "comment";
0055     roles[NameFilterRole] = "nameFilter";
0056     return roles;
0057 }
0058 
0059 int FormatModel::rowCount(const QModelIndex &) const
0060 {
0061     return d->m_formatList.count();
0062 }
0063 
0064 QVariant FormatModel::data(const QModelIndex &index, int role) const
0065 {
0066     if (!index.isValid()) {
0067         return QVariant();
0068     }
0069 
0070     return getData(index.row(), role);
0071 }
0072 
0073 QVariant FormatModel::getData(int index, int role) const
0074 {
0075     if (index >= d->m_formatList.size() || index < 0) {
0076         return QVariant();
0077     }
0078 
0079     switch (role) {
0080     case NameRole:
0081         return d->m_formatList.at(index).name();
0082         break;
0083     case SuffixRole:
0084         return d->m_formatList.at(index).preferredSuffix();
0085         break;
0086     case CommentRole:
0087         return d->m_formatList.at(index).comment();
0088         break;
0089     case NameFilterRole:
0090         return d->m_formatFilter.at(index);
0091         break;
0092     default:
0093         break;
0094     }
0095     return QVariant();
0096 }
0097 
0098 QVariantList FormatModel::formatFilter() const
0099 {
0100     return d->m_formatFilter;
0101 }
0102 
0103 QString FormatModel::pdfFormatFilter() const
0104 {
0105     return d->m_formatFilter.at(0).toString();
0106 }
0107 
0108 #include "moc_FormatModel.cpp"