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"