File indexing completed on 2024-03-24 05:53:47
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"