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