/** * @RDE_HEADER@ * AreaEffectSimulation - Explosions Edit Dialog * $Id$ * $HeadURL$ * $Author$ * Created by Steve Tougnia, SLTE, 2023-09-05 */ #pragma once #include #include #include #include #include #include #include #include #include "LtsElevation/lts_elevation_manager.h" #include #include namespace Ui { class ExplosionsEdit; } class QSpinBox; namespace AdvancedSymbology { class SymbolResultWatcherLabel; class ForeignDataInterface; } namespace AreaEffectSimulation { class ExplosionsEdit final : public BaseEdit , protected AreaEffectSimulation::Interface::Ftc::ExplosionAreaModifyReplyHandler , protected AreaEffectSimulation::Interface::Ftc::ExplosionSingleModifyReplyHandler , protected AreaEffectSimulation::Interface::Ftc::ExplosionAreaPauseResumeReplyHandler , protected AreaEffectSimulation::Interface::Ftc::ExplosionClusterModifyReplyHandler , protected AreaEffectSimulation::Interface::Ftc::ExplosionClusterPauseResumeReplyHandler { Q_OBJECT public: using BaseClass = BaseEdit; enum class FlighDurationOrPeakHeight { FDPH_flightDuration, FDPH_peakHeight }; QString toString(FlighDurationOrPeakHeight val); explicit ExplosionsEdit(const QString &menuGroup, QWidget *parent = nullptr); ~ExplosionsEdit(); bool init(int aesItemId, bool copy, LtsSession::LtsSession *session); void setExplosionClusterData(const ExplosionCluster &ecData); QString dialogIdentifier() const override; void onExplosionAreaModifyReply(const Core::FunctionReplyObject &replyObject) override final { onAesItemModifyReply(replyObject); } void onExplosionSingleModifyReply(const Core::FunctionReplyObject &replyObject) override final { onAesItemModifyReply(replyObject); } void onExplosionClusterModifyReply(const Core::FunctionReplyObject &replyObject) override final { onAesItemModifyReply(replyObject); } void onExplosionAreaPauseResumeReply(const Core::FunctionReplyObject &replyObject) override final { m_requestHelper->requestReply(replyObject); } void onExplosionClusterPauseResumeReply(const Core::FunctionReplyObject &replyObject) override final { m_requestHelper->requestReply(replyObject); } void onExplosionClusterChanged(const AreaEffectSimulation::ExplosionCluster &ecData, DataModification modType); void handleLaserPrecisionChargeType(const int chargeTypeId); QPointF centerOfFiringUnitGeo(int particpantUnitId); void showCenterOfFiringUnit(int particpantUnitId); private Q_SLOTS: void showPreviewObject() override; bool isDataSufficiant(); bool apply() override final; void onGeometrySelected(int explosionGeometryInt); void onFireClicked(); void onGearClassChanged(); void onPositionChanged(const QPointF &newGeoCoord); void onPartyChanged(); void onChargeTypeChanged(); void onIgniterTypeChanged(); void onParticipantUnitChanged(int idx); void onParticipantUnitEntered(); void onParticipantUnitLeaved(); void onParticipantPositionChanged(); void getPosition(); void onCoordinate(const QPointF ¢erPoint); void onMapRecData(const QPointF &bottomLeft, double width, double height, double angleDegNorth, const QPolygonF &bufferOutlinePolygon); void onCircleData(const QPointF &position, double radius); void onPolylineData(const QPolygonF &polyline); void setCoord(const QPointF &coord); void onFirePurposeChanged(); void onDropAngleChanged(); void onWidthChanged(int width); void onAimingAxisChanged(int aimingAxis); void onLineP1Changed(const QPointF &point); void onLineP2Changed(const QPointF &point); void onPeakHeigthChanged(int data); void onFlightDurationChanged(int data); void onEffectDurationChanged(int value); void switchTo(FlighDurationOrPeakHeight phfd); void setMinMaxConstraints(ExplosionsEdit::FlighDurationOrPeakHeight phfd, ProjectDataManagement::GearClass_def::type gearClass, int chargeTypeId); bool setValueAccordingContraints(int newValue, ExplosionsEdit::FlighDurationOrPeakHeight phfd); bool isGuiVulcano(); void doCalculations(bool executeEnableUiElements = true); void onPartitionTimeChanged(qint64 newPartitionTimeMsec = 0); private: friend class DoCalculationsExitGuard; static double s_minWidth; static double s_maxWidth; static double s_stepWidth; static double s_minHeight; static double s_maxHeight; static double s_stepHeight; static double s_minRadius; static double s_maxRadius; static double s_stepRadius; static int s_maxChargeUsage; static double s_minAltitude; static double s_maxAltitude; static qint64 s_maxDurationSeconds; static int s_dropAngleDown; static int s_dropAngleUp; void retranslate() override; void enableUiElements(); void enableUiElements(bool enable) override; void enableUiFireButton(); void fillParticipantUnit(); void gatherParticipantUnits(const int &partyId, QHash > &units) const; void fillParties(); bool isValidParty(qint32 partyId); void fillCharges(); void fillGearClasses(); int currentDropAngleDegree(); void setDropAngleTo(double dropAngleDegree); double currentDropAngleRadiant(); private: bool isOnlyNameModifiable() const override; bool isSmoke(); void updateActorComboBox(const Core::GeoPosition &coordGeo); struct Charges { Charges() {} explicit Charges(const ProjectDataManagement::ChargeType &type) : chargeType(type) {} ProjectDataManagement::ChargeType chargeType; QMap available; // PartyId }; QVector m_gearClassFilter; std::shared_ptr m_pdmDtc; std::shared_ptr m_ppmDtc; std::shared_ptr m_aesDtc; std::shared_ptr m_asbIfc; std::shared_ptr m_esmActorCbx; std::shared_ptr m_pdmCbx; ExplosionCluster m_explosionClusterData; QPointF m_coord; // doCalculations will update following: struct temporaryData { qint64 m_estimatedFlightDurationMsec{-1}; qint64 m_distanceFiringToTarget{-1}; Core::GeoPosition m_idealTapAbsoluteGeoOut; QString m_remainingTimeStr; QString m_annotationStringFiring4Dlg; QStringList m_annotationString4Dlg; void reset() { m_estimatedFlightDurationMsec = -1; m_distanceFiringToTarget = -1; m_remainingTimeStr.clear(); m_annotationStringFiring4Dlg.clear(); m_annotationString4Dlg.clear(); } } m_temporaryData; void resetTempAndAnnotationStr(); void addAnnotationStr(const QString &newAnno); void updateAnnotationStr(); double getElevation(const double lon, const double lat) const; QMap m_chargeTypeMap; // ChargeTypeId QPointF m_previewCircleCenter; double m_previewCircleRadius; QPolygonF m_previewPolygon; QButtonGroup *m_geometrieButtonGroup; AreaEffectSimulation::AesExplosionGeometry m_currentGeometry; // safe_enum is initialized by itself Ui::ExplosionsEdit *m_ui; bool m_initDone{false}; QTimer *m_enableFireBtnTimer{nullptr}; Core::GeoPosition m_coordGeo; LtsElevation::LTS_ELEVATION_MANAGER_TYPE m_elevationManager{nullptr}; }; }