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 "kalendar_debug.h"
0005 #include <QMetaEnum>
0006 #include <models/remindersmodel.h>
0007 
0008 RemindersModel::RemindersModel(QObject *parent, KCalendarCore::Incidence::Ptr incidencePtr)
0009     : QAbstractListModel(parent)
0010     , m_incidence(incidencePtr)
0011 {
0012     for (int i = 0; i < QMetaEnum::fromType<RemindersModel::Roles>().keyCount(); i++) {
0013         const int value = QMetaEnum::fromType<RemindersModel::Roles>().value(i);
0014         const QString key = QLatin1String(roleNames().value(value));
0015         m_dataRoles[key] = value;
0016     }
0017 }
0018 
0019 KCalendarCore::Incidence::Ptr RemindersModel::incidencePtr()
0020 {
0021     return m_incidence;
0022 }
0023 
0024 void RemindersModel::setIncidencePtr(KCalendarCore::Incidence::Ptr incidence)
0025 {
0026     if (m_incidence == incidence) {
0027         return;
0028     }
0029     m_incidence = incidence;
0030     Q_EMIT incidencePtrChanged();
0031     Q_EMIT alarmsChanged();
0032     Q_EMIT layoutChanged();
0033 }
0034 
0035 KCalendarCore::Alarm::List RemindersModel::alarms()
0036 {
0037     return m_incidence->alarms();
0038 }
0039 
0040 QVariantMap RemindersModel::dataroles()
0041 {
0042     return m_dataRoles;
0043 }
0044 
0045 QVariant RemindersModel::data(const QModelIndex &idx, int role) const
0046 {
0047     if (!hasIndex(idx.row(), idx.column())) {
0048         return {};
0049     }
0050     auto alarm = m_incidence->alarms()[idx.row()];
0051     switch (role) {
0052     case TypeRole:
0053         return alarm->type();
0054     case TimeRole:
0055         return alarm->time();
0056     case StartOffsetRole:
0057         return alarm->startOffset().asSeconds();
0058     case EndOffsetRole:
0059         return alarm->endOffset().asSeconds();
0060     default:
0061         qCWarning(KALENDAR_LOG) << "Unknown role for incidence:" << QMetaEnum::fromType<Roles>().valueToKey(role);
0062         return {};
0063     }
0064 }
0065 
0066 bool RemindersModel::setData(const QModelIndex &idx, const QVariant &value, int role)
0067 {
0068     if (!idx.isValid()) {
0069         return false;
0070     }
0071 
0072     switch (role) {
0073     case TypeRole: {
0074         auto type = static_cast<KCalendarCore::Alarm::Type>(value.toInt());
0075         m_incidence->alarms()[idx.row()]->setType(type);
0076         break;
0077     }
0078     case TimeRole: {
0079         QDateTime time = value.toDateTime();
0080         m_incidence->alarms()[idx.row()]->setTime(time);
0081         break;
0082     }
0083     case StartOffsetRole: {
0084         // offset can be set in seconds or days, if we want it to be before the incidence,
0085         // it has to be set to a negative value.
0086         KCalendarCore::Duration offset(value.toInt());
0087         m_incidence->alarms()[idx.row()]->setStartOffset(offset);
0088         break;
0089     }
0090     case EndOffsetRole: {
0091         KCalendarCore::Duration offset(value.toInt());
0092         m_incidence->alarms()[idx.row()]->setEndOffset(offset);
0093         break;
0094     }
0095     default:
0096         qCWarning(KALENDAR_LOG) << "Unknown role for incidence:" << QMetaEnum::fromType<Roles>().valueToKey(role);
0097         return false;
0098     }
0099     Q_EMIT dataChanged(idx, idx);
0100     return true;
0101 }
0102 
0103 QHash<int, QByteArray> RemindersModel::roleNames() const
0104 {
0105     return {
0106         {TypeRole, QByteArrayLiteral("type")},
0107         {TimeRole, QByteArrayLiteral("time")},
0108         {StartOffsetRole, QByteArrayLiteral("startOffset")},
0109         {EndOffsetRole, QByteArrayLiteral("endOffset")},
0110     };
0111 }
0112 
0113 int RemindersModel::rowCount(const QModelIndex &) const
0114 {
0115     return m_incidence->alarms().size();
0116 }
0117 
0118 void RemindersModel::addAlarm()
0119 {
0120     KCalendarCore::Alarm::Ptr alarm(new KCalendarCore::Alarm(m_incidence.get()));
0121     alarm->setEnabled(true);
0122     alarm->setType(KCalendarCore::Alarm::Display);
0123     alarm->setText(m_incidence->summary());
0124     alarm->setStartOffset(0);
0125 
0126     qCDebug(KALENDAR_LOG) << alarm->parentUid();
0127 
0128     m_incidence->addAlarm(alarm);
0129     Q_EMIT alarmsChanged();
0130     Q_EMIT layoutChanged();
0131 }
0132 
0133 void RemindersModel::deleteAlarm(int row)
0134 {
0135     if (!hasIndex(row, 0)) {
0136         return;
0137     }
0138 
0139     m_incidence->removeAlarm(m_incidence->alarms()[row]);
0140     Q_EMIT alarmsChanged();
0141     Q_EMIT layoutChanged();
0142 }