maplocationmodel: add a "selectedUuid" property to MapLocationModel

Inside the QML Map class there is a MapItemView item.
This item uses a delegate that receive a "model" property from
the MapLocationModel, but infact that's a QObject with the MapLocation
defined properties. That's how MapItemView works.

The problem here is that "model" QObject cannot be cast back
to a MapLocation as the meta data in there does not include
a MapLocation sub-class, for some reason.

Even if using propery() on that QObject to fetch data like coordinates
works, instead of storing this strange object pointer, store the
MapLocation UUID (from dive_site) which is a uint32_t.

setSelectedUuid() deals with this oddity and finds the correct
MapLocation pointer in the table and dispatches a selectedLocationChanged()
signal for it.

Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
This commit is contained in:
Lubomir I. Ivanov 2017-07-19 02:27:30 +03:00 committed by Dirk Hohndel
parent a9c0abd71a
commit 4b03216fdb
2 changed files with 22 additions and 0 deletions

View file

@ -92,3 +92,19 @@ void MapLocationModel::clear()
m_mapLocations.clear();
endRemoveRows();
}
quint32 MapLocationModel::selectedUuid()
{
return m_selectedUuid;
}
void MapLocationModel::setSelectedUuid(quint32 uuid)
{
m_selectedUuid = uuid;
MapLocation *location = NULL;
foreach(location, m_mapLocations) {
if (location->getRole(MapLocation::Roles::RoleUuid) == uuid)
break;
}
emit selectedLocationChanged(location);
}

View file

@ -38,6 +38,7 @@ class MapLocationModel : public QAbstractListModel
{
Q_OBJECT
Q_PROPERTY(int count READ count NOTIFY countChanged)
Q_PROPERTY(quint32 selectedUuid READ selectedUuid WRITE setSelectedUuid NOTIFY selectedLocationChanged)
public:
MapLocationModel(QObject *parent = NULL);
@ -56,11 +57,16 @@ protected:
QHash<int, QByteArray> roleNames() const;
private:
quint32 selectedUuid();
void setSelectedUuid(quint32);
QVector<MapLocation *> m_mapLocations;
QHash<int, QByteArray> m_roles;
quint32 m_selectedUuid;
signals:
void countChanged(int c);
void selectedLocationChanged(MapLocation *);
};