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 }