File indexing completed on 2024-05-05 16:58:38

0001 // SPDX-FileCopyrightText: 2023 Tobias Fella <tobias.fella@kde.org>
0002 // SPDX-License-Identifier: GPL-2.0-or-later
0003 
0004 #pragma once
0005 
0006 #include <QAbstractListModel>
0007 #include <QPointer>
0008 #include <QRectF>
0009 
0010 #include "neochatroom.h"
0011 
0012 #include <Quotient/events/roommessageevent.h>
0013 
0014 class LocationsModel : public QAbstractListModel
0015 {
0016     Q_OBJECT
0017 
0018 public:
0019     enum Roles {
0020         TextRole = Qt::DisplayRole,
0021         LongitudeRole,
0022         LatitudeRole,
0023         AssetRole,
0024         AuthorRole,
0025     };
0026     Q_ENUM(Roles)
0027     Q_PROPERTY(NeoChatRoom *room READ room WRITE setRoom NOTIFY roomChanged)
0028     /** Bounding box of all locations covered by this model. */
0029     Q_PROPERTY(QRectF boundingBox READ boundingBox NOTIFY boundingBoxChanged)
0030 
0031     explicit LocationsModel(QObject *parent = nullptr);
0032 
0033     [[nodiscard]] NeoChatRoom *room() const;
0034     void setRoom(NeoChatRoom *room);
0035 
0036     QRectF boundingBox() const;
0037 
0038     [[nodiscard]] QHash<int, QByteArray> roleNames() const override;
0039     [[nodiscard]] QVariant data(const QModelIndex &index, int roleName) const override;
0040     [[nodiscard]] int rowCount(const QModelIndex &parent = {}) const override;
0041 
0042 Q_SIGNALS:
0043     void roomChanged();
0044     void boundingBoxChanged();
0045 
0046 private:
0047     QPointer<NeoChatRoom> m_room;
0048 
0049     struct LocationData {
0050         QString eventId;
0051         float latitude;
0052         float longitude;
0053         QJsonObject content;
0054         NeoChatUser *author;
0055     };
0056     QList<LocationData> m_locations;
0057     void addLocation(const Quotient::RoomMessageEvent *event);
0058 };