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