File indexing completed on 2024-05-05 05:28:19
0001 /* 0002 * SPDX-FileCopyrightText: 2021 Dimitris Kardarakos <dimkard@posteo.net> 0003 * 0004 * SPDX-License-Identifier: GPL-3.0-or-later 0005 */ 0006 0007 #include "attendeesmodel.h" 0008 #include "localcalendar.h" 0009 #include <KLocalizedString> 0010 #include <KPeople/PersonData> 0011 0012 #include "calendarcontroller.h" 0013 0014 AttendeesModel::AttendeesModel(QObject *parent) : QAbstractListModel {parent}, m_attendees {KCalendarCore::Attendee::List {}} 0015 { 0016 connect(this, &AttendeesModel::uidChanged, this, &AttendeesModel::loadPersistentData); 0017 } 0018 0019 QHash<int, QByteArray> AttendeesModel::roleNames() const 0020 { 0021 return { 0022 {Email, "email"}, 0023 {FullName, "fullName"}, 0024 {Name, "name"}, 0025 {ParticipationStatus, "status"}, 0026 {ParticipationStatusIcon, "statusIcon"}, 0027 {ParticipationStatusDisplay, "displayStatus"}, 0028 {AttendeeRole, "attendeeRole"} 0029 }; 0030 } 0031 0032 QString AttendeesModel::uid() const 0033 { 0034 return m_uid; 0035 } 0036 0037 void AttendeesModel::setUid(const QString &uid) 0038 { 0039 if (m_uid != uid) { 0040 m_uid = uid; 0041 0042 Q_EMIT uidChanged(); 0043 } 0044 } 0045 0046 QVariant AttendeesModel::data(const QModelIndex &index, int role) const 0047 { 0048 if (!index.isValid()) { 0049 return QVariant {}; 0050 } 0051 0052 auto row = index.row(); 0053 0054 switch (role) { 0055 case Email: 0056 return m_attendees.at(row).email(); 0057 case FullName: 0058 return m_attendees.at(row).fullName(); 0059 case Name: 0060 return m_attendees.at(row).name(); 0061 case ParticipationStatus: 0062 return m_attendees.at(row).status(); 0063 case AttendeeRole: 0064 return m_attendees.at(row).role(); 0065 case ParticipationStatusIcon: 0066 return statusIcon(row); 0067 case ParticipationStatusDisplay: 0068 return displayStatus(row); 0069 default: 0070 return QVariant {}; 0071 } 0072 } 0073 0074 int AttendeesModel::rowCount(const QModelIndex &parent) const 0075 { 0076 if (parent.isValid()) { 0077 return 0; 0078 } 0079 0080 return m_attendees.count(); 0081 } 0082 0083 void AttendeesModel::loadPersistentData() 0084 { 0085 beginResetModel(); 0086 0087 KCalendarCore::Incidence::Ptr incidence; 0088 KCalendarCore::Calendar::Ptr calendar; 0089 0090 m_attendees.clear(); 0091 if (!m_uid.isEmpty()) { 0092 incidence = CalendarController::instance().activeCalendar()->calendar()->incidence(m_uid); 0093 if (incidence != nullptr) { 0094 m_attendees = incidence->attendees(); 0095 } 0096 } 0097 0098 endResetModel(); 0099 } 0100 0101 void AttendeesModel::removeItem(const int row) 0102 { 0103 beginRemoveRows(QModelIndex(), row, row); 0104 0105 m_attendees.removeAt(row); 0106 0107 endRemoveRows(); 0108 } 0109 0110 void AttendeesModel::addPersons(const QStringList uris) 0111 { 0112 if (uris.isEmpty()) { 0113 return; 0114 } 0115 0116 beginResetModel(); 0117 0118 for (const auto &uri : qAsConst(uris)) { 0119 KPeople::PersonData person {uri, this}; 0120 m_attendees.append({person.name(), person.email(), true}); 0121 } 0122 0123 endResetModel(); 0124 } 0125 0126 QStringList AttendeesModel::emails() const 0127 { 0128 QStringList emails {}; 0129 0130 for (const auto &a : qAsConst(m_attendees)) { 0131 emails.append(a.email()); 0132 } 0133 0134 return emails; 0135 } 0136 0137 QVariantList AttendeesModel::attendees() const 0138 { 0139 QVariantList l {}; 0140 for (const auto &a : m_attendees) { 0141 l.append(QVariant::fromValue(a)); 0142 } 0143 0144 return l; 0145 } 0146 0147 bool AttendeesModel::setData(const QModelIndex &idx, const QVariant &value, int role) 0148 { 0149 if (role == AttendeeRole) { 0150 m_attendees[idx.row()].setRole(value.value<KCalendarCore::Attendee::Role>()); 0151 auto m = idx.model(); 0152 0153 Q_EMIT dataChanged(m->index(0, 0), m->index(m->rowCount() - 1, 0), {AttendeeRole}); 0154 0155 return true; 0156 } 0157 0158 return false; 0159 } 0160 0161 QString AttendeesModel::statusIcon(const int row) const 0162 { 0163 switch (m_attendees.at(row).status()) { 0164 case KCalendarCore::Attendee::PartStat::Accepted: { 0165 return QStringLiteral("meeting-attending"); 0166 } 0167 case KCalendarCore::Attendee::PartStat::Tentative: { 0168 return QStringLiteral("meeting-attending-tentative"); 0169 } 0170 case KCalendarCore::Attendee::PartStat::Declined: { 0171 return QStringLiteral("meeting-participant-no-response"); 0172 } 0173 default: { 0174 return QStringLiteral("meeting-participant-request-response"); 0175 } 0176 } 0177 } 0178 0179 QString AttendeesModel::displayStatus(const int row) const 0180 { 0181 switch (m_attendees.at(row).status()) { 0182 case KCalendarCore::Attendee::PartStat::Accepted: { 0183 return i18n("Accepted"); 0184 } 0185 case KCalendarCore::Attendee::PartStat::Tentative: { 0186 return i18n("Tentative"); 0187 } 0188 case KCalendarCore::Attendee::PartStat::Declined: { 0189 return i18n("Declined"); 0190 } 0191 case KCalendarCore::Attendee::PartStat::Delegated: { 0192 return i18n("Delegated"); 0193 } 0194 default: { 0195 return i18n("Not responded yet"); 0196 } 0197 } 0198 }