File indexing completed on 2024-03-24 05:53:48
0001 /* 0002 * SPDX-FileCopyrightText: 2020 Dimitris Kardarakos <dimkard@posteo.net> 0003 * 0004 * SPDX-License-Identifier: GPL-3.0-or-later 0005 */ 0006 0007 #include "eventcontroller.h" 0008 #include "calendarcontroller.h" 0009 #include "localcalendar.h" 0010 #include "settingscontroller.h" 0011 #include <QDebug> 0012 #include <KCalendarCore/Event> 0013 #include <KLocalizedString> 0014 0015 EventController::EventController(QObject *parent) : QObject {parent}, m_cal_controller {new CalendarController}, m_settings_controller {new SettingsController {this}} 0016 {} 0017 0018 CalendarController *EventController::calendarController() 0019 { 0020 return m_cal_controller; 0021 } 0022 0023 void EventController::setCalendarController(CalendarController *const controller) 0024 { 0025 m_cal_controller = controller; 0026 Q_EMIT calendarControllerChanged(); 0027 } 0028 0029 void EventController::remove(LocalCalendar *calendar, const QVariantMap &eventData) 0030 { 0031 if (calendar == nullptr) { 0032 qDebug() << "There is no calendar to delete event from"; 0033 0034 return; 0035 } 0036 0037 qDebug() << "Deleting event from calendar " << calendar->calendarId(); 0038 0039 auto memoryCalendar = calendar->memorycalendar(); 0040 auto uid = eventData["uid"].toString(); 0041 auto event = memoryCalendar->event(uid); 0042 memoryCalendar->deleteEvent(event); 0043 0044 auto deleted {false}; 0045 if (m_cal_controller != nullptr) { 0046 deleted = m_cal_controller->save(calendar->calendarId()); 0047 Q_EMIT calendar->eventsChanged(); 0048 } 0049 0050 qDebug() << "Event deleted: " << deleted; 0051 } 0052 0053 QVariantMap EventController::addEdit(LocalCalendar *calendar, const QVariantMap &eventData) 0054 { 0055 if (calendar == nullptr) { 0056 return { {"status", NoCalendarExists}, {"message", i18n("Error during event creation") } }; 0057 } 0058 0059 auto eventCheckResult = eventCheck(calendar, eventData); 0060 0061 if (eventCheckResult["result"].toInt() == Exists) { 0062 return { 0063 {"status", NoCalendarExists}, {"message", i18n("Already in favorites")} 0064 }; 0065 } 0066 0067 qDebug() << "\naddEdit:\tCreating event to calendar " << calendar->calendarId(); 0068 0069 auto memoryCalendar = calendar->memorycalendar(); 0070 auto uid = eventData["uid"].toString(); 0071 auto event = memoryCalendar->event(uid); 0072 0073 if (event == nullptr) { 0074 event = KCalendarCore::Event::Ptr {new KCalendarCore::Event {}}; 0075 } 0076 0077 event->setUid(uid); 0078 event->setDtStart(eventData["startDate"].toDateTime().toTimeZone(QTimeZone::utc())); 0079 event->setDtEnd(eventData["endDate"].toDateTime().toTimeZone(QTimeZone::utc())); 0080 event->setDescription(eventData["description"].toString()); 0081 event->setCategories(eventData["categories"].toString()); 0082 event->setSummary(eventData["summary"].toString()); 0083 event->setAllDay(eventData["allDay"].toBool()); 0084 event->setLocation(eventData["location"].toString()); 0085 event->setUrl(eventData["url"].toString()); 0086 0087 event->clearAlarms(); 0088 0089 auto newAlarm = event->newAlarm(); 0090 newAlarm->setStartOffset(KCalendarCore::Duration(-60 * m_settings_controller->remindBeforeStart(), KCalendarCore::Duration::Type::Seconds)); 0091 newAlarm->setType(KCalendarCore::Alarm::Type::Display); 0092 newAlarm->setEnabled(true); 0093 auto alarmText = (event->summary()).isEmpty() ? event->description() : event->summary(); 0094 0095 if (!event->location().isEmpty()) { 0096 alarmText.append((QString {"\n%1"}).arg(event->location())); 0097 } 0098 0099 newAlarm->setText(alarmText); 0100 memoryCalendar->addEvent(event); 0101 0102 auto merged {false}; 0103 0104 if (m_cal_controller != nullptr) { 0105 merged = m_cal_controller->save(calendar->calendarId()); 0106 Q_EMIT calendar->eventsChanged(); 0107 } 0108 0109 qDebug() << "addEdit:\tEvent added/updated: " << merged; 0110 0111 return { 0112 { "status", eventCheckResult["result"] }, 0113 { "message", (eventCheckResult["result"] == NotExistsButOverlaps) ? i18n("Talk added to favorites, but it overlaps with existing ones:\n%1", eventCheckResult["events"].toString()) : i18n("Talk added to favorites") } 0114 }; 0115 0116 } 0117 0118 QVariantMap EventController::eventCheck(LocalCalendar *calendar, const QVariantMap &event) 0119 { 0120 QVariantMap response { 0121 { "result", QVariant {NotExistsNotOverlapping} }, 0122 { "events", QString {} } 0123 }; 0124 0125 auto memoryCalendar = calendar->memorycalendar(); 0126 QStringList overlappingEvents {}; 0127 0128 auto eventStart = event["startDate"].toDateTime(); 0129 auto eventEnd = event["endDate"].toDateTime(); 0130 auto eventUid = event["uid"].toString(); 0131 0132 // If the event-to-check has no valid start or end date, assume that there is no overlap 0133 if (!(eventStart.isValid()) || !(eventEnd.isValid())) { 0134 return response; 0135 } 0136 0137 auto existingEvents = memoryCalendar->rawEventsForDate(eventStart.date(), memoryCalendar->timeZone()); 0138 0139 for (const auto &e : existingEvents) { 0140 if ((eventStart < e->dtEnd()) && (eventEnd > e->dtStart())) { 0141 overlappingEvents.append(e->summary()); 0142 } 0143 0144 if (!(eventUid.isEmpty()) && e->uid() == eventUid) { 0145 response["result"] = QVariant {Exists}; 0146 return response; 0147 } 0148 } 0149 0150 if (!(overlappingEvents.isEmpty())) { 0151 response["result"] = QVariant {NotExistsButOverlaps}; 0152 response["events"] = overlappingEvents.join("\n"); 0153 } 0154 0155 return response; 0156 } 0157 0158 #include "moc_eventcontroller.cpp"