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 ®ionsConfig) 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 ®ion : 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 }