1 // SPDX-License-Identifier: LGPL-2.1-or-later
2 //
3 // SPDX-FileCopyrightText: 2010 Dennis Nienhüser <nienhueser@kde.org>
4 //
5 
6 #ifndef MARBLE_ROUTINGMODEL_H
7 #define MARBLE_ROUTINGMODEL_H
8 
9 #include "marble_export.h"
10 
11 #include <QAbstractListModel>
12 
13 class QIODevice;
14 
15 /**
16   * A QAbstractItemModel that contains a list of routing instructions.
17   * Each item represents a routing step in the way from source to
18   * destination. Steps near the source come first, steps near the target
19   * last.
20   */
21 namespace Marble
22 {
23 
24 class RoutingModelPrivate;
25 class Route;
26 class RouteRequest;
27 class GeoDataCoordinates;
28 class PositionTracking;
29 
30 class MARBLE_EXPORT RoutingModel : public QAbstractListModel
31 {
32     Q_OBJECT
33 
34     Q_PROPERTY( bool deviatedFromRoute READ deviatedFromRoute NOTIFY deviatedFromRoute )
35 
36 public:
37     enum RoutingModelRoles {
38         CoordinateRole = Qt::UserRole + 3,
39         TurnTypeIconRole,
40         LongitudeRole,
41         LatitudeRole
42     };
43 
44     /** Constructor */
45     explicit RoutingModel(RouteRequest *request, PositionTracking *positionTracking, QObject *parent = nullptr);
46 
47     /** Destructor */
48     ~RoutingModel() override;
49 
50     // Model querying
51 
52     /** Overload of QAbstractListModel */
53     int rowCount ( const QModelIndex &parent = QModelIndex() ) const override;
54 
55     /** Overload of QAbstractListModel */
56     QVariant headerData ( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const override;
57 
58     /** Overload of QAbstractListModel */
59     QVariant data ( const QModelIndex &index, int role = Qt::DisplayRole ) const override;
60 
61     /** Overload of QAbstractListModel */
62     QHash<int, QByteArray> roleNames() const override;
63 
64     // Model data filling
65 
66     /**
67       * Export waypoints and instructions in gpx format
68       */
69     void exportGpx( QIODevice *device ) const;
70 
71     /**
72       * Clear any data held in the model
73       */
74     void clear();
75 
76     /**
77       * Maps points from the provided route request to waypoints in the model
78       * according to their global minimal distance. Returns the right neighbor
79       * (next route request item along the waypoints) of the provided position.
80       * Provided route must not be null.
81       * @return -1 If the provided route is empty, the index of the right
82       * neighbor along the waypoints otherwise (result is a valid RouteRequest
83       * index in that case)
84       */
85     int rightNeighbor( const GeoDataCoordinates &position, RouteRequest const *const route ) const;
86 
87     /**
88      * returns whether the gps location is on route
89      */
90     bool deviatedFromRoute() const;
91 
92     const Route & route() const;
93 
94 public Q_SLOTS:
95     /**
96       * Old data in the model is discarded and a model reset is done
97       */
98     void setRoute( const Route &route );
99 
100     void updatePosition( const GeoDataCoordinates&, qreal );
101 
102 Q_SIGNALS:
103    /**
104     * emits a signal regarding information about total time( seconds ) and distance( metres ) remaining to reach destination
105     */
106     void positionChanged();
107     void deviatedFromRoute( bool deviated );
108 
109     /** A different route was loaded */
110     void currentRouteChanged();
111 
112 private:
113     RoutingModelPrivate *const d;
114 };
115 
116 } // namespace Marble
117 
118 #endif
119