File indexing completed on 2024-04-28 05:35:49

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(QStringLiteral("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         Q_EMIT subLabelReady(m_lastSubLabelData);
0037         return;
0038     }
0039 
0040     QMultiHash<QDate, CalendarEvents::EventData> data;
0041     QHash<QDate, CalendarEvents::CalendarEventsPlugin::SubLabel> subLabelData;
0042 
0043     for (KHolidays::HolidayRegion *region : std::as_const(m_regions)) {
0044         const KHolidays::Holiday::List holidays = region->rawHolidays(startDate, endDate);
0045 
0046         for (const KHolidays::Holiday &holiday : holidays) {
0047             CalendarEvents::EventData eventData;
0048             eventData.setStartDateTime(holiday.observedStartDate().startOfDay());
0049             eventData.setEndDateTime(holiday.observedEndDate().endOfDay());
0050             eventData.setIsAllDay(true);
0051             eventData.setTitle(holiday.name());
0052             eventData.setEventType(CalendarEvents::EventData::Holiday);
0053             eventData.setIsMinor(false);
0054 
0055             // make sure to add events spanning multiple days to all of them
0056             for (QDate d = holiday.observedStartDate(); d <= holiday.observedEndDate(); d = d.addDays(1)) {
0057                 data.insert(d, eventData);
0058             }
0059 
0060             if (!subLabelData.contains(holiday.observedStartDate()) && !holiday.name().isEmpty()) {
0061                 CalendarEvents::CalendarEventsPlugin::SubLabel sublabel;
0062                 sublabel.dayLabel = holiday.name();
0063                 sublabel.priority = CalendarEvents::CalendarEventsPlugin::SubLabelPriority::Default;
0064                 subLabelData.insert(holiday.observedStartDate(), sublabel);
0065             }
0066         }
0067     }
0068 
0069     m_lastStartDate = startDate;
0070     m_lastEndDate = endDate;
0071     m_lastData = data;
0072     m_lastSubLabelData = subLabelData;
0073 
0074     Q_EMIT dataReady(m_lastData);
0075     Q_EMIT subLabelReady(m_lastSubLabelData);
0076 }
0077 
0078 void HolidaysEventsPlugin::updateSettings(const KConfigGroup &regionsConfig)
0079 {
0080     QStringList regionCodes = regionsConfig.readEntry("selectedRegions", QStringList());
0081     regionCodes.removeDuplicates();
0082 
0083     // If the config does not have any region stored
0084     // add the default one
0085     if (regionCodes.empty()) {
0086         regionCodes << KHolidays::HolidayRegion::defaultRegionCode();
0087     }
0088 
0089     qDeleteAll(m_regions);
0090     m_regions.clear();
0091 
0092     m_regions.reserve(regionCodes.size());
0093     for (const QString &region : std::as_const(regionCodes)) {
0094         m_regions << new KHolidays::HolidayRegion(region);
0095     }
0096 
0097     if (!m_lastData.empty()) {
0098         for (const CalendarEvents::EventData &data : std::as_const(m_lastData)) {
0099             Q_EMIT eventRemoved(data.uid());
0100         }
0101         m_lastData.clear();
0102     }
0103 }