File indexing completed on 2024-06-23 04:42:36
0001 // SPDX-FileCopyrightText: 2021 Claudio Cambra <claudio.cambra@gmail.com> 0002 // SPDX-License-Identifier: LGPL-2.1-or-later 0003 0004 #include "recurrenceexceptionsmodel.h" 0005 #include "kalendar_debug.h" 0006 #include <QDebug> 0007 #include <QMetaEnum> 0008 0009 RecurrenceExceptionsModel::RecurrenceExceptionsModel(QObject *parent, KCalendarCore::Incidence::Ptr incidencePtr) 0010 : QAbstractListModel(parent) 0011 , m_incidence(incidencePtr) 0012 { 0013 for (int i = 0; i < QMetaEnum::fromType<RecurrenceExceptionsModel::Roles>().keyCount(); i++) { 0014 const int value = QMetaEnum::fromType<RecurrenceExceptionsModel::Roles>().value(i); 0015 const QString key = QLatin1String(roleNames().value(value)); 0016 m_dataRoles[key] = value; 0017 } 0018 0019 connect(this, &RecurrenceExceptionsModel::incidencePtrChanged, this, &RecurrenceExceptionsModel::updateExceptions); 0020 } 0021 0022 KCalendarCore::Incidence::Ptr RecurrenceExceptionsModel::incidencePtr() 0023 { 0024 return m_incidence; 0025 } 0026 0027 void RecurrenceExceptionsModel::setIncidencePtr(KCalendarCore::Incidence::Ptr incidence) 0028 { 0029 if (m_incidence == incidence) { 0030 return; 0031 } 0032 m_incidence = incidence; 0033 Q_EMIT incidencePtrChanged(); 0034 Q_EMIT exceptionsChanged(); 0035 Q_EMIT layoutChanged(); 0036 } 0037 0038 QList<QDate> RecurrenceExceptionsModel::exceptions() 0039 { 0040 return m_exceptions; 0041 } 0042 0043 void RecurrenceExceptionsModel::updateExceptions() 0044 { 0045 m_exceptions.clear(); 0046 0047 const auto dateTimes = m_incidence->recurrence()->exDateTimes(); 0048 for (const QDateTime &dateTime : dateTimes) { 0049 m_exceptions.append(dateTime.date()); 0050 } 0051 0052 const auto dates = m_incidence->recurrence()->exDates(); 0053 for (const QDate &date : dates) { 0054 m_exceptions.append(date); 0055 } 0056 Q_EMIT exceptionsChanged(); 0057 Q_EMIT layoutChanged(); 0058 } 0059 0060 QVariantMap RecurrenceExceptionsModel::dataroles() 0061 { 0062 return m_dataRoles; 0063 } 0064 0065 QVariant RecurrenceExceptionsModel::data(const QModelIndex &idx, int role) const 0066 { 0067 if (!hasIndex(idx.row(), idx.column())) { 0068 return {}; 0069 } 0070 const QDate exception = m_exceptions[idx.row()]; 0071 switch (role) { 0072 case DateRole: 0073 return exception; 0074 default: 0075 qCWarning(KALENDAR_LOG) << "Unknown role for incidence:" << QMetaEnum::fromType<Roles>().valueToKey(role); 0076 return {}; 0077 } 0078 } 0079 0080 QHash<int, QByteArray> RecurrenceExceptionsModel::roleNames() const 0081 { 0082 return {{DateRole, QByteArrayLiteral("date")}}; 0083 } 0084 0085 int RecurrenceExceptionsModel::rowCount(const QModelIndex &) const 0086 { 0087 return m_exceptions.size(); 0088 } 0089 0090 void RecurrenceExceptionsModel::addExceptionDateTime(QDateTime date) 0091 { 0092 if (!date.isValid()) { 0093 return; 0094 } 0095 0096 // I don't know why, but different types take different date formats 0097 if (m_incidence->recurrence()->allDay()) { 0098 m_incidence->recurrence()->addExDateTime(date); 0099 } else { 0100 m_incidence->recurrence()->addExDate(date.date()); 0101 } 0102 0103 updateExceptions(); 0104 } 0105 0106 void RecurrenceExceptionsModel::deleteExceptionDateTime(QDateTime date) 0107 { 0108 if (!date.isValid()) { 0109 return; 0110 } 0111 0112 if (m_incidence->recurrence()->allDay()) { 0113 auto dateTimes = m_incidence->recurrence()->exDateTimes(); 0114 dateTimes.removeAt(dateTimes.indexOf(date)); 0115 m_incidence->recurrence()->setExDateTimes(dateTimes); 0116 } else { 0117 auto dates = m_incidence->recurrence()->exDates(); 0118 int removeIndex = dates.indexOf(date.date()); 0119 0120 if (removeIndex >= 0) { 0121 dates.removeAt(dates.indexOf(date.date())); 0122 m_incidence->recurrence()->setExDates(dates); 0123 updateExceptions(); 0124 return; 0125 } 0126 0127 auto dateTimes = m_incidence->recurrence()->exDateTimes(); 0128 0129 for (int i = 0; i < dateTimes.size(); i++) { 0130 if (dateTimes[i].date() == date.date()) { 0131 dateTimes.removeAt(i); 0132 } 0133 } 0134 m_incidence->recurrence()->setExDateTimes(dateTimes); 0135 } 0136 0137 updateExceptions(); 0138 }