1 // SPDX-FileCopyrightText: 2021 Claudio Cambra <claudio.cambra@gmail.com>
2 // SPDX-License-Identifier: LGPL-2.1-or-later
3 
4 #include "attachmentsmodel.h"
5 #include "kalendar_debug.h"
6 #include <QDebug>
7 #include <QMetaEnum>
8 
AttachmentsModel(QObject * parent,KCalendarCore::Incidence::Ptr incidencePtr)9 AttachmentsModel::AttachmentsModel(QObject *parent, KCalendarCore::Incidence::Ptr incidencePtr)
10     : QAbstractListModel(parent)
11     , m_incidence(incidencePtr)
12 {
13     for (int i = 0; i < QMetaEnum::fromType<AttachmentsModel::Roles>().keyCount(); i++) {
14         const int value = QMetaEnum::fromType<AttachmentsModel::Roles>().value(i);
15         const QString key = QLatin1String(roleNames().value(value));
16         m_dataRoles[key] = value;
17     }
18 }
19 
incidencePtr()20 KCalendarCore::Incidence::Ptr AttachmentsModel::incidencePtr()
21 {
22     return m_incidence;
23 }
24 
setIncidencePtr(KCalendarCore::Incidence::Ptr incidence)25 void AttachmentsModel::setIncidencePtr(KCalendarCore::Incidence::Ptr incidence)
26 {
27     if (m_incidence == incidence) {
28         return;
29     }
30     m_incidence = incidence;
31     Q_EMIT incidencePtrChanged();
32     Q_EMIT attachmentsChanged();
33     Q_EMIT layoutChanged();
34 }
35 
attachments()36 KCalendarCore::Attachment::List AttachmentsModel::attachments()
37 {
38     return m_incidence->attachments();
39 }
40 
dataroles()41 QVariantMap AttachmentsModel::dataroles()
42 {
43     return m_dataRoles;
44 }
45 
data(const QModelIndex & idx,int role) const46 QVariant AttachmentsModel::data(const QModelIndex &idx, int role) const
47 {
48     if (!hasIndex(idx.row(), idx.column())) {
49         return {};
50     }
51 
52     KCalendarCore::Attachment attachment = m_incidence->attachments()[idx.row()];
53     switch (role) {
54     case AttachmentRole:
55         return QVariant::fromValue(attachment);
56     case LabelRole:
57         return attachment.label();
58     case MimeTypeRole:
59         return attachment.mimeType();
60     case IconNameRole: {
61         QMimeType type = m_mimeDb.mimeTypeForUrl(QUrl(attachment.uri()));
62         return type.iconName();
63     }
64     case DataRole:
65         return attachment.data(); // This is in bytes
66     case SizeRole:
67         return attachment.size();
68     case URIRole:
69         return attachment.uri();
70     default:
71         qCWarning(KALENDAR_LOG) << "Unknown role for attachment:" << QMetaEnum::fromType<Roles>().valueToKey(role);
72         return {};
73     }
74 }
75 
roleNames() const76 QHash<int, QByteArray> AttachmentsModel::roleNames() const
77 {
78     return {
79         {AttachmentRole, QByteArrayLiteral("attachment")},
80         {LabelRole, QByteArrayLiteral("attachmentLabel")},
81         {MimeTypeRole, QByteArrayLiteral("mimetype")},
82         {IconNameRole, QByteArrayLiteral("iconName")},
83         {DataRole, QByteArrayLiteral("data")},
84         {SizeRole, QByteArrayLiteral("size")},
85         {URIRole, QByteArrayLiteral("uri")},
86     };
87 }
88 
rowCount(const QModelIndex &) const89 int AttachmentsModel::rowCount(const QModelIndex &) const
90 {
91     return m_incidence->attachments().size();
92 }
93 
addAttachment(QString uri)94 void AttachmentsModel::addAttachment(QString uri)
95 {
96     QMimeType type = m_mimeDb.mimeTypeForUrl(QUrl(uri));
97 
98     KCalendarCore::Attachment attachment(uri);
99     attachment.setLabel(QUrl(uri).fileName());
100     attachment.setMimeType(type.name());
101     m_incidence->addAttachment(attachment);
102 
103     Q_EMIT attachmentsChanged();
104     Q_EMIT layoutChanged();
105 }
106 
deleteAttachment(QString uri)107 void AttachmentsModel::deleteAttachment(QString uri)
108 {
109     KCalendarCore::Attachment::List attachments = m_incidence->attachments();
110 
111     for (const auto &attachment : attachments) {
112         if (attachment.uri() == uri) {
113             attachments.removeAll(attachment);
114             break;
115         }
116     }
117 
118     m_incidence->clearAttachments();
119 
120     for (const auto &attachment : attachments) {
121         m_incidence->addAttachment(attachment);
122     }
123 
124     Q_EMIT attachmentsChanged();
125     Q_EMIT layoutChanged();
126 }
127