File indexing completed on 2024-04-21 05:50:57

0001 /*
0002  * SPDX-FileCopyrightText: 2020 Dimitris Kardarakos <dimkard@posteo.net>
0003  *
0004  * SPDX-License-Identifier: GPL-3.0-or-later
0005  */
0006 
0007 #include <QDate>
0008 #include <KLocalizedString>
0009 #include "conferencemodel.h"
0010 #include "conferencecontroller.h"
0011 #include "conference.h"
0012 
0013 ConferenceModel::ConferenceModel(QObject *parent) : QAbstractListModel {parent}, m_controller {nullptr}, m_conferences {QVector<Conference*> {}}, m_busy_downloading {false}
0014 {
0015 }
0016 
0017 QHash<int, QByteArray> ConferenceModel::roleNames() const
0018 {
0019     return {
0020         {ConferenceId, "id"},
0021         {ConferenceName, "name"},
0022         {ConferenceDescription, "description"},
0023         {ConferenceIcalUrl, "icalUrl"},
0024         {ConferenceDays, "days"},
0025         {ConferenceVenueImageUrl, "venueImageUrl"},
0026         {ConferenceVenueLatitude, "venueLatitude"},
0027         {ConferenceVenueLongitude, "venueLongitude"},
0028         {ConferenceVenueOsmUrl, "venueOsmUrl"},
0029         {ConferenceTimeZone, "timeZoneId"},
0030         {PastUpcoming, "pastUpcoming"}
0031     };
0032 }
0033 
0034 int ConferenceModel::rowCount(const QModelIndex &parent) const
0035 {
0036     Q_UNUSED(parent);
0037 
0038     return m_conferences.count();
0039 }
0040 
0041 QVariant ConferenceModel::data(const QModelIndex &index, int role) const
0042 {
0043     auto row = index.row();
0044 
0045     switch (role) {
0046     case ConferenceId:
0047         return m_conferences.at(row)->id();
0048     case ConferenceName:
0049         return m_conferences.at(row)->name();
0050     case ConferenceDescription:
0051         return m_conferences.at(row)->description();
0052     case ConferenceIcalUrl:
0053         return m_conferences.at(row)->icalUrl();
0054     case ConferenceDays:
0055         return m_conferences.at(row)->days();
0056     case ConferenceVenueImageUrl:
0057         return m_conferences.at(row)->venueImageUrl();
0058     case ConferenceVenueLatitude:
0059         return m_conferences.at(row)->venueLatitude();
0060     case ConferenceVenueLongitude:
0061         return m_conferences.at(row)->venueLongitude();
0062     case ConferenceVenueOsmUrl:
0063         return m_conferences.at(row)->venueOsmUrl();
0064     case ConferenceTimeZone:
0065         return m_conferences.at(row)->timeZoneId();
0066     case PastUpcoming:
0067         return pastOrUpcoming(row);
0068     default:
0069         return m_conferences.at(row)->id();
0070     }
0071 }
0072 
0073 void ConferenceModel::loadConferences()
0074 {
0075     beginResetModel();
0076 
0077     if (m_controller != nullptr) {
0078         m_conferences = m_controller->conferences();
0079     }
0080 
0081     endResetModel();
0082 }
0083 
0084 QString ConferenceModel::pastOrUpcoming(const int index) const
0085 {
0086     auto days = m_conferences.at(index)->days();
0087     auto pastLabel = i18n("Past");
0088     auto upcoming = i18n("Upcoming");
0089 
0090     if (days.isEmpty()) {
0091         return pastLabel;
0092     }
0093 
0094     auto lastDayDt = QDate::fromString(days.last(), "yyyy-MM-dd");
0095     auto currentDt = QDate::currentDate();
0096 
0097     if (lastDayDt.isValid()) {
0098         return lastDayDt < currentDt ? pastLabel : upcoming;
0099     }
0100 
0101     return pastLabel;
0102 }
0103 
0104 void ConferenceModel::setController(ConferenceController *conferenceController)
0105 {
0106     if (m_controller == conferenceController) {
0107         return;
0108     }
0109 
0110     m_controller = conferenceController;
0111 
0112     if (m_controller != nullptr) {
0113         m_controller->loadConferences();
0114         connect(m_controller, &ConferenceController::conferencesLoaded, this, &ConferenceModel::loadConferences);
0115         connect(m_controller, &ConferenceController::downlading, this, &ConferenceModel::setBusyStatus);
0116     }
0117 
0118     Q_EMIT controllerChanged();
0119 }
0120 
0121 ConferenceController *ConferenceModel::controller() const
0122 {
0123     return m_controller;
0124 }
0125 
0126 void ConferenceModel::setBusyStatus(const bool downlading)
0127 {
0128     if (m_busy_downloading != downlading) {
0129         m_busy_downloading = downlading;
0130         Q_EMIT busyDownladingChanged();
0131     }
0132 }
0133 
0134 bool ConferenceModel::busyDownlading() const
0135 {
0136     return m_busy_downloading;
0137 }
0138 
0139 #include "moc_conferencemodel.cpp"