/** ** ** @RDE_HEADER@ ** Implementation of dialog to modify xml symbols ** $Id$ ** $HeadURL$ ** $Author$ ** ** ----------------------------------------------------------------------------------------------- ** ** Hardware-Environment: Intel-PC ** Software-Environment: Windows 7, Qt 5.4. ArcGIS 10.2.5 ** ** Language ........: C++ 11 ** ** ----------------------------------------------------------------------------------------------- ** ** Author ...........: Jörg Turla, SPD G, Tel. 3132 ** ** ----------------------------------------------------------------------------------------------- ** ** Notes .........: ** ** 14.12.2017, JT : First edition for use with Qt5 ** ** ----------------------------------------------------------------------------------------------- */ #include "symbol_dialog.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace SymbologyXML { struct PartyInformation { int id; QString name; QColor color; AdvancedSymbology::Role role; }; // PartyInformation class SymbolDialog::InternalData { public: static PartyInformation m_defaultParty; const AdvancedSymbology::SymbolDictionary & m_symbolDict; QPointer m_geometryModel; uint m_symbolId; QVector m_partyVector; SituationMap::GeometryModel::Node m_currentNode; QLabel * m_laSymbol = nullptr; QLabel * m_laAffiliation = nullptr; QLabel * m_laMobility = nullptr; QLabel * m_laOffsetX = nullptr; QLabel * m_laOffsetY = nullptr; QLabel * m_laTeam = nullptr; QLabel * m_laTeamD = nullptr; QLabel * m_laScale = nullptr; QLabel * m_laStatus = nullptr; QLabel * m_laView = nullptr; LtsWidgets::LtsComboBox * m_cbAffiliation = nullptr; LtsWidgets::LtsComboBox * m_cbMobility = nullptr; QCheckBox * m_cbDir = nullptr; QLabel * m_laSymbolID = nullptr; QLineEdit * m_leOffsetX = nullptr; QLineEdit * m_leOffsetY = nullptr; LtsWidgets::LtsComboBox * m_cbTeam = nullptr; LtsWidgets::LtsComboBox * m_cbTeamD = nullptr; LtsWidgets::LtsComboBox * m_cbStatus = nullptr; QLineEdit * m_leDir = nullptr; QLineEdit * m_leScale = nullptr; QCheckBox * m_cbSymbolState = nullptr; QCheckBox * m_cbUncertainty = nullptr; QLineEdit * m_leTextW = nullptr; QLineEdit * m_leTextXY = nullptr; QLineEdit * m_leTextV = nullptr; QLineEdit * m_leTextT = nullptr; QLineEdit * m_leTextZ = nullptr; QLineEdit * m_leTextEF = nullptr; QLineEdit * m_leTextG = nullptr; QLineEdit * m_leTextH = nullptr; QLineEdit * m_leTextM = nullptr; QLineEdit * m_leTextJ = nullptr; explicit InternalData( const AdvancedSymbology::SymbolDictionary &symbolDict, SituationMap::GeometryModel * geomModel ) : m_symbolDict(symbolDict), m_geometryModel(geomModel), m_symbolId(std::numeric_limits::max()) { } // InternalData(SituationMap::Map *map) ~InternalData() = default; void buildDialog( SymbolDialog * dlg ); void setLabels(); void updatePartyComboBox( QComboBox * cb ); static void updateStateComboBox( QComboBox * cb ); static void updateAffiliationComboBox( QComboBox * cb ); static void updateMobilityComboBox( QComboBox * cb ); }; // SymbolDialog::InternalData PartyInformation SymbolDialog::InternalData::m_defaultParty = {-1,QString(),QColor(Qt::gray),AdvancedSymbology::Role::Unknown}; SymbolDialog::SymbolDialog( const AdvancedSymbology::SymbolDictionary &symbolDict, SituationMap::GeometryModel * geomModel, bool autoApply, QWidget *parent) : LtsWidgets::LtsDialog(parent,(autoApply) ? LtsWidgets::ButtonCombination::CloseOnly : LtsWidgets::ButtonCombination::OkApplyCancel, true) , m_internal( new InternalData(symbolDict,geomModel)) { if (autoApply) { setUnchangeable(); m_buttonBox->setAttribute(Qt::WA_DeleteOnClose); // to same as LtsDialog::plan_editor_compatibility m_buttonBox->getButton(LtsWidgets::DialogButton::Ok)->setVisible(false); m_buttonBox->getButton(LtsWidgets::DialogButton::Apply)->setVisible(false); m_buttonBox->getButton(LtsWidgets::DialogButton::Close)->setText(tr("Close")); } m_internal->buildDialog( this ); QObject::connect( m_internal->m_cbAffiliation, static_cast(&LtsWidgets::LtsComboBox::activated), this, [this](int idx) { SymbolTypes::t_affil affil = SymbolTypes::t_affil(m_internal->m_cbAffiliation->itemData(idx).toInt()); m_internal->m_cbSymbolState->setDisabled((affil == SymbolTypes::t_affil::PENDING) || (affil == SymbolTypes::t_affil::SUSPECT) || (affil == SymbolTypes::t_affil::ASSUMED_FRIEND)); emit changedSymbolAffiliation( affil ); emit changed(); } ); QObject::connect( m_internal->m_cbMobility, static_cast(&LtsWidgets::LtsComboBox::activated), this, [this](int idx) { SymbolTypes::t_mob mob = SymbolTypes::t_mob(m_internal->m_cbMobility->itemData(idx).toInt()); emit changedSymbolMobility( mob ); emit changed(); } ); connect( m_internal->m_cbDir, &QCheckBox::stateChanged, this, [this](int) { m_internal->m_leDir->setEnabled( m_internal->m_cbDir->isChecked() ); emit changed(); }); QObject::connect( m_internal->m_cbSymbolState, &QCheckBox::clicked, this, [this](bool checked) { emit changedSymbolState( (checked) ? SymbologyXML::SymbolTypes::t_state::STATE_ANTICIPATED : SymbologyXML::SymbolTypes::t_state::STATE_PRESENT ); emit changed(); } ); QObject::connect( m_internal->m_cbUncertainty, &QCheckBox::clicked, this, [this](bool checked) { emit changedSymbolUncertainty( (checked) ? SymbologyXML::SymbolTypes::t_uncertainty::UNCERTAINTY_UNCERTAIN : SymbologyXML::SymbolTypes::t_uncertainty::UNCERTAINTY_CERTAIN ); emit changed(); } ); QObject::connect( m_internal->m_cbStatus, static_cast(&LtsWidgets::LtsComboBox::activated), this, [this](int idx) { SituationMap::GeometryModel::t_vbg_et vbg = SituationMap::GeometryModel::t_vbg_et(m_internal->m_cbStatus->itemData(idx).toInt()); emit changedSymbolVBG(vbg); emit changed(); } ); QObject::connect( m_internal->m_cbTeam, static_cast(&LtsWidgets::LtsComboBox::activated), this, [this](int idx) { int partyId = m_internal->m_cbTeam->itemData(idx).toInt(); emit changedParty(partyId); emit changed(); } ); QObject::connect( m_internal->m_cbTeamD, static_cast(&LtsWidgets::LtsComboBox::activated), this, [this](int idx) { int partyId = m_internal->m_cbTeamD->itemData(idx).toInt(); emit changedDamageParty(partyId); emit changed(); } ); auto emitChangedOffset = [this](const QString &) { emit changedOffset( QPoint(m_internal->m_leOffsetX->text().toInt(),m_internal->m_leOffsetY->text().toInt())); emit changed(); }; connect( m_internal->m_leOffsetX, &QLineEdit::textEdited, this, emitChangedOffset ); connect( m_internal->m_leOffsetY, &QLineEdit::textEdited, this, emitChangedOffset ); connect(m_internal->m_leScale, &QLineEdit::textEdited, this, [this](const QString &scaleTxt) { emit changedScale( scaleTxt.toDouble() );}); connect(m_internal->m_cbDir, &QCheckBox::clicked, this, [this](bool checked) { emit changedDirection( checked, m_internal->m_leScale->text().toDouble() ); }); connect(m_internal->m_leDir, &QLineEdit::textEdited, this, [this](const QString &scaleTxt) { emit changedDirection( m_internal->m_cbDir->isChecked(), scaleTxt.toDouble() ); emit changed(); } ); connect( m_internal->m_leTextW , &QLineEdit::textEdited, this, [this](const QString& txt) { emit changedTextW (txt); emit changed(); } ); connect( m_internal->m_leTextXY, &QLineEdit::textEdited, this, [this](const QString& txt) { emit changedTextXY(txt); emit changed(); } ); connect( m_internal->m_leTextV , &QLineEdit::textEdited, this, [this](const QString& txt) { emit changedTextV (txt); emit changed(); } ); connect( m_internal->m_leTextT , &QLineEdit::textEdited, this, [this](const QString& txt) { emit changedTextT (txt); emit changed(); } ); connect( m_internal->m_leTextZ , &QLineEdit::textEdited, this, [this](const QString& txt) { emit changedTextZ (txt); emit changed(); } ); connect( m_internal->m_leTextEF, &QLineEdit::textEdited, this, [this](const QString& txt) { emit changedTextEF(txt); emit changed(); } ); connect( m_internal->m_leTextG , &QLineEdit::textEdited, this, [this](const QString& txt) { emit changedTextG (txt); emit changed(); } ); connect( m_internal->m_leTextH , &QLineEdit::textEdited, this, [this](const QString& txt) { emit changedTextH (txt); emit changed(); } ); connect( m_internal->m_leTextM , &QLineEdit::textEdited, this, [this](const QString& txt) { emit changedTextM (txt); emit changed(); } ); connect( m_internal->m_leTextJ , &QLineEdit::textEdited, this, [this](const QString& txt) { emit changedTextJ (txt); emit changed(); } ); connect( this, &SymbolDialog::changed, this, &SymbolDialog::updateSymbolPixmap ); } // SymbolDialog::SymbolDialog(SituationMap::Map *map) SymbolDialog::SymbolDialog( const AdvancedSymbology::SymbolDictionary &symbolDict, bool autoApply, QWidget * parent ) : SymbolDialog(symbolDict,nullptr,autoApply,parent) {;} SymbolDialog::~SymbolDialog() { delete m_internal; } SymbolTypes::t_affil SymbolDialog::symbolAffiliation() const { return SymbolTypes::t_affil(m_internal->m_cbAffiliation->currentData().toInt()); } SymbolTypes::t_mob SymbolDialog::symbolMobility() const { return SymbolTypes::t_mob(m_internal->m_cbMobility->currentData().toInt());} SymbolTypes::t_state SymbolDialog::symbolState() const { return (m_internal->m_cbSymbolState->isChecked()) ? SymbologyXML::SymbolTypes::t_state::STATE_ANTICIPATED : SymbologyXML::SymbolTypes::t_state::STATE_PRESENT; } SymbolTypes::t_uncertainty SymbolDialog::symbolUncertainty() const { return (m_internal->m_cbUncertainty->isChecked()) ? SymbologyXML::SymbolTypes::t_uncertainty::UNCERTAINTY_UNCERTAIN : SymbologyXML::SymbolTypes::t_uncertainty::UNCERTAINTY_CERTAIN; } SituationMap::GeometryModel::t_vbg_et SymbolDialog::symbolVBG() const { return SituationMap::GeometryModel::t_vbg_et(m_internal->m_cbStatus->currentData().toInt()); } int SymbolDialog::partyId() const { return m_internal->m_partyVector.value(m_internal->m_cbTeam->currentIndex(),m_internal->m_defaultParty).id; } QColor SymbolDialog::partyColor() const { return m_internal->m_partyVector.value(m_internal->m_cbTeam->currentIndex(),m_internal->m_defaultParty).color; } QString SymbolDialog::partyName() const { return m_internal->m_partyVector.value(m_internal->m_cbTeam->currentIndex(),m_internal->m_defaultParty).name; } AdvancedSymbology::Role SymbolDialog::partyRole() const { return m_internal->m_partyVector.value(m_internal->m_cbTeam->currentIndex(), m_internal->m_defaultParty).role; } int SymbolDialog::damagedPartyId() const { return m_internal->m_partyVector.value(m_internal->m_cbTeamD->currentIndex(),m_internal->m_defaultParty).id; } QColor SymbolDialog::damagedPartyColor() const { return m_internal->m_partyVector.value(m_internal->m_cbTeamD->currentIndex(),m_internal->m_defaultParty).color; } QString SymbolDialog::damagedPartyName() const { return m_internal->m_partyVector.value(m_internal->m_cbTeamD->currentIndex(),m_internal->m_defaultParty).name; } QPoint SymbolDialog::pixelOffset() const { return QPoint(m_internal->m_leOffsetX->text().toInt(),m_internal->m_leOffsetY->text().toInt()); } double SymbolDialog::scale() const { return m_internal->m_leScale->text().toDouble(); } bool SymbolDialog::directionValid() const { return m_internal->m_cbDir->isChecked(); } int SymbolDialog::directionDegree() const { return m_internal->m_leDir->text().toInt(); } QString SymbolDialog::textW() const { return m_internal->m_leTextW->text(); } QString SymbolDialog::textXY() const { return m_internal->m_leTextXY->text(); } QString SymbolDialog::textV() const { return m_internal->m_leTextW->text(); } QString SymbolDialog::textT() const { return m_internal->m_leTextW->text(); } QString SymbolDialog::textZ() const { return m_internal->m_leTextW->text(); } QString SymbolDialog::textEF() const { return m_internal->m_leTextW->text(); } QString SymbolDialog::textG() const { return m_internal->m_leTextW->text(); } QString SymbolDialog::textH() const { return m_internal->m_leTextW->text(); } QString SymbolDialog::textM() const { return m_internal->m_leTextW->text(); } QString SymbolDialog::textJ() const { return m_internal->m_leTextW->text(); } void SymbolDialog::setSymbolAffiliation(SymbolTypes::t_affil affil) { m_internal->m_cbAffiliation->setCurrentIndex(m_internal->m_cbAffiliation->findData(affil)); } void SymbolDialog::setSymbolMobility(SymbolTypes::t_mob mob) { m_internal->m_cbMobility->setCurrentIndex(m_internal->m_cbMobility->findData(mob)); } void SymbolDialog::setSymbolState(SymbolTypes::t_state state) { m_internal->m_cbSymbolState->setChecked( SymbologyXML::SymbolTypes::t_state::STATE_ANTICIPATED == state ); } void SymbolDialog::setSymbolUncertainty(SymbolTypes::t_uncertainty uncertainty) { m_internal->m_cbUncertainty->setChecked(SymbologyXML::SymbolTypes::t_uncertainty::UNCERTAINTY_UNCERTAIN == uncertainty ); } void SymbolDialog::setSymbolVBG(SituationMap::GeometryModel::t_vbg_et vbg) { m_internal->m_cbStatus->setCurrentIndex(m_internal->m_cbStatus->findData(int(vbg))); } void SymbolDialog::setPartyId(int id ) { m_internal->m_cbTeam->setCurrentIndex(m_internal->m_cbTeam->findData(id)); } void SymbolDialog::setDamagedPartyId(int id) { m_internal->m_cbTeamD->setCurrentIndex(m_internal->m_cbTeamD->findData(id)); } void SymbolDialog::setPixelOffset( const QPoint &offset ) { m_internal->m_leOffsetX->setText( QString::number(offset.x()) ); m_internal->m_leOffsetY->setText( QString::number(offset.y()) ); } void SymbolDialog::setScale(double scale) { QLocale c; m_internal->m_leScale->setText( c.toString(scale) );} void SymbolDialog::setDirectionValid( bool ok ) { m_internal->m_cbDir->setChecked(ok); } void SymbolDialog::setDirectionDegree( int angle ) { m_internal->m_leDir->setText(QString::number(angle)); } void SymbolDialog::updateSymbolPixmap() { AdvancedSymbology::SymbolResultWatcher *symbolGuard = new AdvancedSymbology::SymbolResultWatcher(this); connect(symbolGuard, &AdvancedSymbology::SymbolResultWatcher::resultReady, this, [this, symbolGuard]() { QSharedPointer symbolResult = symbolGuard->symbolResult(); if (symbolResult) { m_internal->m_laView->setPixmap( QPixmap::fromImage(symbolResult->symbolImage().image()).scaled(symbolPixmapSize(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation) ); } symbolGuard->deleteLater(); }); SymbolTypes::t_state state = m_internal->m_cbSymbolState->isChecked() ? SymbolTypes::t_state::STATE_ANTICIPATED : SymbolTypes::t_state::STATE_PRESENT; SymbolTypes::t_uncertainty uncertainty = m_internal->m_cbUncertainty->isChecked() ? SymbolTypes::t_uncertainty::UNCERTAINTY_UNCERTAIN : SymbolTypes::t_uncertainty::UNCERTAINTY_CERTAIN; SymbolTypes::t_affil affil = symbolAffiliation(); SymbolTypes::t_mob mob = symbolMobility(); if (SymbolTypes::t_affil::AFFIL_UNDEFINED == affil) { AdvancedSymbology::Role role = partyRole(); affil = SymbologyXML::Symbol::roleToAffiliation(role); } AdvancedSymbology::SymbolDataToRender symDataToRender; symDataToRender.sidc = AdvancedSymbology::SidcCodec::encodeCivilXmlSymbolId(m_internal->m_symbolId,state,uncertainty,affil,mob); symDataToRender.fillColor = partyColor(); symDataToRender.injuryColor = damagedPartyColor(); symDataToRender.injury = AdvancedSymbology::Injury::NoInjury; switch (symbolVBG()) { case SituationMap::GeometryModel::t_vbg_et::ANNAEHENDER_TREFFER : case SituationMap::GeometryModel::t_vbg_et::TREFFER_OHNE_WIRKUNG : case SituationMap::GeometryModel::t_vbg_et::EINSATZBEREIT : symDataToRender.injury = AdvancedSymbology::Injury::NoInjury; break; case SituationMap::GeometryModel::t_vbg_et::AUSFALL_WAFFENANLAGE : case SituationMap::GeometryModel::t_vbg_et::AUSFALL_WAFFENANLAGE_SICHTB : symDataToRender.injury = AdvancedSymbology::Injury::WeaponKill; break; case SituationMap::GeometryModel::t_vbg_et::BEWEGUNGSUNFAEHIG : case SituationMap::GeometryModel::t_vbg_et::BEWEGUNGSUNFAEHIG_SICHTB : symDataToRender.injury = AdvancedSymbology::Injury::MobilityKill; break; case SituationMap::GeometryModel::t_vbg_et::LEICHTER_TREFFER : case SituationMap::GeometryModel::t_vbg_et::MITTLERER_TREFFER : case SituationMap::GeometryModel::t_vbg_et::SCHWERER_TREFFER : symDataToRender.injury = AdvancedSymbology::Injury::Hit; break; case SituationMap::GeometryModel::t_vbg_et::TOTALAUSFALL : symDataToRender.injury = AdvancedSymbology::Injury::TotalKill; break; case SituationMap::GeometryModel::t_vbg_et::ZEITLICHER_AUSFALL : symDataToRender.injury = AdvancedSymbology::Injury::TotalKill; break; } // switch (symbolVBG()) symbolGuard->setSymbolResult( m_internal->m_symbolDict.fetchSymbol(symDataToRender)); } // void SymbolDialog::updateSymbolPixmap() void SymbolDialog::setNode(int symbolId, const SituationMap::GeometryModel::Node &node) { m_internal->m_symbolId = uint(symbolId); m_internal->m_laSymbolID->setText( QString::number(m_internal->m_symbolId) ); if (nullptr == m_internal->m_geometryModel) { m_internal->m_currentNode = SituationMap::GeometryModel::Node(); // set invalid node return; } SymbolTypes::t_affil affil = SymbolTypes::t_affil( m_internal->m_geometryModel->getAttribute(node,SituationMap::GeometryModel::Attribute::Affiliation).toInt() ); m_internal->m_cbAffiliation->setCurrentIndex(m_internal->m_cbAffiliation->findData(affil)); SymbolTypes::t_mob mob = SymbolTypes::t_mob( m_internal->m_geometryModel->getAttribute(node,SituationMap::GeometryModel::Attribute::Mobility).toInt() ); m_internal->m_cbMobility->setCurrentIndex(m_internal->m_cbMobility->findData(mob)); m_internal->m_leOffsetX->setText(m_internal->m_geometryModel->getAttribute(node,SituationMap::GeometryModel::Attribute::SymbolOffsetX).toString() ); m_internal->m_leOffsetY->setText(m_internal->m_geometryModel->getAttribute(node,SituationMap::GeometryModel::Attribute::SymbolOffsetY).toString() ); m_internal->m_leDir->setText( m_internal->m_geometryModel->getAttribute(node,SituationMap::GeometryModel::Attribute::SymbolDirection).toString() ); m_internal->m_leScale->setText( m_internal->m_geometryModel->getAttribute(node,SituationMap::GeometryModel::Attribute::SymbolExplicitScale).toString() ); m_internal->m_leTextEF->setText( m_internal->m_geometryModel->getAttribute(node,SituationMap::GeometryModel::Attribute::Text_EF).toString() ); m_internal->m_leTextG ->setText( m_internal->m_geometryModel->getAttribute(node,SituationMap::GeometryModel::Attribute::Text_G).toString() ); m_internal->m_leTextH ->setText( m_internal->m_geometryModel->getAttribute(node,SituationMap::GeometryModel::Attribute::Text_H).toString() ); m_internal->m_leTextJ ->setText( m_internal->m_geometryModel->getAttribute(node,SituationMap::GeometryModel::Attribute::Text_KLNPJ).toString() ); m_internal->m_leTextM ->setText( m_internal->m_geometryModel->getAttribute(node,SituationMap::GeometryModel::Attribute::Text_M).toString() ); m_internal->m_leTextT ->setText( m_internal->m_geometryModel->getAttribute(node,SituationMap::GeometryModel::Attribute::Text_T).toString() ); m_internal->m_leTextV ->setText( m_internal->m_geometryModel->getAttribute(node,SituationMap::GeometryModel::Attribute::Text_V).toString() ); m_internal->m_leTextW ->setText( m_internal->m_geometryModel->getAttribute(node,SituationMap::GeometryModel::Attribute::Text_W).toString() ); m_internal->m_leTextXY->setText( m_internal->m_geometryModel->getAttribute(node,SituationMap::GeometryModel::Attribute::Text_XY).toString() ); m_internal->m_leTextZ ->setText( m_internal->m_geometryModel->getAttribute(node,SituationMap::GeometryModel::Attribute::Text_Z).toString() ); m_internal->m_cbTeam->setCurrentIndex(m_internal->m_cbTeam->findData( m_internal->m_geometryModel->getAttribute(node,SituationMap::GeometryModel::Attribute::ForceId))); m_internal->m_cbTeamD->setCurrentIndex(m_internal->m_cbTeamD->findData( m_internal->m_geometryModel->getAttribute(node,SituationMap::GeometryModel::Attribute::DamageForceId))); SituationMap::GeometryModel::t_vbg_et vbg = SituationMap::GeometryModel::t_vbg_et(m_internal->m_geometryModel->getAttribute(node,SituationMap::GeometryModel::Attribute::att_vbg_et).toInt()); m_internal->m_cbStatus->setCurrentIndex(m_internal->m_cbStatus->findData(int(vbg))); SymbologyXML::SymbolTypes::t_state state = SymbologyXML::SymbolTypes::t_state( m_internal->m_geometryModel->getAttribute(node,SituationMap::GeometryModel::Attribute::SymbolState).toInt() ); m_internal->m_cbSymbolState->setChecked( SymbologyXML::SymbolTypes::t_state::STATE_ANTICIPATED == state ); SymbologyXML::SymbolTypes::t_uncertainty uncertainty = SymbologyXML::SymbolTypes::t_uncertainty( m_internal->m_geometryModel->getAttribute(node,SituationMap::GeometryModel::Attribute::SymbolUncertainty).toInt() ); m_internal->m_cbUncertainty->setChecked(SymbologyXML::SymbolTypes::t_uncertainty::UNCERTAINTY_UNCERTAIN == uncertainty ); /* bool m_internal->m_geometryModel->getAttribute(node,SituationMap::GeometryModel::Attribute::AbcProtection); */ m_internal->m_currentNode = node; m_internal->m_laView->setPixmap(QPixmap::fromImage(AdvancedSymbology::SymbolDictionary::temporaryImage())); updateSymbolPixmap(); } // void SymbolDialog::setNodeint symbolId, const SituationMap::GeometryModel::Node &node) bool SymbolDialog::applyToNode(const SituationMap::GeometryModel::Node &node) const { if ((nullptr == m_internal->m_geometryModel) || (!node.isValid())) return false; m_internal->m_geometryModel->setPrimitiveAttribute(node,SituationMap::GeometryModel::Attribute::SymbolOffsetX,pixelOffset().x()); m_internal->m_geometryModel->setPrimitiveAttribute(node,SituationMap::GeometryModel::Attribute::SymbolOffsetY,pixelOffset().y()); if (directionValid()) { m_internal->m_geometryModel->setPrimitiveAttribute(node,SituationMap::GeometryModel::Attribute::SymbolDirection,directionDegree()); } else { m_internal->m_geometryModel->setPrimitiveAttribute(node,SituationMap::GeometryModel::Attribute::SymbolDirection,0.0); } m_internal->m_geometryModel->setPrimitiveAttribute(node,SituationMap::GeometryModel::Attribute::SymbolExplicitScale,scale()); m_internal->m_geometryModel->setPrimitiveAttribute(node,SituationMap::GeometryModel::Attribute::Text_EF,textEF()); m_internal->m_geometryModel->setPrimitiveAttribute(node,SituationMap::GeometryModel::Attribute::Text_G,textG()); m_internal->m_geometryModel->setPrimitiveAttribute(node,SituationMap::GeometryModel::Attribute::Text_H,textH()); m_internal->m_geometryModel->setPrimitiveAttribute(node,SituationMap::GeometryModel::Attribute::Text_KLNPJ,textJ()); m_internal->m_geometryModel->setPrimitiveAttribute(node,SituationMap::GeometryModel::Attribute::Text_M,textM()); m_internal->m_geometryModel->setPrimitiveAttribute(node,SituationMap::GeometryModel::Attribute::Text_T,textT()); m_internal->m_geometryModel->setPrimitiveAttribute(node,SituationMap::GeometryModel::Attribute::Text_V,textV()); m_internal->m_geometryModel->setPrimitiveAttribute(node,SituationMap::GeometryModel::Attribute::Text_W,textW()); m_internal->m_geometryModel->setPrimitiveAttribute(node,SituationMap::GeometryModel::Attribute::Text_XY,textXY()); m_internal->m_geometryModel->setPrimitiveAttribute(node,SituationMap::GeometryModel::Attribute::Text_Z,textZ()); m_internal->m_geometryModel->setPrimitiveAttribute(node,SituationMap::GeometryModel::Attribute::ForceId,partyId()); m_internal->m_geometryModel->setPrimitiveAttribute(node,SituationMap::GeometryModel::Attribute::DamageForceId,damagedPartyId()); m_internal->m_geometryModel->setPrimitiveAttribute(node,SituationMap::GeometryModel::Attribute::att_vbg_et,int(symbolVBG())); m_internal->m_geometryModel->setPrimitiveAttribute(node,SituationMap::GeometryModel::Attribute::SymbolState,int(symbolState())); m_internal->m_geometryModel->setPrimitiveAttribute(node,SituationMap::GeometryModel::Attribute::SymbolUncertainty,int(symbolUncertainty())); m_internal->m_geometryModel->setPrimitiveAttribute(node,SituationMap::GeometryModel::Attribute::Affiliation,int(symbolAffiliation())); m_internal->m_geometryModel->setPrimitiveAttribute(node,SituationMap::GeometryModel::Attribute::Mobility,int(symbolMobility())); return true; } // void SymbolDialog::applyToNode(const SituationMap::GeometryModel::Node &node) const bool SymbolDialog::apply() { bool canCloseDialog = applyToNode( m_internal->m_currentNode ); emit applyChanges(this,canCloseDialog); return canCloseDialog; } // bool SymbolDialog::apply() void SymbolDialog::aboutToClose() { emit signalAboutToClose(); } // void SymbolDialog::aboutToClose() void SymbolDialog::updateParties( const QVector &partyIds , const QVector &partyColors , const QVector &partyNames , const QVector &partyRoles ) { m_internal->m_partyVector.clear(); m_internal->m_partyVector.reserve(partyIds.size()); for (int i = 0; i < partyIds.size(); ++i) { PartyInformation pInfo; pInfo.id = partyIds[i]; pInfo.color = partyColors[i]; pInfo.name = partyNames[i]; pInfo.role = partyRoles[i]; m_internal->m_partyVector << pInfo; } m_internal->updatePartyComboBox( m_internal->m_cbTeam ); m_internal->updatePartyComboBox( m_internal->m_cbTeamD ); } // void SymbolDialog::updateParties(const QVector &partyIds, const QVector &partyColors, const QVector &partyNames) void SymbolDialog::retranslate() { // lupdate doesn't like translate(tr("foo")) ... const QString txt(tr("Symbol Modification")); translate(txt); m_internal->setLabels(); } // void SymbolDialog::retranslate() void SymbolDialog::InternalData::buildDialog(SymbolDialog * dlg) { QVBoxLayout * layout = new QVBoxLayout(dlg); QHBoxLayout * layoutHeader = new QHBoxLayout(); QHBoxLayout * layoutSymbol = new QHBoxLayout(); layout->addStretch(2); layout->addLayout( layoutHeader ); { m_laSymbol = new QLabel(dlg); m_laSymbolID = new QLabel( QStringLiteral("???????"), dlg ); m_laTeam = new QLabel(dlg); layoutHeader->addStretch(2); layoutHeader->addWidget( m_laSymbol ); layoutHeader->addWidget( m_laSymbolID ); layoutHeader->addStretch(2); QFont labelFont = m_laSymbol->font(); labelFont.setPointSizeF(labelFont.pointSizeF()*1.5); labelFont.setBold(true); m_laSymbol->setFont(labelFont); m_laSymbolID->setFont(labelFont); } layout->addSpacing(10); QFrame * separator = new QFrame(dlg); separator->setFrameStyle(QFrame::HLine | QFrame::Plain); layout->addWidget(separator); layout->addSpacing(10); layout->addLayout( layoutSymbol ); { QVBoxLayout * layoutAttr = new QVBoxLayout(); QGridLayout * layoutLeftText = new QGridLayout(); QVBoxLayout * layoutSymbolView = new QVBoxLayout(); QGridLayout * layoutRightText = new QGridLayout(); layoutSymbol->addStretch(2); layoutSymbol->addSpacing( 20 ); layoutSymbol->addLayout(layoutAttr); { QHBoxLayout * layoutCertainty = new QHBoxLayout(); layoutAttr->addLayout(layoutCertainty); { m_cbSymbolState = new QCheckBox(dlg); m_cbUncertainty = new QCheckBox(dlg); layoutCertainty->addWidget( m_cbSymbolState ); layoutCertainty->addStretch( 2 ); layoutCertainty->addWidget( m_cbUncertainty ); } layoutSymbol->addSpacing( 20 ); QFormLayout * layoutAttrForm = new QFormLayout(); layoutAttr->addLayout(layoutAttrForm); { m_laAffiliation = new QLabel(dlg); m_cbAffiliation = new LtsWidgets::LtsComboBox(dlg); m_laMobility = new QLabel(dlg); m_cbMobility = new LtsWidgets::LtsComboBox(dlg); m_laOffsetX = new QLabel(dlg); m_leOffsetX = new QLineEdit(dlg); m_leOffsetX->setToolTip(tr("Offset X")); m_laOffsetY = new QLabel(dlg); m_leOffsetY = new QLineEdit(dlg); m_leOffsetY->setToolTip(tr("Offset Y")); m_cbDir = new QCheckBox(dlg); m_leDir = new QLineEdit(dlg); m_laScale = new QLabel(dlg); m_leScale = new QLineEdit(dlg); m_laTeam = new QLabel(dlg); m_cbTeam = new LtsWidgets::LtsComboBox(dlg); m_laStatus = new QLabel(dlg); m_cbStatus = new LtsWidgets::LtsComboBox(dlg); m_laTeamD = new QLabel(dlg); m_cbTeamD = new LtsWidgets::LtsComboBox(dlg); layoutAttrForm->addRow( m_laAffiliation, m_cbAffiliation ); layoutAttrForm->addRow( m_laMobility , m_cbMobility ); layoutAttrForm->addRow( m_laStatus , m_cbStatus ); layoutAttrForm->addRow( m_laTeam , m_cbTeam ); layoutAttrForm->addRow( m_laTeamD , m_cbTeamD ); /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * What's the object to move the symbol away from it's center or rotate it? * For the first hide widget placing .... * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ #ifdef NEEDLESS_WIDGETS layoutAttrForm->addRow( m_laOffsetX , m_leOffsetX ); layoutAttrForm->addRow( m_laOffsetY , m_leOffsetY ); layoutAttrForm->addRow( m_cbDir , m_leDir ); #else m_laOffsetX->setVisible(false); m_leOffsetX->setVisible(false); m_laOffsetY->setVisible(false); m_leOffsetY->setVisible(false); m_cbDir->setVisible(false); m_leDir->setVisible(false); #endif layoutAttrForm->addRow( m_laScale , m_leScale ); m_leOffsetX->setValidator( new QIntValidator(m_leOffsetX)); m_leOffsetY->setValidator( new QIntValidator(m_leOffsetY)); m_leDir ->setValidator( new QIntValidator( -360, 360, m_leDir)); m_cbDir->setChecked(false); m_leDir->setEnabled(false); m_leScale->setValidator( new QDoubleValidator(m_leScale)); } layoutAttrForm->setLabelAlignment(Qt::AlignRight); } layoutSymbol->addStretch(2); layoutSymbol->addLayout( layoutLeftText ); { m_leTextW = new QLineEdit(dlg); m_leTextW->setToolTip(tr("W")); m_leTextXY = new QLineEdit(dlg); m_leTextXY->setToolTip(tr("XY")); m_leTextV = new QLineEdit(dlg); m_leTextV->setToolTip(tr("V")); m_leTextT = new QLineEdit(dlg); m_leTextT->setToolTip(tr("T")); m_leTextZ = new QLineEdit(dlg); m_leTextZ->setToolTip(tr("Z")); layoutLeftText->setRowStretch(0,0); layoutLeftText->setRowStretch(1,0); layoutLeftText->setRowStretch(2,0); layoutLeftText->setRowStretch(3,0); layoutLeftText->setRowStretch(4,0); layoutLeftText->setColumnStretch(0,0); layoutLeftText->setColumnStretch(1,2); layoutLeftText->addWidget( new QLabel(QStringLiteral("W")) , 0 , 0, Qt::Alignment::enum_type::AlignRight ); layoutLeftText->addWidget( new QLabel(QStringLiteral("X|Y")), 1 , 0, Qt::Alignment::enum_type::AlignRight ); layoutLeftText->addWidget( new QLabel(QStringLiteral("V")) , 2 , 0, Qt::Alignment::enum_type::AlignRight ); layoutLeftText->addWidget( new QLabel(QStringLiteral("T")) , 3 , 0, Qt::Alignment::enum_type::AlignRight ); layoutLeftText->addWidget( new QLabel(QStringLiteral("Z")) , 4 , 0, Qt::Alignment::enum_type::AlignRight); layoutLeftText->addWidget( m_leTextW , 0 , 1, Qt::Alignment::enum_type::AlignLeft ); layoutLeftText->addWidget( m_leTextXY, 1 , 1, Qt::Alignment::enum_type::AlignLeft ); layoutLeftText->addWidget( m_leTextV , 2 , 1, Qt::Alignment::enum_type::AlignLeft ); layoutLeftText->addWidget( m_leTextT , 3 , 1, Qt::Alignment::enum_type::AlignLeft ); layoutLeftText->addWidget( m_leTextZ , 4 , 1, Qt::Alignment::enum_type::AlignLeft ); } layoutSymbol->addLayout( layoutSymbolView ); { QPixmap symbolPixmap(symbolPixmapSize()); symbolPixmap.fill(QColor(Qt::gray)); m_laView = new QLabel(dlg); m_laView->setPixmap( symbolPixmap ); layoutSymbolView->addStretch(2); layoutSymbolView->addWidget(m_laView); layoutSymbolView->addStretch(2); } layoutSymbol->addLayout( layoutRightText ); { m_leTextEF = new QLineEdit(dlg); m_leTextEF->setToolTip(tr("E|F")); m_leTextG = new QLineEdit(dlg); m_leTextG->setToolTip(tr("G")); m_leTextH = new QLineEdit(dlg); m_leTextH->setToolTip(tr("H")); m_leTextM = new QLineEdit(dlg); m_leTextM->setToolTip(tr("M")); m_leTextJ = new QLineEdit(dlg); m_leTextJ->setToolTip(tr("J|K|L|N|P")); layoutRightText->setRowStretch(0,0); layoutRightText->setRowStretch(1,0); layoutRightText->setRowStretch(2,0); layoutRightText->setRowStretch(3,0); layoutRightText->setRowStretch(4,0); layoutRightText->setColumnStretch(0,2); layoutRightText->setColumnStretch(1,0); layoutRightText->addWidget( m_leTextEF, 0 , 0, Qt::Alignment::enum_type::AlignLeft ); layoutRightText->addWidget( m_leTextG , 1 , 0, Qt::Alignment::enum_type::AlignLeft ); layoutRightText->addWidget( m_leTextH , 2 , 0, Qt::Alignment::enum_type::AlignLeft ); layoutRightText->addWidget( m_leTextM , 3 , 0, Qt::Alignment::enum_type::AlignLeft ); layoutRightText->addWidget( m_leTextJ , 4 , 0, Qt::Alignment::enum_type::AlignLeft ); layoutRightText->addWidget( new QLabel(QStringLiteral("E|F")) , 0 , 1, Qt::Alignment::enum_type::AlignLeft ); layoutRightText->addWidget( new QLabel(QStringLiteral("G")) , 1 , 1, Qt::Alignment::enum_type::AlignLeft ); layoutRightText->addWidget( new QLabel(QStringLiteral("H")) , 2 , 1, Qt::Alignment::enum_type::AlignLeft ); layoutRightText->addWidget( new QLabel(QStringLiteral("M")) , 3 , 1, Qt::Alignment::enum_type::AlignLeft ); layoutRightText->addWidget( new QLabel(QStringLiteral("J|K|L|N|P")) , 4 , 1, Qt::Alignment::enum_type::AlignLeft); } layoutSymbol->addStretch(2); } setLabels(); } // void SymbolDialog::InternalData::buildDialog(SymbolDialog * dlg) void SymbolDialog::InternalData::setLabels() { m_laSymbol -> setText(tr("Symbol")); m_laAffiliation -> setText(tr("Affiliation:")); m_laMobility -> setText(tr("Mobility:")); m_laOffsetX -> setText(tr("Offset [Pixel] X:")); m_laOffsetY -> setText(tr("Offset [Pixel] Y:")); m_laTeam -> setText(tr("Symbol Color Party:")); m_laTeamD -> setText(tr("Status Color Party:")); m_laStatus -> setText(tr("Status:")); m_laScale -> setText(tr("Scale:")); m_cbSymbolState -> setText(tr("Planned")); m_cbUncertainty -> setText(tr("Uncertainty")); m_cbDir -> setText(tr("Direction [degree]:")); updateStateComboBox( m_cbStatus ); updateAffiliationComboBox( m_cbAffiliation ); updateMobilityComboBox( m_cbMobility ); } // void SymbolDialog::InternalData::setLabels(SymbolDialog * dlg) void SymbolDialog::InternalData::updateStateComboBox(QComboBox *cb) { cb->clear(); cb->addItem( tr("Ready for Operation") , SymbolTypes::vbg_et::EINSATZBEREIT ); cb->addItem( tr("Light Hit") , SymbolTypes::vbg_et::LEICHTER_TREFFER ); cb->addItem( tr("Medium Hit") , SymbolTypes::vbg_et::MITTLERER_TREFFER ); cb->addItem( tr("Fatal Hit") , SymbolTypes::vbg_et::SCHWERER_TREFFER ); cb->addItem( tr("Immobilised") , SymbolTypes::vbg_et::BEWEGUNGSUNFAEHIG ); cb->addItem( tr("Immobilised in View") , SymbolTypes::vbg_et::BEWEGUNGSUNFAEHIG_SICHTB ); cb->addItem( tr("Malfunction Weapons") , SymbolTypes::vbg_et::AUSFALL_WAFFENANLAGE ); cb->addItem( tr("Malfunction Weapons in View"), SymbolTypes::vbg_et::AUSFALL_WAFFENANLAGE_SICHTB ); cb->addItem( tr("Complete Failure") , SymbolTypes::vbg_et::TOTALAUSFALL ); cb->addItem( tr("Temporary Failure") , SymbolTypes::vbg_et::ZEITLICHER_AUSFALL ); cb->addItem( tr("Future Hit") , SymbolTypes::vbg_et::ANNAEHENDER_TREFFER ); cb->addItem( tr("Inefficacious Hit") , SymbolTypes::vbg_et::TREFFER_OHNE_WIRKUNG ); } // void SymbolDialog::InternalData::updateStateComboBox(QComboBox *cb) void SymbolDialog::InternalData::updateAffiliationComboBox(QComboBox * cb) { cb->clear(); cb->addItem( tr("Undefined") , SymbolTypes::t_affil::AFFIL_UNDEFINED ); cb->addItem( tr("Unknown") , SymbolTypes::t_affil::UNKNOWN ); cb->addItem( tr("Friend") , SymbolTypes::t_affil::FRIEND ); cb->addItem( tr("Neutral") , SymbolTypes::t_affil::NEUTRAL ); cb->addItem( tr("Enemy") , SymbolTypes::t_affil::ENEMY ); cb->addItem( tr("Pending") , SymbolTypes::t_affil::PENDING ); cb->addItem( tr("Assumed Friend") , SymbolTypes::t_affil::ASSUMED_FRIEND ); cb->addItem( tr("Suspect") , SymbolTypes::t_affil:: SUSPECT ); } // void SymbolDialog::InternalData::updateAffiliationComboBox(QComboBox * cb) void SymbolDialog::InternalData::updateMobilityComboBox(QComboBox * cb) { cb->clear(); cb->addItem( tr("Undefined") , SymbolTypes::t_mob::MOB_UNDEFINED ); cb->addItem( tr("Airborne") , SymbolTypes::t_mob::MOB_AIRBORNE ); cb->addItem( tr("Amphibious") , SymbolTypes::t_mob::MOB_AMPHIBIOUS ); cb->addItem( tr("Barge") , SymbolTypes::t_mob::MOB_BARGE ); cb->addItem( tr("Bicycle Equipped") , SymbolTypes::t_mob::MOB_BICYCLE_EQUIPPED ); cb->addItem( tr("Over Snow") , SymbolTypes::t_mob::MOB_OVER_SNOW ); cb->addItem( tr("Pack Animals") , SymbolTypes::t_mob::MOB_PACK_ANIMALS ); cb->addItem( tr("Semi Trailer") , SymbolTypes::t_mob::MOB_SEMI_TRAILER ); cb->addItem( tr("Sled") , SymbolTypes::t_mob::MOB_SLED ); cb->addItem( tr("Tracked") , SymbolTypes::t_mob::MOB_TRACKED ); cb->addItem( tr("Trailer") , SymbolTypes::t_mob::MOB_TRAILER ); cb->addItem( tr("Train") , SymbolTypes::t_mob::MOB_TRAIN ); cb->addItem( tr("Wheel") , SymbolTypes::t_mob::MOB_WHEEL ); cb->addItem( tr("Wheeled and Tracked") , SymbolTypes::t_mob::MOB_WHEELED_AND_TRACKED ); cb->addItem( tr("Wheel all Terrain") , SymbolTypes::t_mob::MOB_WHEEL_ALL_TERRAIN ); } // void SymbolDialog::InternalData::updateAffiliationComboBox(QComboBox * cb) void SymbolDialog::InternalData::updatePartyComboBox(QComboBox *cb) { cb->clear(); for (const auto &pInfo : qAsConst(m_partyVector)) { QPixmap colorIcon(30,30); colorIcon.fill(pInfo.color); cb->addItem(colorIcon, pInfo.name, pInfo.id); } } // void SymbolDialog::InternalData::updatePartyComboBox(QComboBox * cb) } // namespace SymbologyXML