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 }