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

0001 /*
0002     SPDX-FileCopyrightText: 2020 Volker Krause <vkrause@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #ifndef KOSMINDOORMAP_LOCATIONQUERYOVERLAYPROXYMODEL_H
0008 #define KOSMINDOORMAP_LOCATIONQUERYOVERLAYPROXYMODEL_H
0009 
0010 #include <QAbstractItemModel>
0011 #include <qqmlregistration.h>
0012 
0013 #include <KOSMIndoorMap/MapData>
0014 
0015 namespace OSM {
0016 class Element;
0017 class Node;
0018 }
0019 
0020 namespace KOSMIndoorMap {
0021 
0022 /** Adapts a KPublicTransport::LocationQueryModel to be compatible with a KOSMIndoorMap::OverlaySource.
0023  */
0024 class LocationQueryOverlayProxyModel : public QAbstractListModel
0025 {
0026     Q_OBJECT
0027     Q_PROPERTY(KOSMIndoorMap::MapData mapData READ mapData WRITE setMapData NOTIFY mapDataChanged)
0028     Q_PROPERTY(QObject* sourceModel READ sourceModel WRITE setSourceModel NOTIFY sourceModelChanged)
0029     QML_ELEMENT
0030 
0031 public:
0032     explicit LocationQueryOverlayProxyModel(QObject *parent = nullptr);
0033     ~LocationQueryOverlayProxyModel();
0034 
0035     MapData mapData() const;
0036     void setMapData(const MapData &data);
0037 
0038     QObject *sourceModel() const;
0039     void setSourceModel(QObject *sourceModel);
0040 
0041     enum Role {
0042         ElementRole = Qt::UserRole,
0043         LevelRole,
0044         HiddenElementRole,
0045     };
0046     Q_ENUM(Role)
0047 
0048     int rowCount(const QModelIndex &parent = {}) const override;
0049     QVariant data(const QModelIndex & index, int role) const override;
0050     QHash<int, QByteArray> roleNames() const override;
0051 
0052 Q_SIGNALS:
0053     void mapDataChanged();
0054     void sourceModelChanged();
0055 
0056 private:
0057     struct Info {
0058         OSM::Node overlayNode;
0059         OSM::Element sourceElement;
0060     };
0061 
0062     void initialize();
0063     Info nodeForRow(int row) const;
0064 
0065     struct {
0066         OSM::TagKey name;
0067         OSM::TagKey amenity;
0068         OSM::TagKey capacity;
0069         OSM::TagKey realtimeAvailable;
0070         OSM::TagKey network;
0071         OSM::TagKey mxoid;
0072         OSM::TagKey remainingRange;
0073         OSM::TagKey vehicle;
0074         OSM::TagKey addr_street;
0075         OSM::TagKey addr_city;
0076         OSM::TagKey addr_postcode;
0077     } m_tagKeys;
0078     OSM::TagKey m_realtimeAvailableTagKeys[5];
0079 
0080     std::vector<Info> m_nodes;
0081     MapData m_data;
0082     QAbstractItemModel *m_sourceModel = nullptr;
0083 };
0084 
0085 }
0086 
0087 #endif // KOSMINDOORMAP_LOCATIONQUERYOVERLAYPROXYMODEL_H