Files
qt5-legatus-legacy/Lts/Viewer/SituationMap/SymbologyXML/Gui/symbol_dialog.cpp
T
2026-08-13 18:33:10 +02:00

832 lines
43 KiB
C++
Executable File

/**
**
** @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 <geometry_model.h>
#include <Symbology/sidc_codec.h>
#include <Symbology/symbol_dictionary_types.h>
#include <LtsWidgets/lts_combo_box.h>
#include <QtCore/QPointer>
#include <QtCore/QLocale>
#include <QtGui/QIntValidator>
#include <QtWidgets/QButtonGroup>
#include <QtWidgets/QCheckBox>
#include <QtWidgets/QLabel>
#include <QtWidgets/QLineEdit>
#include <QtWidgets/QRadioButton>
#include <QtWidgets/QHBoxLayout>
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QFormLayout>
#include <QtWidgets/QGridLayout>
#include <limits>
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<SituationMap::GeometryModel> m_geometryModel;
uint m_symbolId;
QVector<PartyInformation> 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<uint>::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<void (LtsWidgets::LtsComboBox::*)(int)>(&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<void (LtsWidgets::LtsComboBox::*)(int)>(&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<void (LtsWidgets::LtsComboBox::*)(int)>(&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<void (LtsWidgets::LtsComboBox::*)(int)>(&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<void (LtsWidgets::LtsComboBox::*)(int)>(&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<AdvancedSymbology::SymbolResult> 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<int> &partyIds
, const QVector<QColor> &partyColors
, const QVector<QString> &partyNames
, const QVector<AdvancedSymbology::Role> &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<int> &partyIds, const QVector<QColor> &partyColors, const QVector<QString> &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