From fc6cb67626b3270d8619c38dab671e954d78be88 Mon Sep 17 00:00:00 2001 From: "Lubomir I. Ivanov" Date: Mon, 17 Jul 2017 17:58:34 +0300 Subject: qt-models/maplocationmodel: add new classes for map model based handling The QML Map widget requires a QAbstractListModel based model to operate with good performance. Technically gpslistmodel.cpp can be used for that same purpose (e.g. has GPS coordinates), but the way it updates may complicate the Map widget integration. Thus, a new model is created - MapLocationModel, with items of type MapLocation, for an attempt for a clean project structure on the C++ side. For now it only handles latitude and longitude. Signed-off-by: Lubomir I. Ivanov --- qt-models/maplocationmodel.cpp | 65 ++++++++++++++++++++++++++++++++++++++++++ qt-models/maplocationmodel.h | 60 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 125 insertions(+) create mode 100644 qt-models/maplocationmodel.cpp create mode 100644 qt-models/maplocationmodel.h (limited to 'qt-models') diff --git a/qt-models/maplocationmodel.cpp b/qt-models/maplocationmodel.cpp new file mode 100644 index 000000000..5da0733e1 --- /dev/null +++ b/qt-models/maplocationmodel.cpp @@ -0,0 +1,65 @@ +// SPDX-License-Identifier: GPL-2.0 +#include "maplocationmodel.h" + +MapLocation::MapLocation() +{ +} + +MapLocation::MapLocation(qreal latitude, qreal longitude) : + m_latitude(latitude), m_longitude(longitude) +{ +} + +QVariant MapLocation::getRole(int role) const +{ + switch (role) { + case Roles::RoleLatitude: + return m_latitude; + case Roles::RoleLongitude: + return m_longitude; + default: + return QVariant(); + } +} + +MapLocationModel::MapLocationModel(QObject *parent) : QAbstractListModel(parent) +{ + m_roles[MapLocation::Roles::RoleLatitude] = "latitude"; + m_roles[MapLocation::Roles::RoleLongitude] = "longitude"; +} + +MapLocationModel::~MapLocationModel() +{ + qDeleteAll(m_mapLocations); +} + +QVariant MapLocationModel::data( const QModelIndex & index, int role ) const +{ + if (index.row() < 0 || index.row() >= m_mapLocations.size()) + return QVariant(); + + return m_mapLocations.at(index.row())->getRole(role); +} + +QHash MapLocationModel::roleNames() const +{ + return m_roles; +} + +int MapLocationModel::rowCount(const QModelIndex &parent) const +{ + Q_UNUSED(parent); + return m_mapLocations.size(); +} + +int MapLocationModel::count() +{ + return m_mapLocations.size(); +} + +MapLocation *MapLocationModel::get(int row) +{ + if (row < 0 || row >= m_mapLocations.size()) + return NULL; + return m_mapLocations.at(row); +} diff --git a/qt-models/maplocationmodel.h b/qt-models/maplocationmodel.h new file mode 100644 index 000000000..e398a8091 --- /dev/null +++ b/qt-models/maplocationmodel.h @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: GPL-2.0 +#ifndef MAPLOCATIONMODEL_H +#define MAPLOCATIONMODEL_H + +#include +#include +#include +#include +#include + +class MapLocation : public QObject +{ + Q_OBJECT + Q_PROPERTY(qreal latitude MEMBER m_latitude) + Q_PROPERTY(qreal longitude MEMBER m_longitude) + +public: + explicit MapLocation(); + explicit MapLocation(qreal lat, qreal lng); + + QVariant getRole(int role) const; + + enum Roles { + RoleLatitude = Qt::UserRole + 1, + RoleLongitude + }; + +private: + qreal m_latitude; + qreal m_longitude; +}; + +class MapLocationModel : public QAbstractListModel +{ + Q_OBJECT + Q_PROPERTY(int count READ count NOTIFY countChanged) + +public: + MapLocationModel(QObject *parent = NULL); + ~MapLocationModel(); + + Q_INVOKABLE MapLocation *get(int row); + + QVariant data(const QModelIndex &index, int role) const override; + int rowCount(const QModelIndex &parent) const override; + int count(); + +protected: + QHash roleNames() const; + +private: + QList m_mapLocations; + QHash m_roles; + +signals: + void countChanged(int c); + +}; + +#endif -- cgit v1.2.3-70-g09d2