/** * @RDE_HEADER@ * MapObjectModel * $Id$ * $HeadURL$ * $Author$ * Created by Norbert Thoden, SLSE, 2017-04-11 */ #pragma once // Own #include #include #include #include #include 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> { Q_OBJECT using BaseClass = LtsWidgets::LtsAbstractTableModel>; 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> &mapObjectDataVec); bool addMapObjectData(const QSharedPointer &mapObjectData); bool updateMapObjectData(const QSharedPointer &mapObjectData); template> 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> 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; int findRowForUniqueMapId(UniqueMapId uniqueMapId) const; void requestIcon(const DATA_T &data) const; Map *m_map = nullptr; AdvancedSymbology::SymbolDictionary *m_dictionary = nullptr; QMap m_usedPartyIds; // keep sorted QSet m_usedTypeName; QMap 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