File indexing completed on 2025-02-02 05:02:35
0001 /* 0002 SPDX-FileCopyrightText: 2018 Volker Krause <vkrause@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "tickettokenmodel.h" 0008 #include "reservationmanager.h" 0009 0010 #include <KItinerary/Person> 0011 #include <KItinerary/Reservation> 0012 #include <KItinerary/Ticket> 0013 0014 #include <KLocalizedString> 0015 0016 #include <KUser> 0017 0018 using namespace KItinerary; 0019 0020 TicketTokenModel::TicketTokenModel(QObject* parent) 0021 : QAbstractListModel(parent) 0022 { 0023 } 0024 0025 TicketTokenModel::~TicketTokenModel() = default; 0026 0027 QObject * TicketTokenModel::reservationManager() const 0028 { 0029 return m_resMgr; 0030 } 0031 0032 void TicketTokenModel::setReservationManager(QObject *mgr) 0033 { 0034 m_resMgr = qobject_cast<ReservationManager*>(mgr); 0035 setReservationIds(m_pendingResIds); 0036 } 0037 0038 QStringList TicketTokenModel::reservationIds() const 0039 { 0040 return m_resIds; 0041 } 0042 0043 void TicketTokenModel::setReservationIds(const QStringList& resIds) 0044 { 0045 if (!m_resMgr) { 0046 m_pendingResIds = resIds; 0047 return; 0048 } else { 0049 m_pendingResIds.clear(); 0050 } 0051 0052 beginResetModel(); 0053 m_personNames.clear(); 0054 m_personNames.reserve(m_resIds.size()); 0055 QHash<QString, int> m_personIdx; 0056 0057 for (const auto &resId : resIds) { 0058 const auto v = m_resMgr->reservation(resId); 0059 if (!JsonLd::canConvert<Reservation>(v)) 0060 continue; 0061 const auto res = JsonLd::convert<Reservation>(v); 0062 const auto ticket = res.reservedTicket().value<Ticket>(); 0063 if (ticket.ticketToken().isEmpty() && res.pkpassPassTypeIdentifier().isEmpty()) { 0064 continue; 0065 } 0066 0067 m_resIds.push_back(resId); 0068 const auto person = JsonLd::convert<Reservation>(res).underName().value<Person>(); 0069 if (!person.name().isEmpty()) { 0070 m_personNames.push_back(person.name()); 0071 } else { 0072 const auto idx = ++m_personIdx[res.reservedTicket().value<Ticket>().name()]; 0073 if (JsonLd::isA<EventReservation>(v)) { 0074 m_personNames.push_back(i18n("Attendee %1", idx)); 0075 } else { 0076 m_personNames.push_back(i18n("Traveler %1", idx)); 0077 } 0078 } 0079 } 0080 endResetModel(); 0081 Q_EMIT initialIndexChanged(); 0082 } 0083 0084 QVariant TicketTokenModel::reservationAt(int row) const 0085 { 0086 if (!m_resMgr || row >= m_resIds.size() || row < 0) 0087 return {}; 0088 return m_resMgr->reservation(m_resIds.at(row)); 0089 } 0090 0091 QString TicketTokenModel::reservationIdAt(int row) const 0092 { 0093 if (!m_resMgr || row >= m_resIds.size() || row < 0) 0094 return {}; 0095 return m_resIds.at(row); 0096 } 0097 0098 int TicketTokenModel::rowCount(const QModelIndex& parent) const 0099 { 0100 if (parent.isValid()) 0101 return 0; 0102 return m_resIds.size(); 0103 } 0104 0105 QVariant TicketTokenModel::data(const QModelIndex& index, int role) const 0106 { 0107 if (!index.isValid() || !m_resMgr || index.row() >= m_resIds.size()) 0108 return {}; 0109 0110 const auto res = m_resMgr->reservation(m_resIds.at(index.row())); 0111 switch (role) { 0112 case Qt::DisplayRole: 0113 { 0114 const auto ticket = JsonLd::convert<Reservation>(res).reservedTicket().value<Ticket>(); 0115 if (!ticket.name().isEmpty()) { 0116 return i18n("%1 (%2)", m_personNames.at(index.row()), ticket.name()); 0117 } 0118 return m_personNames.at(index.row()); 0119 } 0120 case ReservationRole: 0121 return res; 0122 } 0123 0124 return {}; 0125 } 0126 0127 QHash<int, QByteArray> TicketTokenModel::roleNames() const 0128 { 0129 auto names = QAbstractListModel::roleNames(); 0130 names.insert(ReservationRole, "reservation"); 0131 return names; 0132 } 0133 0134 int TicketTokenModel::initialIndex() const 0135 { 0136 auto fullName = KUser().property(KUser::FullName).toString(); 0137 auto it = std::find_if(m_personNames.begin(), m_personNames.end(), [fullName](const auto &name) { 0138 return !name.compare(fullName, Qt::CaseInsensitive); 0139 }); 0140 if (it == m_personNames.end()) { 0141 return 0; 0142 } 0143 return it - m_personNames.begin(); 0144 } 0145 #include "moc_tickettokenmodel.cpp"