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"