Files
qt5-legatus-legacy/Lts/Plugins/SituationMapPlugin/Gui/SituationMap/MapObjectSelection/map_object_model.h
T
2026-08-13 18:33:10 +02:00

188 lines
5.0 KiB
C++
Executable File

/**
* @RDE_HEADER@
* MapObjectModel
* $Id$
* $HeadURL$
* $Author$
* Created by Norbert Thoden, SLSE, 2017-04-11
*/
#pragma once
// Own
#include <Map/map.h>
#include <Symbology/symbol_result.h>
#include <Common/situation_map_logging.h>
#include <LtsWidgets/lts_abstract_table_model.h>
#include <LtsWidgets/lts_column_filter_proxy_model.h>
namespace SituationMap
{
// --------------------------------------------------------
// MapObjectData
// --------------------------------------------------------
class MapObjectData : public QObject
{
Q_OBJECT
public:
explicit MapObjectData(UniqueMapId uniqueMapId = INVALID_MAP_ID)
: m_uniqueMapId(uniqueMapId)
{}
~MapObjectData();
void requestImage(AdvancedSymbology::SymbolDictionary *dict);
void setImage(const QImage &img);
// basic data:
UniqueMapId m_uniqueMapId;
int m_participantId{-1};
int m_equipmentNumber{-1};
int m_partyId{-1};
int m_typeId{-1};
int m_vulnerabilityState{-1};
QString m_partyName;
QString m_typeName;
QString m_vulnerabilityString;
int m_buildingId{-1};
QString m_description1;
QString m_description2;
// sidc -> icon/image:
SymbolDataToRender m_symDataToRender;
QPixmap m_pixIcon;
QPixmap m_pixPicture;
private:
AdvancedSymbology::SymbolResultWatcher *m_symbolResultWatcher = nullptr;
Q_SIGNALS:
void dataChanged(UniqueMapId uniqueMapId);
public Q_SLOTS:
void onResultReady();
private:
};
// --------------------------------------------------------
// MapObjectModel
// --------------------------------------------------------
class MapObjectModel : public LtsWidgets::LtsAbstractTableModel<QSharedPointer<MapObjectData>>
{
Q_OBJECT
using BaseClass = LtsWidgets::LtsAbstractTableModel<QSharedPointer<MapObjectData>>;
public:
enum Columns
{
UNIQUE_MAP_ID = 0,
SIDC,
SINGLE_DESCRIPTION,
ICON,
PARTICIPANT_ID,
EQUIPMENT_NUMBER,
PARTY,
TYPE_ID,
TYPE_NAME,
VULNERABILITY_STATE_ID,
VULNERABILITY_STATE,
DESCRIPTION1,
DESCRIPTION2,
PICTURE
};
explicit MapObjectModel(QObject *parent = nullptr);
~MapObjectModel();
void initModel(Map *map);
bool contains(UniqueMapId uniqueMapId) const;
void remove(UniqueMapId uniqueMapId);
void setMapObjectData(const QVector<QSharedPointer<MapObjectData>> &mapObjectDataVec);
bool addMapObjectData(const QSharedPointer<MapObjectData> &mapObjectData);
bool updateMapObjectData(const QSharedPointer<MapObjectData> &mapObjectData);
template<typename T = QVector<UniqueMapId>>
T allMapObjects() const
{
T uniqueMapIds;
uniqueMapIds.reserve(m_vecData.size());
for (const DATA_T &item : m_vecData)
if (item)
uniqueMapIds += item->m_uniqueMapId;
return uniqueMapIds;
}
template<typename T = QVector<int>>
T allEquipmentNumbers() const
{
T equipmentNumbers;
equipmentNumbers.reserve(m_vecData.size());
for (const DATA_T &item : m_vecData)
if (item && item->m_equipmentNumber > 0)
equipmentNumbers += item->m_equipmentNumber;
return equipmentNumbers;
}
QVariant headerData(int section, Qt::Orientation orientation, int role) const override final;
QVariant data(const QModelIndex &, int) const override final;
UniqueMapId uniqueMapIdOfIndex(const QModelIndex &index) const;
private Q_SLOTS:
void onDataChanged(UniqueMapId uniqueMapId);
void requestCivilIcons();
void updateUsedPartyIds();
private:
using DATA_T = QSharedPointer<MapObjectData>;
int findRowForUniqueMapId(UniqueMapId uniqueMapId) const;
void requestIcon(const DATA_T &data) const;
Map *m_map = nullptr;
AdvancedSymbology::SymbolDictionary *m_dictionary = nullptr;
QMap<int, int> m_usedPartyIds; // keep sorted
QSet<QString> m_usedTypeName;
QMap<int, QString> m_usedVulnerabilities; // keep sorted
LOGGER_T m_logger;
friend class MapObjectProxyModel;
};
// MapObjectModel
// --------------------------------------------------------
// MapObjectProxyModel
// --------------------------------------------------------
class MapObjectProxyModel : public LtsWidgets::LtsColumnFilterProxyModel
{
Q_OBJECT
using BaseClass = LtsWidgets::LtsColumnFilterProxyModel;
public:
using LtsWidgets::LtsColumnFilterProxyModel::LtsColumnFilterProxyModel;
void setSourceModel(QAbstractItemModel *sourceModel) override;
protected:
bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const override;
protected:
MapObjectModel *m_sourceModel = nullptr;
};
} // namespace SituationMap