From a3d0c8b8007b04591b965b87f7d5474380b2e34c Mon Sep 17 00:00:00 2001 From: Volker Krause Date: Sat, 19 May 2018 13:14:37 +0200 Subject: [PATCH] Make the timeline model element type explicit This will allow us to add more elements that have no reservation attached to them, like country information or weather information. --- src/app/timelinemodel.cpp | 48 ++++++++++++++++++--------------------- src/app/timelinemodel.h | 5 +++- 2 files changed, 26 insertions(+), 27 deletions(-) diff --git a/src/app/timelinemodel.cpp b/src/app/timelinemodel.cpp index 96013d6..8fb1136 100644 --- a/src/app/timelinemodel.cpp +++ b/src/app/timelinemodel.cpp @@ -43,9 +43,7 @@ static bool needsSplitting(const QVariant &res) static QDateTime relevantDateTime(const QVariant &res, TimelineModel::RangeType range) { - if (res.isNull()) { // today marker - return QDateTime(QDate::currentDate(), QTime(0, 0)); - } else if (res.userType() == qMetaTypeId()) { + if (res.userType() == qMetaTypeId()) { const auto flight = res.value().reservationFor().value(); if (flight.boardingTime().isValid()) { return flight.boardingTime(); @@ -82,6 +80,16 @@ static QString passId(const QVariant &res) return passTypeId + QLatin1Char('/') + QString::fromUtf8(serialNum.toUtf8().toBase64(QByteArray::Base64UrlEncoding)); } +static TimelineModel::ElementType elementType(const QVariant &res) +{ + if (JsonLd::isA(res)) { return TimelineModel::Flight; } + if (JsonLd::isA(res)) { return TimelineModel::Hotel; } + if (JsonLd::isA(res)) { return TimelineModel::TrainTrip; } + if (JsonLd::isA(res)) { return TimelineModel::BusTrip; } + if (JsonLd::isA(res)) { return TimelineModel::Restaurant; } + return {}; +} + TimelineModel::TimelineModel(QObject *parent) : QAbstractListModel(parent) { @@ -101,14 +109,14 @@ void TimelineModel::setReservationManager(ReservationManager* mgr) for (const auto &resId : mgr->reservations()) { const auto res = m_resMgr->reservation(resId); if (needsSplitting(res)) { - m_elements.push_back(Element{resId, relevantDateTime(mgr->reservation(resId), RangeBegin), RangeBegin}); - m_elements.push_back(Element{resId, relevantDateTime(mgr->reservation(resId), RangeEnd), RangeEnd}); + m_elements.push_back(Element{resId, relevantDateTime(res, RangeBegin), elementType(res), RangeBegin}); + m_elements.push_back(Element{resId, relevantDateTime(res, RangeEnd), elementType(res), RangeEnd}); } else { - m_elements.push_back(Element{resId, relevantDateTime(mgr->reservation(resId), SelfContained), SelfContained}); + m_elements.push_back(Element{resId, relevantDateTime(res, SelfContained), elementType(res), SelfContained}); } } - m_elements.push_back(Element{{}, relevantDateTime({}, SelfContained), SelfContained}); // today marker - std::sort(m_elements.begin(), m_elements.end(), [this](const Element &lhs, const Element &rhs) { + m_elements.push_back(Element{{}, QDateTime(QDate::currentDate(), QTime(0, 0)), TodayMarker, SelfContained}); + std::sort(m_elements.begin(), m_elements.end(), [](const Element &lhs, const Element &rhs) { return lhs.dt < rhs.dt; }); connect(mgr, &ReservationManager::reservationAdded, this, &TimelineModel::reservationAdded); @@ -150,21 +158,9 @@ QVariant TimelineModel::data(const QModelIndex& index, int role) const case ReservationIdRole: return elem.id; case ElementTypeRole: - if (res.isNull()) - return TodayMarker; - else if (res.userType() == qMetaTypeId()) - return Flight; - else if (res.userType() == qMetaTypeId()) - return Hotel; - else if (res.userType() == qMetaTypeId()) - return TrainTrip; - else if (res.userType() == qMetaTypeId()) - return BusTrip; - else if (res.userType() == qMetaTypeId()) - return Restaurant; - return {}; + return elem.elementType; case TodayEmptyRole: - if (res.isNull()) { + if (elem.elementType == TodayMarker) { return index.row() == (int)(m_elements.size() - 1) || m_elements.at(index.row() + 1).dt.date() > QDate::currentDate(); } return {}; @@ -201,10 +197,10 @@ void TimelineModel::reservationAdded(const QString &resId) { const auto res = m_resMgr->reservation(resId); if (needsSplitting(res)) { - insertElement(Element{resId, relevantDateTime(res, RangeBegin), RangeBegin}); - insertElement(Element{resId, relevantDateTime(res, RangeEnd), RangeEnd}); + insertElement(Element{resId, relevantDateTime(res, RangeBegin), elementType(res), RangeBegin}); + insertElement(Element{resId, relevantDateTime(res, RangeEnd), elementType(res), RangeEnd}); } else { - insertElement(Element{resId, relevantDateTime(res, SelfContained), SelfContained}); + insertElement(Element{resId, relevantDateTime(res, SelfContained), elementType(res), SelfContained}); } emit todayRowChanged(); @@ -246,7 +242,7 @@ void TimelineModel::updateElement(const QString &resId, const QVariant &res, Tim beginRemoveRows({}, row, row); m_elements.erase(it); endRemoveRows(); - insertElement(Element{resId, newDt, rangeType}); + insertElement(Element{resId, newDt, elementType(res), rangeType}); } else { emit dataChanged(index(row, 0), index(row, 0)); } diff --git a/src/app/timelinemodel.h b/src/app/timelinemodel.h index 05bc456..10b379c 100644 --- a/src/app/timelinemodel.h +++ b/src/app/timelinemodel.h @@ -43,12 +43,14 @@ public: }; enum ElementType { + Undefined, Flight, TrainTrip, BusTrip, Hotel, Restaurant, - TodayMarker + TodayMarker, + CountryInfo }; Q_ENUM(ElementType) @@ -79,6 +81,7 @@ private: struct Element { QString id; // reservation id QDateTime dt; // relevant date/time + ElementType elementType; RangeType rangeType; }; -- GitLab