File indexing completed on 2024-05-12 04:42:52

0001 /*
0002     SPDX-FileCopyrightText: 2019 Volker Krause <vkrause@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #ifndef KPUBLICTRANSPORT_JOURNEYQUERYMODEL_H
0008 #define KPUBLICTRANSPORT_JOURNEYQUERYMODEL_H
0009 
0010 #include "kpublictransport_export.h"
0011 #include "abstractquerymodel.h"
0012 
0013 #include <KPublicTransport/JourneyRequest>
0014 
0015 namespace KPublicTransport {
0016 
0017 class Journey;
0018 class JourneyQueryModelPrivate;
0019 
0020 /**
0021  * Model representing journey query results.
0022  * This takes care of dynamically updating as results arrive from different
0023  * backends, including merging them, as well as providing a way to search
0024  * for earlier/later journeys for the initial request.
0025  */
0026 class KPUBLICTRANSPORT_EXPORT JourneyQueryModel : public AbstractQueryModel
0027 {
0028     Q_OBJECT
0029 
0030     /** Specify the requested journey. */
0031     Q_PROPERTY(KPublicTransport::JourneyRequest request READ request WRITE setRequest NOTIFY requestChanged)
0032 
0033     /** Whether querying for later journeys is possible. */
0034     Q_PROPERTY(bool canQueryNext READ canQueryNext NOTIFY canQueryPrevNextChanged)
0035     /** Whether querying for earlier journey is possible. */
0036     Q_PROPERTY(bool canQueryPrevious READ canQueryPrevious NOTIFY canQueryPrevNextChanged)
0037 
0038 public:
0039     explicit JourneyQueryModel(QObject *parent = nullptr);
0040     ~JourneyQueryModel() override;
0041 
0042     JourneyRequest request() const;
0043     /** Specify the actual journey query. */
0044     void setRequest(const JourneyRequest &req);
0045 
0046     bool canQueryNext() const;
0047     /** Search for later journeys.
0048      *  Has no effect if canQueryNext() returns @c false.
0049      */
0050     Q_INVOKABLE void queryNext();
0051 
0052     bool canQueryPrevious() const;
0053     /** Search for earlier journeys.
0054      *  Has no effect if canQueryPrevious() returns @c false.
0055      */
0056     Q_INVOKABLE void queryPrevious();
0057 
0058     enum Roles {
0059         JourneyRole = Qt::UserRole,
0060         ScheduledDepartureTime,
0061         ScheduledArrivalTime
0062     };
0063     Q_ENUM(Roles)
0064 
0065     int rowCount(const QModelIndex &parent) const override;
0066     QVariant data(const QModelIndex &index, int role) const override;
0067     QHash<int, QByteArray> roleNames() const override;
0068 
0069     /** The current model content. */
0070     const std::vector<Journey>& journeys() const;
0071 
0072 Q_SIGNALS:
0073     void requestChanged();
0074     void canQueryPrevNextChanged();
0075 
0076 private:
0077     friend class JourneyQueryModelPrivate;
0078     Q_DECLARE_PRIVATE(JourneyQueryModel)
0079 };
0080 
0081 }
0082 
0083 #endif // KPUBLICTRANSPORT_JOURNEYQUERYMODEL_H