File indexing completed on 2024-05-05 05:28:20

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