/** * @RDE_HEADER@ * GUI Plugin for ParticipantsMoveDialog * $Id$ * $HeadURL$ * $Author$ * Created by Gerlinde Rudolphus, SLSE, 2018-01-02 */ #pragma once //Lts #include #include #include #include "participant_move_dialog.h" #include #include "participants_move_model.h" //DDS #include #include #include #include #include #include #include #include #include #include "logger.h" //Qt #include #include #include namespace Ui { class ParticipantMoveDialog; } namespace CentralEffectSimulation { // -------------------------------------------------------- // ParticipantMoveDialog // -------------------------------------------------------- class ParticipantsMoveDialog : public LtsWidgets::LtsDialog , protected CentralEffectSimulation::Interface::Ftc::SimulatedMovementRemoveByParticipantIdReplyHandler , protected ParticipantManagement::Interface::Ftc::SetSimulatedPositionReplyHandler , protected ParticipantManagement::Interface::Ftc::SetSimulatedPositionRelativeReplyHandler , protected ParticipantManagement::Interface::Ftc::SetSimulatedParticipantFormationReplyHandler { Q_OBJECT public: explicit ParticipantsMoveDialog(const QString &menuGroup, QWidget *parent = nullptr); ~ParticipantsMoveDialog(); bool init(LtsSession::LtsSession *session, const std::shared_ptr &ppmDtc, const std::shared_ptr &cesDtc, const std::shared_ptr &ppmFtc); void onSimulatedMovementRemoveByParticipantIdReply(const Core::FunctionReplyObject &replyObject) override; void onSetSimulatedPositionReply(const Core::FunctionReplyObject &replyObject) override; void onSetSimulatedPositionRelativeReply(const Core::FunctionReplyObject &replyObject) override; void onSetSimulatedParticipantFormationReply(const Core::FunctionReplyObject &replyObject) override; enum class FormationGeometrieType : int { AimPoint, Radial, Area, Line, Point }; public slots: void onGetCoordinate(QPointF coordinate); private: bool getUnitPosition(int32_t participantId, Core::GeoPosition &unitPositionOut); void doSetSimulatedPositionRequest(const ParticipantManagement::ParticipantData &participantData, const QPointF &coordinate); void doSetSimulatedPositionRelativeRequest(const ParticipantManagement::ParticipantData &participantData, const QPointF &coordinate); void doSetSimulatedParticipantFormationRequest(const ParticipantManagement::ParticipantData &participantData, const QPointF &coordinate, const QString &formationData); private slots: void closeDialogReceived(int32_t participantId); void onModelChanged(); private: void retranslate() override; void onClicked(); void onRemove(); void onSetSimulatedMGRSPosition(); bool participantInUse4ExplosionCluster(const QModelIndex &participantIndex); void changeParty(); void onSelectionChanged(); void onDoubleClicked(); void onSetPosition(); void setDialogEnable(bool enable); bool isParticipantInUseForExplosionCluster(int id); void tableColumnOrganiserSetting() override; struct ParticipantTypePropertyStruct { QString m_propertiesStr; bool isArtillery = false; QString geometry = QStringLiteral("line"); double distance = -1; double angle = -1; QVariantMap distanceSets; QJsonObject distanceSetsObj; ParticipantTypePropertyStruct() {} explicit ParticipantTypePropertyStruct(const QString &properties) : m_propertiesStr(properties) { setFormation(properties); } void setDefaultValue() { isArtillery = false; geometry = QStringLiteral("line"); distance = -1; angle = -1; distanceSets.clear(); } void setFormation(const QString &jsData) { setDefaultValue(); const QJsonObject typObj = QJsonDocument::fromJson(QByteArray::fromStdString(jsData.toStdString())).object(); if (typObj.isEmpty()) return; isArtillery = typObj[isArtilleryStr].toBool(false); // Formation data Object const QJsonObject &formationObj = typObj[formationStr].toObject(); if (formationObj.isEmpty()) { setDefaultValue(); return; } geometry = formationObj[geometryStr].toString(QStringLiteral("line")); angle = formationObj[angleStr].toDouble(-1); distance = formationObj[distanceStr].toDouble(-1); distanceSetsObj = formationObj[distanceSetsStr].toObject(); distanceSets = distanceSetsObj.toVariantMap(); } bool hasFormationData() const { if (isArtillery == false) return true; // no need to continue artillery must be set for formation data to be changed else return (angle != -1) && (distance != -1); } QString getFormationDataObjectString() const { QJsonObject obj {{geometryStr, geometry}, {angleStr, angle}, {distanceStr, distance}, {distanceSetsStr, distanceSetsObj} // doesnt change. use in combobox for selection. selection used by distance }; return QString::fromStdString(QJsonDocument(obj).toJson(QJsonDocument::Compact).toStdString()); } const QString isArtilleryStr = QStringLiteral("isArtillery"); const QString formationStr = QStringLiteral("formation"); const QString geometryStr = QStringLiteral("geometry"); const QString angleStr = QStringLiteral("angle"); const QString distanceStr = QStringLiteral("distance"); const QString distanceSetsStr = QStringLiteral("distanceSets"); }; void setFormationAndPositioningUi(const ParticipantManagement::ParticipantData &participantData, QPointF &mgrsCoordinate, const bool &unitWithFormation); bool removeFtc(int32_t participantId); ParticipantManagement::ParticipantData participantFromIndex(const QModelIndex &idx) const; private: ParticipantMoveModel *m_participantModel{nullptr}; std::shared_ptr m_ppmDtc; std::shared_ptr m_ppmFtc; std::shared_ptr m_aesDtc; std::shared_ptr m_cesDtc; std::shared_ptr m_ppmCbxIfc; std::shared_ptr m_ftc; Ui::ParticipantMoveDialog *m_ui{nullptr}; LtsSession::LtsSession *m_session{nullptr}; QString m_menuGroup; QMap m_participantDialogMap; LtsUtils::RequestHelper *m_requestHelper{nullptr}; std::shared_ptr m_sitMapGuiIfc; bool m_shiftModifierWhileOnSetPosition{false}; bool m_mgrsPosEditCoordinateActive{false}; LOGGER_T m_logger; QRectF m_trainingAreaRect; ParticipantTypePropertyStruct m_formationProps; }; } // namespace CentralEffectSimulation