File indexing completed on 2024-04-21 09:41:54

0001 /*
0002  * SPDX-FileCopyrightText: 2020 Dimitris Kardarakos <dimkard@posteo.net>
0003  *
0004  * SPDX-License-Identifier: GPL-3.0-or-later
0005  */
0006 
0007 #include "alarmsmodel.h"
0008 #include <KCalendarCore/Calendar>
0009 #include <KCalendarCore/MemoryCalendar>
0010 #include <KSharedConfig>
0011 #include <QDebug>
0012 
0013 AlarmsModel::AlarmsModel(QObject *parent) : QObject {parent}, m_calendars {QVector<KCalendarCore::Calendar::Ptr> {}}, m_file_storages {QVector<KCalendarCore::FileStorage::Ptr> {}}, m_alarms {KCalendarCore::Alarm::List {}}, m_calendar_files {QStringList()}
0014 {
0015     connect(this, &AlarmsModel::periodChanged, this, &AlarmsModel::loadAlarms);
0016     connect(this, &AlarmsModel::calendarsChanged, this, &AlarmsModel::loadAlarms);
0017 }
0018 
0019 void AlarmsModel::loadAlarms()
0020 {
0021     m_alarms.clear();
0022 
0023     if (!(m_period.from.isValid()) && !(m_period.to.isValid())) {
0024         return;
0025     }
0026 
0027     openLoadStorages();
0028 
0029     for (const auto &m : std::as_const(m_calendars)) {
0030 
0031         KCalendarCore::Alarm::List calendarAlarms;
0032 
0033         if (m_period.from.isValid() && m_period.to.isValid()) {
0034             calendarAlarms = m->alarms(m_period.from, m_period.to, true);
0035         } else if (!(m_period.from.isValid()) && m_period.to.isValid()) {
0036             calendarAlarms = m->alarms(QDateTime {QDate {1900, 1, 1}, QTime {0, 0, 0}}, m_period.to);
0037         }
0038 
0039         if (!(calendarAlarms.empty())) {
0040             m_alarms.append(calendarAlarms);
0041         }
0042     }
0043     qDebug() << "loadAlarms:" << m_period.from.toString("dd.MM.yyyy hh:mm:ss") << "to" << m_period.to.toString("dd.MM.yyyy hh:mm:ss") << m_alarms.count() << "alarms found";
0044 
0045     closeStorages();
0046 }
0047 
0048 void AlarmsModel::setCalendars()
0049 {
0050     m_file_storages.clear();
0051     m_calendars.clear();
0052 
0053     for (const auto &cf : std::as_const(m_calendar_files)) {
0054         KCalendarCore::Calendar::Ptr calendar {new KCalendarCore::MemoryCalendar {QTimeZone::systemTimeZoneId()}};
0055         KCalendarCore::FileStorage::Ptr storage {new KCalendarCore::FileStorage {calendar}};
0056         storage->setFileName(cf);
0057         if (!(storage->fileName().isNull())) {
0058             m_file_storages.append(storage);
0059             m_calendars.append(calendar);
0060         }
0061     }
0062 
0063     Q_EMIT calendarsChanged();
0064 }
0065 
0066 void AlarmsModel::openLoadStorages()
0067 {
0068     auto loaded {true};
0069     for (const auto &fs : std::as_const(m_file_storages)) {
0070         loaded = fs->open() && fs->load() && loaded;
0071     }
0072 }
0073 
0074 void AlarmsModel::closeStorages()
0075 {
0076     auto closed {true};
0077     for (const auto &fs : std::as_const(m_file_storages)) {
0078         closed = fs->close() && closed;
0079     }
0080 }
0081 
0082 QDateTime AlarmsModel::parentStartDt(const int idx) const
0083 {
0084     auto alarm = m_alarms.at(idx);
0085     KCalendarCore::Duration offsetDuration;
0086     auto alarmTime = m_alarms.at(idx)->time();
0087     if (alarm->hasStartOffset()) {
0088         offsetDuration = alarm->startOffset();
0089     }
0090 
0091     if (!(offsetDuration.isNull())) {
0092         auto secondsFromStart = offsetDuration.asSeconds();
0093 
0094         return alarmTime.addSecs(-1 * secondsFromStart);
0095     }
0096 
0097     return alarmTime;
0098 }
0099 
0100 KCalendarCore::Alarm::List AlarmsModel::alarms() const
0101 {
0102     return m_alarms;
0103 }
0104 
0105 FilterPeriod AlarmsModel::period() const
0106 {
0107     return m_period;
0108 }
0109 
0110 void AlarmsModel::setPeriod(const FilterPeriod &filterPeriod)
0111 {
0112     m_period = filterPeriod;
0113 
0114     Q_EMIT periodChanged();
0115 }
0116 
0117 QStringList AlarmsModel::calendarFiles() const
0118 {
0119     return m_calendar_files;
0120 }
0121 
0122 void AlarmsModel::setCalendarFiles(const QStringList &fileList)
0123 {
0124     m_calendar_files = fileList;
0125 
0126     setCalendars();
0127 }
0128 
0129 QDateTime AlarmsModel::firstAlarmTime() const
0130 {
0131     auto firstAlarmTime = m_period.to;
0132 
0133     for (const auto &alarm : m_alarms) {
0134         auto alarmTime = alarm->time();
0135         if (alarmTime < firstAlarmTime) {
0136             firstAlarmTime = alarmTime;
0137         }
0138     }
0139 
0140     return firstAlarmTime;
0141 }
0142 
0143 #include "moc_alarmsmodel.cpp"