File indexing completed on 2025-04-27 08:12:26
0001 /* 0002 * SPDX-FileCopyrightText: 2019 Dimitris Kardarakos <dimkard@posteo.net> 0003 * 0004 * SPDX-License-Identifier: GPL-3.0-or-later 0005 */ 0006 0007 #include "incidencealarmsmodel.h" 0008 #include "localcalendar.h" 0009 #include <QVector> 0010 #include <KLocalizedString> 0011 #include <QDebug> 0012 0013 IncidenceAlarmsModel::IncidenceAlarmsModel(QObject *parent) : QAbstractListModel(parent), mAlarms(QVariantList()) 0014 { 0015 connect(this, &IncidenceAlarmsModel::alarmPropertiesChanged, this, &IncidenceAlarmsModel::loadPersistentAlarms); 0016 } 0017 0018 IncidenceAlarmsModel::~IncidenceAlarmsModel() = default; 0019 0020 QHash<int, QByteArray> IncidenceAlarmsModel::roleNames() const 0021 { 0022 QHash<int, QByteArray> roles = QAbstractItemModel::roleNames(); 0023 roles.insert(StartOffsetType, "startOffsetType"); 0024 roles.insert(StartOffsetValue, "startOffsetValue"); 0025 roles.insert(ActionType, "actionType"); 0026 return roles; 0027 } 0028 0029 void IncidenceAlarmsModel::removeAlarm(const int row) 0030 { 0031 beginRemoveRows(QModelIndex(), row, row); 0032 0033 mAlarms.removeAt(row); 0034 0035 endRemoveRows(); 0036 } 0037 0038 void IncidenceAlarmsModel::removeAll() 0039 { 0040 beginResetModel(); 0041 mAlarms.clear(); 0042 endResetModel(); 0043 } 0044 0045 void IncidenceAlarmsModel::addAlarm(const int secondsFromStart) 0046 { 0047 qDebug() << "\nAddAlarm:\tAdding alarm. Seconds before start: " << secondsFromStart; 0048 0049 beginInsertRows(QModelIndex(), mAlarms.count(), mAlarms.count()); 0050 0051 QHash<QString, QVariant> alarmMap; 0052 if (secondsFromStart % 86400 == 0) { 0053 alarmMap[QStringLiteral("startOffsetValue")] = -1 * secondsFromStart / 86400; 0054 alarmMap[QStringLiteral("startOffsetType")] = KCalendarCore::Duration::Days; 0055 } else { 0056 alarmMap[QStringLiteral("startOffsetValue")] = -1 * secondsFromStart; 0057 alarmMap[QStringLiteral("startOffsetType")] = KCalendarCore::Duration::Seconds; 0058 } 0059 alarmMap[QStringLiteral("actionType")] = KCalendarCore::Alarm::Type::Display; 0060 mAlarms.append(alarmMap); 0061 0062 endInsertRows(); 0063 } 0064 0065 QVariantMap IncidenceAlarmsModel::alarmProperties() const 0066 { 0067 return mAlarmProperties; 0068 } 0069 0070 void IncidenceAlarmsModel::setAlarmProperties(const QVariantMap &alarmProps) 0071 { 0072 mAlarmProperties = alarmProps; 0073 0074 Q_EMIT alarmPropertiesChanged(); 0075 } 0076 0077 QVariant IncidenceAlarmsModel::data(const QModelIndex &index, int role) const 0078 { 0079 if (!index.isValid()) { 0080 return QVariant(); 0081 } 0082 0083 switch (role) { 0084 case Qt::DisplayRole: 0085 return displayText(index.row()); 0086 case StartOffsetType: 0087 return alarmStartOffsetType(index.row()); 0088 case StartOffsetValue: 0089 return alarmStartOffsetValue(index.row()); 0090 case ActionType: 0091 return alarmActionType(index.row()); 0092 } 0093 0094 return QVariant(); 0095 } 0096 0097 int IncidenceAlarmsModel::rowCount(const QModelIndex &parent) const 0098 { 0099 if (parent.isValid()) { 0100 return 0; 0101 } 0102 0103 return mAlarms.count(); 0104 } 0105 0106 void IncidenceAlarmsModel::loadPersistentAlarms() 0107 { 0108 0109 beginResetModel(); 0110 0111 LocalCalendar *localCalendar = mAlarmProperties[QStringLiteral("calendar")].value<LocalCalendar *>(); 0112 QString uid = mAlarmProperties[QStringLiteral("uid")].toString(); 0113 KCalendarCore::Calendar::Ptr memCalendar; 0114 KCalendarCore::Incidence::Ptr alarmIncidence; 0115 KCalendarCore::Alarm::List persistentAlarms = KCalendarCore::Alarm::List(); 0116 0117 qDebug() << "\nloadPersistentAlarms: uid" << uid; 0118 0119 if (localCalendar != nullptr) { 0120 memCalendar = localCalendar->calendar(); 0121 alarmIncidence = memCalendar->incidence(uid); 0122 } 0123 0124 if (alarmIncidence != nullptr) { 0125 persistentAlarms = alarmIncidence->alarms(); 0126 } 0127 0128 KCalendarCore::Alarm::List::const_iterator alarmItr = persistentAlarms.constBegin(); 0129 0130 while (alarmItr != persistentAlarms.constEnd()) { 0131 QHash<QString, QVariant> alarmMap; 0132 alarmMap[QStringLiteral("startOffsetValue")] = (*alarmItr)->startOffset().value(); 0133 alarmMap[QStringLiteral("startOffsetType")] = (*alarmItr)->startOffset().type(); 0134 alarmMap[QStringLiteral("actionType")] = (*alarmItr)->type(); 0135 0136 mAlarms.append(alarmMap); 0137 ++alarmItr; 0138 } 0139 endResetModel(); 0140 } 0141 0142 QString IncidenceAlarmsModel::alarmText(const int idx) const 0143 { 0144 QHash<QString, QVariant> alarm = mAlarms.at(idx).value<QHash<QString, QVariant>>(); 0145 0146 return alarm[QStringLiteral("text")].toString(); 0147 } 0148 0149 QString IncidenceAlarmsModel::alarmStartOffsetType(const int idx) const 0150 { 0151 QHash<QString, QVariant> alarm = mAlarms.at(idx).value<QHash<QString, QVariant>>(); 0152 0153 int durationType = alarm[QStringLiteral("startOffsetType")].value<int>(); 0154 0155 switch (durationType) { 0156 case KCalendarCore::Duration::Type::Days: { 0157 return QString(i18n("days before start")); 0158 } 0159 case KCalendarCore::Duration::Type::Seconds: { 0160 return QString(i18n("seconds before start")); 0161 } 0162 default: { 0163 return QString(); 0164 } 0165 } 0166 } 0167 0168 int IncidenceAlarmsModel::alarmStartOffsetValue(const int idx) const 0169 { 0170 QHash<QString, QVariant> alarm = mAlarms.at(idx).value<QHash<QString, QVariant>>(); 0171 0172 return alarm[QStringLiteral("startOffsetValue")].value<int>(); 0173 } 0174 0175 QString IncidenceAlarmsModel::alarmUid(const int idx) const 0176 { 0177 QHash<QString, QVariant> alarm = mAlarms.at(idx).value<QHash<QString, QVariant>>(); 0178 0179 return alarm[QStringLiteral("uid")].toString(); 0180 } 0181 0182 int IncidenceAlarmsModel::alarmActionType(const int idx) const 0183 { 0184 QHash<QString, QVariant> alarm = mAlarms.at(idx).value<QHash<QString, QVariant>>(); 0185 0186 return alarm[QStringLiteral("actionType")].value<int>(); 0187 } 0188 0189 QVariantList IncidenceAlarmsModel::alarms() const 0190 { 0191 return mAlarms; 0192 } 0193 0194 QString IncidenceAlarmsModel::displayText(const int idx) const 0195 { 0196 QHash<QString, QVariant> alarm = mAlarms.at(idx).value<QHash<QString, QVariant>>(); 0197 0198 int durationType = alarm[QStringLiteral("startOffsetType")].value<int>(); 0199 int durationValue = -1 * alarm[QStringLiteral("startOffsetValue")].value<int>(); 0200 0201 if (durationValue == 0) { 0202 return i18n("At start time"); 0203 } 0204 0205 // Duration in days 0206 if (durationType == KCalendarCore::Duration::Type::Days) { 0207 return i18np("1 day before start", "%1 days before start", durationValue); 0208 } 0209 0210 // Duration in seconds 0211 if ((durationValue % 86400) == 0) { 0212 return i18np("1 day before start", "%1 days before start", durationValue / 86400); 0213 } 0214 0215 if ((durationValue % 3600) == 0) { 0216 return i18np("1 hour before start", "%1 hours before start", durationValue / 3600); 0217 } 0218 0219 if ((durationValue % 60) == 0) { 0220 return i18np("1 minute before start", "%1 minutes before start", durationValue / 60); 0221 } 0222 0223 return i18np("1 second before start", "%1 seconds before start", durationValue); 0224 } 0225