File indexing completed on 2024-05-12 17:10:13

0001 /*
0002     SPDX-FileCopyrightText: 2015 Martin Klapetek <mklapetek@kde.org>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "holidaysevents.h"
0008 
0009 #include <KConfigGroup>
0010 
0011 HolidaysEventsPlugin::HolidaysEventsPlugin(QObject *parent)
0012     : CalendarEvents::CalendarEventsPlugin(parent)
0013 {
0014     KSharedConfig::Ptr config = KSharedConfig::openConfig(QStringLiteral("plasma_calendar_holiday_regions"), KConfig::NoGlobals);
0015     updateSettings(config->group("General"));
0016 
0017     m_configWatcher = KConfigWatcher::create(config);
0018     connect(m_configWatcher.get(), &KConfigWatcher::configChanged, this, [this](const KConfigGroup &configGroup) {
0019         if (configGroup.name() != QLatin1String("General")) {
0020             return;
0021         }
0022         updateSettings(configGroup);
0023         loadEventsForDateRange(m_lastStartDate, m_lastEndDate);
0024     });
0025 }
0026 
0027 HolidaysEventsPlugin::~HolidaysEventsPlugin()
0028 {
0029     qDeleteAll(m_regions);
0030 }
0031 
0032 void HolidaysEventsPlugin::loadEventsForDateRange(const QDate &startDate, const QDate &endDate)
0033 {
0034     if (!m_lastData.empty() && m_lastStartDate == startDate && m_lastEndDate == endDate) {
0035         Q_EMIT dataReady(m_lastData);
0036         return;
0037     }
0038 
0039     QMultiHash<QDate, CalendarEvents::EventData> data;
0040     for (KHolidays::HolidayRegion *region : qAsConst(m_regions)) {
0041         const KHolidays::Holiday::List holidays = region->rawHolidays(startDate, endDate);
0042 
0043         for (const KHolidays::Holiday &holiday : holidays) {
0044             CalendarEvents::EventData eventData;
0045             eventData.setStartDateTime(holiday.observedStartDate().startOfDay());
0046             eventData.setEndDateTime(holiday.observedEndDate().endOfDay());
0047             eventData.setIsAllDay(true);
0048             eventData.setTitle(holiday.name());
0049             eventData.setEventType(CalendarEvents::EventData::Holiday);
0050             eventData.setIsMinor(false);
0051 
0052             // make sure to add events spanning multiple days to all of them
0053             for (QDate d = holiday.observedStartDate(); d <= holiday.observedEndDate(); d = d.addDays(1)) {
0054                 data.insert(d, eventData);
0055             }
0056         }
0057     }
0058 
0059     m_lastStartDate = startDate;
0060     m_lastEndDate = endDate;
0061     m_lastData = data;
0062 
0063     Q_EMIT dataReady(m_lastData);
0064 }
0065 
0066 void HolidaysEventsPlugin::updateSettings(const KConfigGroup &regionsConfig)
0067 {
0068     QStringList regionCodes = regionsConfig.readEntry("selectedRegions", QStringList());
0069     regionCodes.removeDuplicates();
0070 
0071     // If the config does not have any region stored
0072     // add the default one
0073     if (regionCodes.empty()) {
0074         regionCodes << KHolidays::HolidayRegion::defaultRegionCode();
0075     }
0076 
0077     qDeleteAll(m_regions);
0078     m_regions.clear();
0079 
0080     m_regions.reserve(regionCodes.size());
0081     for (const QString &region : std::as_const(regionCodes)) {
0082         m_regions << new KHolidays::HolidayRegion(region);
0083     }
0084 
0085     if (!m_lastData.empty()) {
0086         for (const CalendarEvents::EventData &data : std::as_const(m_lastData)) {
0087             Q_EMIT eventRemoved(data.uid());
0088         }
0089         m_lastData.clear();
0090     }
0091 }