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 }