File indexing completed on 2025-02-02 05:02:27

0001 /*
0002     SPDX-FileCopyrightText: 2019 Volker Krause <vkrause@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "documentsmodel.h"
0008 #include "documentmanager.h"
0009 
0010 #include <KItinerary/CreativeWork>
0011 #include <KItinerary/DocumentUtil>
0012 #include <KItinerary/JsonLdDocument>
0013 #include <KItinerary/Reservation>
0014 
0015 #include <QDebug>
0016 #include <QMimeDatabase>
0017 #include <QUrl>
0018 
0019 using namespace KItinerary;
0020 
0021 DocumentsModel::DocumentsModel(QObject *parent)
0022     : QAbstractListModel(parent)
0023 {
0024     connect(this, &DocumentsModel::setupChanged, this, &DocumentsModel::reload);
0025 }
0026 
0027 DocumentsModel::~DocumentsModel() = default;
0028 
0029 int DocumentsModel::rowCount(const QModelIndex& parent) const
0030 {
0031     if (parent.isValid()) {
0032         return 0;
0033     }
0034     return m_docIds.size();
0035 }
0036 
0037 QVariant DocumentsModel::data(const QModelIndex &index, int role) const
0038 {
0039     if (!index.isValid() || !m_docMgr) {
0040         return {};
0041     }
0042 
0043     switch (role) {
0044         case Qt::DisplayRole:
0045         {
0046             const auto info = m_docMgr->documentInfo(m_docIds[index.row()]);
0047             if (JsonLd::canConvert<CreativeWork>(info)) {
0048                 const auto docInfo = JsonLd::convert<CreativeWork>(info);
0049                 return docInfo.description().isEmpty() ? docInfo.name() : docInfo.description();
0050             }
0051             break;
0052         }
0053         case Qt::DecorationRole:
0054         {
0055             const auto info = m_docMgr->documentInfo(m_docIds[index.row()]);
0056             if (JsonLd::canConvert<CreativeWork>(info)) {
0057                 const auto docInfo = JsonLd::convert<CreativeWork>(info);
0058                 QMimeDatabase db;
0059                 const auto mt = db.mimeTypeForName(docInfo.encodingFormat());
0060                 return mt.iconName();
0061             }
0062             break;
0063         }
0064         case DocumentIdRole:
0065             return m_docIds[index.row()];
0066         case DocumentInfoRole:
0067             return m_docMgr->documentInfo(m_docIds[index.row()]);
0068         case DocumentFilePathRole:
0069             return QUrl::fromLocalFile(m_docMgr->documentFilePath(m_docIds[index.row()]));
0070     }
0071 
0072     return {};
0073 }
0074 
0075 QHash<int, QByteArray> DocumentsModel::roleNames() const
0076 {
0077     auto names = QAbstractListModel::roleNames();
0078     names.insert(DocumentIdRole, "id");
0079     names.insert(DocumentInfoRole, "info");
0080     names.insert(DocumentFilePathRole, "filePath");
0081     return names;
0082 }
0083 
0084 void DocumentsModel::setDocumentIds(const QStringList &docIds)
0085 {
0086     if (m_requestedDocIds == docIds) {
0087         return;
0088     }
0089     m_requestedDocIds = docIds;
0090     Q_EMIT requestedDocumentIdsChanged();
0091     reload();
0092 }
0093 
0094 void DocumentsModel::setDocumentManager(DocumentManager *mgr)
0095 {
0096     if (m_docMgr == mgr) {
0097         return;
0098     }
0099     m_docMgr = mgr;
0100 
0101     // ### can be done more efficiently!
0102     connect(mgr, &DocumentManager::documentAdded, this, &DocumentsModel::reload);
0103     connect(mgr, &DocumentManager::documentRemoved, this, &DocumentsModel::reload);
0104 
0105     Q_EMIT setupChanged();
0106 }
0107 
0108 void DocumentsModel::reload()
0109 {
0110     if (!m_docMgr) {
0111         return;
0112     }
0113 
0114     beginResetModel();
0115     m_docIds.clear();
0116     for (const auto &id : m_requestedDocIds) {
0117         if (!id.isEmpty() && m_docMgr->hasDocument(id)) {
0118             m_docIds.push_back(id);
0119         }
0120     }
0121 
0122     std::sort(m_docIds.begin(), m_docIds.end());
0123     m_docIds.erase(std::unique(m_docIds.begin(), m_docIds.end()), m_docIds.end());
0124     endResetModel();
0125     Q_EMIT emptyChanged();
0126 }
0127 
0128 bool DocumentsModel::isEmpty() const
0129 {
0130     return m_docIds.empty();
0131 }
0132 
0133 #include "moc_documentsmodel.cpp"