2234 lines
95 KiB
C++
Executable File
2234 lines
95 KiB
C++
Executable File
/**
|
|
**
|
|
** @RDE_HEADER@
|
|
** Used to manage attribute dialogs.
|
|
** $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 .........:
|
|
**
|
|
** 18.08.2016, JT : First edition for use with Qt5
|
|
**
|
|
** -----------------------------------------------------------------------------------------------
|
|
*/
|
|
#include "attribute_dialog_manager.h"
|
|
|
|
#include <Symbology/sidc_codec.h>
|
|
#include <SymbologyGui/symbol_modification_dialog.h>
|
|
#include <SymbologyXML/Gui/symbol_dialog.h>
|
|
#include "plan_editor.h"
|
|
// #include "plan_editor_internal.h"
|
|
#include "plan_editor_session.h"
|
|
#include "plan_editor_utils.h"
|
|
#include "dialog.h"
|
|
|
|
#include <Map/party_id_to_color_functor.h>
|
|
|
|
#include <MathUtils/math_const.h>
|
|
#include <MathUtils/simple_helper.h>
|
|
|
|
#include <GeometryModel/geometry_model.h>
|
|
#include <GeometryModel/geometry_model_q_dom.h>
|
|
|
|
#include <LtsWidgets/lts_base_layout_widget.h>
|
|
#include <LtsWidgets/lts_combo_box.h>
|
|
#include <LtsWidgets/lts_dialog.h>
|
|
#include <LtsWidgets/lts_dialog_button_box.h>
|
|
#include <LtsWidgets/lts_grid_layout.h>
|
|
|
|
|
|
#include <QtCore/QPointer>
|
|
|
|
#include <QtWidgets/QAbstractButton>
|
|
#include <QtWidgets/QAction>
|
|
#include <QtWidgets/QButtonGroup>
|
|
#include <QtWidgets/QCheckBox>
|
|
#include <QtWidgets/QColorDialog>
|
|
#include <QtWidgets/QComboBox>
|
|
#include <QtWidgets/QDial>
|
|
#include <QtWidgets/QFileDialog>
|
|
#include <QtWidgets/QFormLayout>
|
|
#include <QtWidgets/QGraphicsView>
|
|
#include <QtWidgets/QGroupBox>
|
|
#include <QtWidgets/QLabel>
|
|
#include <QtWidgets/QListWidget>
|
|
#include <QtWidgets/QRadioButton>
|
|
#include <QtWidgets/QSpinBox>
|
|
#include <QtWidgets/QTextEdit>
|
|
#include <QtWidgets/QToolButton>
|
|
|
|
#include "icon_names.h"
|
|
|
|
|
|
namespace PlanEditor
|
|
{
|
|
|
|
using ComboBox = LtsWidgets::LtsComboBox;
|
|
|
|
class AttributeDialogManager::InternalData
|
|
{
|
|
public:
|
|
|
|
PlanEditor *m_planEditor;
|
|
SituationMap::Map *m_map;
|
|
SituationMap::GeometryModel *m_geoModel;
|
|
const PlanEditorSession &m_session;
|
|
|
|
bool m_blockUpdateSelectedFeature;
|
|
|
|
AttributeDialogManager *m_self;
|
|
|
|
QColorDialog *m_colorDialog;
|
|
|
|
QPointer<LtsWidgets::LtsDialog> m_dlgDrawAttr;
|
|
QPointer<LtsWidgets::LtsDialog> m_dlgTextAttr;
|
|
QPointer<LtsWidgets::LtsDialog> m_dlgSymbolParticipant;
|
|
|
|
QPointer<AdvancedSymbology::Gui::SymbolModificationDialog> m_dlgSymbolModify; // for Mil/Esri-Symbols
|
|
QPointer<SymbologyXML::SymbolDialog> m_dlgSymbolXML; // for XML-Symbols
|
|
|
|
|
|
// m_dlgDrawAttr Attribute Widgets
|
|
QToolButton *m_tbColor;
|
|
QToolButton *m_tbFillColor;
|
|
QSpinBox *m_sbLineWidth;
|
|
QCheckBox *m_cbArrowBegin;
|
|
QCheckBox *m_cbArrowEnd;
|
|
ComboBox *m_cmbLinePattern;
|
|
QCheckBox *m_cbFill;
|
|
ComboBox *m_cmbFillPattern;
|
|
ComboBox *m_cmbFillStyle;
|
|
|
|
// m_dlgTextAttr Attribute Widgets
|
|
ComboBox *m_cmbFontFace;
|
|
QToolButton *m_tbStyleBold;
|
|
QToolButton *m_tbStyleItalic;
|
|
QToolButton *m_tbFontColor;
|
|
QToolButton *m_tbTextAnchor[3][3];
|
|
QDial *m_slFontRotate;
|
|
QSpinBox *m_sbFontRotate;
|
|
QTextEdit *m_teText;
|
|
QDoubleSpinBox *m_dsbFontSize;
|
|
|
|
SituationMap::GeometryModel::Attribute m_changedAttribute;
|
|
|
|
// stored attribute values
|
|
uint m_lineWidth;
|
|
QColor m_color;
|
|
QColor m_fillColor;
|
|
SituationMap::GeometryModel::LineStyle m_linePattern;
|
|
SituationMap::GeometryModel::FillPattern m_fillPattern;
|
|
SituationMap::GeometryModel::FillStyle m_fillStyle;
|
|
bool m_lineArrowBegin;
|
|
bool m_lineArrowEnd;
|
|
QString m_textLines;
|
|
SituationMap::GeometryModel::Font m_fontFace;
|
|
double m_fontSize;
|
|
QPointF m_fontOVec;
|
|
bool m_fontBold;
|
|
bool m_fontItalic;
|
|
QColor m_fontColor;
|
|
SituationMap::GeometryModel::HorizontalAlign m_fontHAnchor;
|
|
SituationMap::GeometryModel::VerticalAlign m_fontVAnchor;
|
|
|
|
// Participant Data
|
|
ComboBox *m_cbPpStatus;
|
|
ComboBox *m_cbPpTeamColor;
|
|
ComboBox *m_cbPpTeamDColor;
|
|
QLineEdit *m_lePpTextW;
|
|
QLineEdit *m_lePpTextXY;
|
|
QLineEdit *m_lePpTextV;
|
|
QLineEdit *m_lePpTextT;
|
|
QLineEdit *m_lePpTextZ;
|
|
QLineEdit *m_lePpTextEF;
|
|
QLineEdit *m_lePpTextG;
|
|
QLineEdit *m_lePpTextH;
|
|
QLineEdit *m_lePpTextM;
|
|
QLineEdit *m_lePpTextJ;
|
|
QLabel *m_laPpView;
|
|
|
|
SituationMap::SimpleValue<AdvancedSymbology::Injury> m_ppState;
|
|
SituationMap::SimpleValue<int> m_ppTeamColor;
|
|
SituationMap::SimpleValue<int> m_ppTeamDColor;
|
|
|
|
QMap<SituationMap::Participant::TextModifier, SituationMap::SimpleValue<QString>> m_ppTextModifier;
|
|
|
|
Logger &m_logger;
|
|
|
|
InternalData(PlanEditor *planEditor, SituationMap::Map *map, SituationMap::GeometryModel *geoModel, const PlanEditorSession &session, AttributeDialogManager *self)
|
|
: m_planEditor(planEditor)
|
|
, m_map(map)
|
|
, m_geoModel(geoModel)
|
|
, m_session(session)
|
|
, m_blockUpdateSelectedFeature(false)
|
|
, m_self(self)
|
|
, m_colorDialog(new QColorDialog())
|
|
|
|
, m_dlgDrawAttr(nullptr)
|
|
, m_dlgTextAttr(nullptr)
|
|
, m_dlgSymbolParticipant(nullptr)
|
|
, m_dlgSymbolModify(nullptr)
|
|
|
|
|
|
, m_tbColor(nullptr)
|
|
, m_tbFillColor(nullptr)
|
|
, m_sbLineWidth(nullptr)
|
|
, m_cbArrowBegin(nullptr)
|
|
, m_cbArrowEnd(nullptr)
|
|
, m_cmbLinePattern(nullptr)
|
|
, m_cbFill(nullptr)
|
|
, m_cmbFillPattern(nullptr)
|
|
, m_cmbFillStyle(nullptr)
|
|
|
|
, m_cmbFontFace(nullptr)
|
|
, m_tbStyleBold(nullptr)
|
|
, m_tbStyleItalic(nullptr)
|
|
, m_tbFontColor(nullptr)
|
|
, m_slFontRotate(nullptr)
|
|
, m_sbFontRotate(nullptr)
|
|
, m_teText(nullptr)
|
|
, m_dsbFontSize(nullptr)
|
|
|
|
, m_changedAttribute(SituationMap::GeometryModel::Attribute::None)
|
|
|
|
, m_lineWidth(1)
|
|
, m_color(m_session.topLevelWidget()->palette().color(QPalette::ColorRole::Highlight))
|
|
, m_fillColor(m_session.topLevelWidget()->palette().color(QPalette::ColorRole::Background))
|
|
, m_linePattern(SituationMap::GeometryModel::LineStyle::LineSolid)
|
|
, m_fillPattern(SituationMap::GeometryModel::FillPattern::None)
|
|
, m_fillStyle(SituationMap::GeometryModel::FillStyle::Pieslice)
|
|
, m_lineArrowBegin(false)
|
|
, m_lineArrowEnd(false)
|
|
, m_textLines()
|
|
, m_fontFace(SituationMap::GeometryModel::Font::Serif)
|
|
, m_fontSize(12.0)
|
|
, m_fontOVec(1, 0)
|
|
, m_fontBold(false)
|
|
, m_fontItalic(false)
|
|
, m_fontColor(QLatin1String("black"))
|
|
, m_fontHAnchor(SituationMap::GeometryModel::HorizontalAlign::Left)
|
|
, m_fontVAnchor(SituationMap::GeometryModel::VerticalAlign::VCenter)
|
|
, m_cbPpStatus(nullptr)
|
|
, m_cbPpTeamColor(nullptr)
|
|
, m_cbPpTeamDColor(nullptr)
|
|
, m_lePpTextW(nullptr)
|
|
, m_lePpTextXY(nullptr)
|
|
, m_lePpTextV(nullptr)
|
|
, m_lePpTextT(nullptr)
|
|
, m_lePpTextZ(nullptr)
|
|
, m_lePpTextEF(nullptr)
|
|
, m_lePpTextG(nullptr)
|
|
, m_lePpTextH(nullptr)
|
|
, m_lePpTextM(nullptr)
|
|
, m_lePpTextJ(nullptr)
|
|
, m_laPpView(nullptr)
|
|
|
|
, m_ppState(AdvancedSymbology::Injury::NoInjury)
|
|
, m_ppTeamColor(-1)
|
|
, m_ppTeamDColor(-1)
|
|
, m_ppTextModifier()
|
|
|
|
, m_logger(getLogger("AttributeDialogManager"))
|
|
{
|
|
|
|
m_colorDialog -> setOptions(QColorDialog::ColorDialogOptions({QColorDialog::ShowAlphaChannel, QColorDialog::DontUseNativeDialog}));
|
|
|
|
for (int r = 0; r < 3; ++r)
|
|
{
|
|
for (int c = 0; c < 3; ++c) m_tbTextAnchor[r][c] = nullptr;
|
|
}
|
|
} // InternalData( PlanEditor * planEditor, SituationMap::Map * map, LtsWidgets::LtsBaseLayoutWidget * ltsbaseWidget, AttributeDialogManager * self )
|
|
|
|
~InternalData()
|
|
{
|
|
if (m_colorDialog) { m_colorDialog->deleteLater(); m_colorDialog = nullptr;}
|
|
|
|
if (m_dlgDrawAttr) m_dlgDrawAttr->disconnect();
|
|
if (m_dlgTextAttr) m_dlgTextAttr->disconnect();
|
|
if (m_dlgSymbolParticipant) m_dlgSymbolParticipant->disconnect();
|
|
if (m_dlgSymbolModify) m_dlgSymbolModify->disconnect();
|
|
|
|
delete m_dlgDrawAttr; // could not happen from event loop directly, it's ok here to use delete
|
|
delete m_dlgTextAttr; // instead of deleteLater to delete the dialogs immediatly
|
|
delete m_dlgSymbolParticipant;
|
|
delete m_dlgSymbolModify;
|
|
|
|
} // ~InternalData()
|
|
|
|
|
|
LtsWidgets::LtsDialog *buildDrawAttrBox(QWidget *parent);
|
|
LtsWidgets::LtsDialog *buildTextAttrBox(QWidget *parent);
|
|
LtsWidgets::LtsDialog *buildParticipantBox(QWidget *parent);
|
|
|
|
AdvancedSymbology::Gui::SymbolModificationDialog *buildSymbolModifyDialog(QWidget *parent, bool isParticipant = true);
|
|
SymbologyXML::SymbolDialog *buildSymbolXMLDialog(QWidget *parent);
|
|
|
|
void symbolXmlUpdateParties();
|
|
|
|
|
|
void updateDefaultColors()
|
|
{
|
|
const SituationMap::PartyIdToColorFunctor &partyToColorFunctor = m_map->partyIdToColorFunctor();
|
|
const QVector<QColor> &partyColors = partyToColorFunctor.partyColors();
|
|
int customColorCount = QColorDialog::customCount();
|
|
|
|
if (partyColors.size() > customColorCount)
|
|
{
|
|
WARNING_LOG(m_logger) << LOGFUNCTION << " To much party colors ("
|
|
<< partyColors.size()
|
|
<< ") color dialog custom colors are limited to "
|
|
<< customColorCount
|
|
<< " colors.";
|
|
}
|
|
else customColorCount = partyColors.size();
|
|
|
|
for (int colorIndex = 0; colorIndex < customColorCount; ++colorIndex)
|
|
{
|
|
const QColor &color = partyColors[colorIndex];
|
|
QColorDialog::setCustomColor(colorIndex, color);
|
|
}
|
|
} // void updateDefaultColors()
|
|
|
|
|
|
void updateSymbolXmlAttribute(SituationMap::GeometryModel::Attribute attribute, const QVariant &value)
|
|
{
|
|
QString undoToken = tr("Modify Symbol XML Attribute %1", TR_UNDO_TOKEN).arg(m_geoModel->attributeToString(attribute));
|
|
|
|
m_planEditor->onSymbolXmlAttrModified( undoToken, attribute, value);
|
|
|
|
} // void updateSymbolXmlAttribute(SituationMap::GeometryModel::Attribute attribute, const QVariant &value)
|
|
|
|
|
|
static inline void safeSetText(QLineEdit *lineEdit, const QString &text)
|
|
{
|
|
if (!lineEdit)
|
|
return;
|
|
lineEdit->setText(text);
|
|
}
|
|
|
|
void updateTextModifierWidget(SituationMap::Participant::TextModifier mod)
|
|
{
|
|
const QString &text = m_ppTextModifier[mod].value();
|
|
switch (mod)
|
|
{
|
|
case SituationMap::Participant::TextModifier::EF_ReinforcedReduced : safeSetText(m_lePpTextEF, text); break;
|
|
case SituationMap::Participant::TextModifier::M_HigherFormation : safeSetText(m_lePpTextM, text); break;
|
|
case SituationMap::Participant::TextModifier::T_UniqueDesignation : safeSetText(m_lePpTextT, text); break;
|
|
case SituationMap::Participant::TextModifier::W_DateTimeGroup : safeSetText(m_lePpTextW, text); break;
|
|
case SituationMap::Participant::TextModifier::XY_AltitudeLocation : safeSetText(m_lePpTextXY, text); break;
|
|
case SituationMap::Participant::TextModifier::V_Type : safeSetText(m_lePpTextV, text); break;
|
|
case SituationMap::Participant::TextModifier::Z_Speed : safeSetText(m_lePpTextZ, text); break;
|
|
case SituationMap::Participant::TextModifier::G_StaffComments : safeSetText(m_lePpTextG, text); break;
|
|
case SituationMap::Participant::TextModifier::H_AdditionalInformation : safeSetText(m_lePpTextH, text); break;
|
|
case SituationMap::Participant::TextModifier::JKLNP : safeSetText(m_lePpTextJ, text); break;
|
|
default: break;
|
|
}
|
|
} // void updateTextModifierWidget(SituationMap::Participant::TextModifier mod)
|
|
|
|
void setParticipantState(AdvancedSymbology::Injury injury)
|
|
{
|
|
m_ppState = injury;
|
|
if (m_cbPpStatus)
|
|
m_cbPpStatus->setCurrentIndex(m_cbPpStatus->findData(static_cast<int>(injury)));
|
|
m_ppState.reset();
|
|
} // void setParticipantState(AdvancedSymbology::Injury injury )
|
|
|
|
|
|
void setParticipantPartyId(int partyId)
|
|
{
|
|
const QVector<int> &partyIds = m_map->partyIdToColorFunctor().partyIds();
|
|
|
|
if (!partyIds.contains(partyId)) partyId = -1;
|
|
|
|
m_ppTeamColor = partyId;
|
|
if (m_cbPpTeamColor)
|
|
m_cbPpTeamColor->setCurrentIndex(m_cbPpTeamColor->findData(partyId));
|
|
m_ppTeamColor.reset();
|
|
} // void setParticipantPartyId( int partyId )
|
|
|
|
|
|
void setParticipantDamageId(int damagedPartyId)
|
|
{
|
|
const QVector<int> &partyIds = m_map->partyIdToColorFunctor().partyIds();
|
|
|
|
if (!partyIds.contains(damagedPartyId)) damagedPartyId = -1;
|
|
|
|
m_ppTeamDColor = damagedPartyId;
|
|
if (m_cbPpTeamDColor)
|
|
m_cbPpTeamDColor->setCurrentIndex(m_cbPpTeamColor->findData(damagedPartyId));
|
|
m_ppTeamDColor.reset();
|
|
} // void setParticipantDamageId( int partyId )
|
|
|
|
|
|
void setParticipantTextModifier(SituationMap::Participant::TextModifier mod, const QString &text)
|
|
{
|
|
m_ppTextModifier[mod] = text;
|
|
m_ppTextModifier[mod].reset();
|
|
updateTextModifierWidget(mod);
|
|
} // void setParticipantTextModifier(SituationMap::Participant::TextModifier mod, const QString &text)
|
|
|
|
|
|
void setParticipantTextModifier(const QMap<SituationMap::Participant::TextModifier, QString> &textMod)
|
|
{
|
|
for (auto it = textMod.constBegin(); it != textMod.constEnd(); ++it)
|
|
{
|
|
const auto &key = it.key();
|
|
m_ppTextModifier[key] = it.value();
|
|
m_ppTextModifier[key].reset();
|
|
updateTextModifierWidget(key);
|
|
}
|
|
} // void SymbolModificationWidget::setParticipantTextModifier(const QMap<SituationMap::Participant::TextModifier, SituationMap::SimpleValue<QString>> &textMap)
|
|
|
|
}; // AttributeDialogManager::InternalData
|
|
|
|
|
|
const QString &AttributeDialogManager::textLines() const { return m_internal->m_textLines; }
|
|
|
|
|
|
AttributeDialogManager::AttributeDialogManager(PlanEditor *planEditor
|
|
, SituationMap::Map *map
|
|
, SituationMap::GeometryModel *geoModel
|
|
, const PlanEditorSession &session)
|
|
: QObject(planEditor), m_internal(new AttributeDialogManager::InternalData(planEditor, map, geoModel, session, this))
|
|
{
|
|
TRACE_LOG(m_internal->m_logger) << LOGFUNCTION << " START";
|
|
TRACE_LOG(m_internal->m_logger) << LOGFUNCTION << " END";
|
|
}
|
|
|
|
|
|
AttributeDialogManager::~AttributeDialogManager()
|
|
{
|
|
TRACE_LOG(m_internal->m_logger) << LOGFUNCTION << " START";
|
|
delete m_internal; m_internal = nullptr;
|
|
} // LookupSymbolManager::~LookupSymbolManager()
|
|
|
|
|
|
void AttributeDialogManager::onOpenDialog(const SituationMap::GeometryModel::Node &node)
|
|
{
|
|
DEBUG_LOG(m_internal->m_logger) << LOGFUNCTION << " START, node.connectedId() = " << node.connectedId();
|
|
|
|
if (!node.isValid())
|
|
{
|
|
if (nullptr == m_internal->m_dlgSymbolXML)
|
|
{
|
|
m_internal->m_dlgSymbolXML = m_internal->buildSymbolXMLDialog(m_internal->m_session.topLevelWidget());
|
|
m_internal->symbolXmlUpdateParties();
|
|
}
|
|
// makes no sense to build SymbolModifyDialog in case of invalid node
|
|
if (nullptr == m_internal -> m_dlgSymbolParticipant) m_internal->m_dlgSymbolParticipant = m_internal->buildParticipantBox(m_internal->m_session.topLevelWidget());
|
|
if (nullptr == m_internal -> m_dlgTextAttr) m_internal -> m_dlgTextAttr = m_internal->buildTextAttrBox(m_internal->m_session.topLevelWidget());
|
|
if (nullptr == m_internal -> m_dlgDrawAttr) m_internal -> m_dlgDrawAttr = m_internal->buildDrawAttrBox(m_internal->m_session.topLevelWidget());
|
|
|
|
return;
|
|
}
|
|
|
|
SituationMap::GeometryModel::PrimitiveType primitiveType = m_internal->m_geoModel->getType(node);
|
|
|
|
DEBUG_LOG(m_internal->m_logger) << LOGFUNCTION << " primitiveType = " << static_cast<int>(primitiveType)
|
|
<< " , m_dlgSymbolModify=" << m_internal->m_dlgSymbolModify
|
|
<< " , m_dlgSymbolXML=" << m_internal->m_dlgSymbolXML;
|
|
|
|
switch (primitiveType)
|
|
{
|
|
case SituationMap::GeometryModel::PrimitiveType::Symbol:
|
|
{
|
|
const AdvancedSymbology::SymbolDictionary &symbolDict = m_internal->m_map->symbolDictionary();
|
|
if ((nullptr == m_internal -> m_dlgSymbolXML) && (symbolDict.isLoaded()))
|
|
{
|
|
int symbolId = m_internal->m_geoModel->getAttribute(node, SituationMap::GeometryModel::Attribute::SymbolId).toInt();
|
|
m_internal -> m_dlgSymbolXML = m_internal->buildSymbolXMLDialog(m_internal->m_session.topLevelWidget());
|
|
m_internal -> symbolXmlUpdateParties();
|
|
m_internal -> m_dlgSymbolXML->setNode( symbolId, node );
|
|
m_internal -> m_dlgSymbolXML->updateSymbolPixmap();
|
|
}
|
|
else
|
|
{
|
|
if (nullptr != m_internal->m_dlgSymbolXML)
|
|
{
|
|
int symbolId = m_internal->m_geoModel->getAttribute(node, SituationMap::GeometryModel::Attribute::SymbolId).toInt();
|
|
m_internal -> symbolXmlUpdateParties();
|
|
m_internal -> m_dlgSymbolXML->setNode( symbolId, node );
|
|
m_internal -> m_dlgSymbolXML->updateSymbolPixmap();
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case SituationMap::GeometryModel::PrimitiveType::ParticipantSymbol:
|
|
case SituationMap::GeometryModel::PrimitiveType::DictionarySymbol:
|
|
{
|
|
const QString &sidc = m_internal->m_geoModel->getAttribute(node, SituationMap::GeometryModel::Attribute::SIDC).toString();
|
|
|
|
// check at least some of the condition SymbolModificationDialog::setSidc will return false
|
|
// to avoid most of the useless construction/destruction:
|
|
if (sidc.isEmpty() ||
|
|
AdvancedSymbology::SidcCodec::isCivil(sidc) ||
|
|
(AdvancedSymbology::SidcCodec::decodeSymbologyType(sidc) == AdvancedSymbology::SymbologyType::None)
|
|
)
|
|
return; // Do not create SymbolModifyDialog
|
|
|
|
const AdvancedSymbology::SymbolDictionary &symbolDict = m_internal->m_map->symbolDictionary();
|
|
|
|
if ((nullptr == m_internal -> m_dlgSymbolModify) && (symbolDict.isLoaded()))
|
|
m_internal -> m_dlgSymbolModify = m_internal->buildSymbolModifyDialog(m_internal->m_session.topLevelWidget(), (SituationMap::GeometryModel::PrimitiveType::ParticipantSymbol == primitiveType));
|
|
|
|
// Block signals of SymbolModificationDialog:
|
|
// Otherwise a huge number of signal are emitted and can effect wrong item at the GeometryModel.
|
|
// (Click 1st DictionaryItem on TreeView, click 3rd, click 1st again ->
|
|
// symbolFieldAttr 'jump' from 1st to 3rd....
|
|
// N. Thoden, 08/2019:
|
|
|
|
QSignalBlocker blocker (m_internal->m_dlgSymbolModify->getWidget());
|
|
|
|
if (m_internal->m_dlgSymbolModify->getWidget()->setSidc(sidc))
|
|
{
|
|
QMap<QString, QVariant> attrMap;
|
|
const QString &symbolFieldAttr = m_internal->m_geoModel->getAttribute(node, SituationMap::GeometryModel::Attribute::SIDC_Attributes).toString();
|
|
m_internal -> m_geoModel->parseSymbolAttributeString(symbolFieldAttr, attrMap);
|
|
m_internal->m_dlgSymbolModify->getWidget()->setFieldAttributes(attrMap);
|
|
|
|
m_internal->m_dlgSymbolModify->getWidget()->updatePreviewTab();
|
|
|
|
|
|
if (SituationMap::GeometryModel::PrimitiveType::ParticipantSymbol == primitiveType)
|
|
{
|
|
m_internal->m_ppState = static_cast<AdvancedSymbology::Injury>(m_internal->m_geoModel->getAttribute(node, SituationMap::GeometryModel::Attribute::Injury).toInt());
|
|
m_internal->m_ppTeamColor = m_internal->m_geoModel->getAttribute(node, SituationMap::GeometryModel::Attribute::ForceId).toInt();
|
|
m_internal->m_ppTeamDColor = m_internal->m_geoModel->getAttribute(node, SituationMap::GeometryModel::Attribute::DamageForceId).toInt();
|
|
|
|
if (nullptr == m_internal->m_dlgSymbolParticipant)
|
|
m_internal->m_dlgSymbolParticipant = m_internal->buildParticipantBox(m_internal->m_session.topLevelWidget());
|
|
|
|
onChangedParticipant();
|
|
|
|
if (m_internal->m_dlgSymbolModify)
|
|
{
|
|
connect(m_internal->m_dlgSymbolModify.data(), &AdvancedSymbology::Gui::SymbolModificationDialog::changed, this, &AttributeDialogManager::onChangedParticipant);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_internal -> m_dlgSymbolModify->deleteLater();
|
|
m_internal -> m_dlgSymbolModify = nullptr;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case SituationMap::GeometryModel::PrimitiveType::Text:
|
|
{
|
|
if (nullptr == m_internal -> m_dlgTextAttr)
|
|
{
|
|
if (nullptr == m_internal->m_dlgDrawAttr)
|
|
{
|
|
m_internal->m_dlgDrawAttr = m_internal->buildDrawAttrBox(m_internal->m_session.topLevelWidget());
|
|
}
|
|
m_internal -> m_dlgTextAttr = m_internal->buildTextAttrBox(m_internal->m_session.topLevelWidget());
|
|
|
|
}
|
|
m_internal->m_session.focusTab(m_internal -> m_dlgTextAttr, LtsWidgets::LayoutArea::eDialogTab, QStringLiteral("PlanEditor"), QStringLiteral("TextAttributes"));
|
|
}
|
|
break;
|
|
|
|
default:
|
|
{
|
|
if (nullptr == m_internal -> m_dlgDrawAttr)
|
|
m_internal -> m_dlgDrawAttr = m_internal->buildDrawAttrBox(m_internal->m_session.topLevelWidget());
|
|
}
|
|
break;
|
|
} // switch (primitiveType)
|
|
|
|
} // AttributeDialogManager::onOpenDialog()
|
|
|
|
|
|
void AttributeDialogManager::onCloseDialog()
|
|
{
|
|
if (m_internal -> m_dlgDrawAttr) { m_internal -> m_dlgDrawAttr -> closeRequest(); }
|
|
if (m_internal -> m_dlgTextAttr) { m_internal -> m_dlgTextAttr -> closeRequest(); }
|
|
if (m_internal -> m_dlgSymbolParticipant) { m_internal -> m_dlgSymbolParticipant -> closeRequest(); }
|
|
if (m_internal -> m_dlgSymbolModify) { m_internal -> m_dlgSymbolModify -> closeRequest(); }
|
|
if (m_internal -> m_dlgSymbolXML) { m_internal -> m_dlgSymbolXML -> closeRequest(); }
|
|
|
|
onResetWidgets();
|
|
onResetDialog();
|
|
}
|
|
|
|
void AttributeDialogManager::onResetDialog()
|
|
{
|
|
m_internal -> m_dlgDrawAttr = nullptr;
|
|
m_internal -> m_dlgTextAttr = nullptr;
|
|
m_internal -> m_dlgSymbolParticipant = nullptr;
|
|
m_internal -> m_dlgSymbolModify = nullptr;
|
|
m_internal -> m_dlgSymbolXML = nullptr;
|
|
} // AttributeDialogManager::onResetDialog()
|
|
|
|
|
|
void AttributeDialogManager::onResetWidgets()
|
|
{
|
|
if (nullptr == m_internal->m_dlgDrawAttr)
|
|
{
|
|
m_internal->m_tbColor = nullptr;
|
|
m_internal->m_tbFillColor = nullptr;
|
|
m_internal->m_sbLineWidth = nullptr;
|
|
m_internal->m_cbArrowBegin = nullptr;
|
|
m_internal->m_cbArrowEnd = nullptr;
|
|
m_internal->m_cmbLinePattern = nullptr;
|
|
m_internal->m_cbFill = nullptr;
|
|
m_internal->m_cmbFillPattern = nullptr;
|
|
}
|
|
|
|
if (nullptr == m_internal->m_dlgTextAttr)
|
|
{
|
|
m_internal->m_cmbFontFace = nullptr;
|
|
m_internal->m_tbStyleBold = nullptr;
|
|
m_internal->m_tbStyleItalic = nullptr;
|
|
m_internal->m_tbFontColor = nullptr;
|
|
m_internal->m_slFontRotate = nullptr;
|
|
m_internal->m_sbFontRotate = nullptr;
|
|
m_internal->m_teText = nullptr;
|
|
m_internal->m_dsbFontSize = nullptr;
|
|
|
|
for (int r = 0; r < 3; ++r)
|
|
{
|
|
for (int c = 0; c < 3; ++c) m_internal->m_tbTextAnchor[r][c] = nullptr;
|
|
}
|
|
}
|
|
if (nullptr == m_internal->m_dlgSymbolParticipant)
|
|
{
|
|
m_internal->m_cbPpStatus = nullptr;
|
|
m_internal->m_cbPpTeamColor = nullptr;
|
|
m_internal->m_cbPpTeamDColor = nullptr;
|
|
m_internal->m_lePpTextW = nullptr;
|
|
m_internal->m_lePpTextXY = nullptr;
|
|
m_internal->m_lePpTextV = nullptr;
|
|
m_internal->m_lePpTextT = nullptr;
|
|
m_internal->m_lePpTextZ = nullptr;
|
|
m_internal->m_lePpTextEF = nullptr;
|
|
m_internal->m_lePpTextG = nullptr;
|
|
m_internal->m_lePpTextH = nullptr;
|
|
m_internal->m_lePpTextM = nullptr;
|
|
m_internal->m_lePpTextJ = nullptr;
|
|
m_internal->m_laPpView = nullptr;
|
|
}
|
|
} // AttributeDialogManager::onResetDialog()
|
|
|
|
|
|
AdvancedSymbology::Gui::SymbolModificationDialog *AttributeDialogManager::InternalData::buildSymbolModifyDialog(QWidget *parent, bool isParticipant)
|
|
{
|
|
TRACE_LOG(m_logger) << LOGFUNCTION << " START "
|
|
<< ", isParticipant=" << isParticipant
|
|
<< ", this=" << this;
|
|
|
|
AdvancedSymbology::Gui::SymbolModificationDialog *dlg = new AdvancedSymbology::Gui::SymbolModificationDialog(m_map, isParticipant, parent);
|
|
if(!dlg)
|
|
return nullptr;
|
|
|
|
dlg->removeOkAndApplyButtons();
|
|
dlg->setUnchangeable();
|
|
dlg->show();
|
|
|
|
m_session.addWidget(dlg, m_planEditor->title(), tr("Symbol Modification"), LtsWidgets::LayoutArea::eDialogTab);
|
|
|
|
connect(dlg, &AdvancedSymbology::Gui::SymbolModificationDialog::changed, m_self, &AttributeDialogManager::onSymbolChanged);
|
|
|
|
QObject::connect(dlg, &AdvancedSymbology::Gui::SymbolModificationDialog::signalAboutToClose, m_self, [this]()
|
|
{
|
|
m_dlgSymbolModify.clear();
|
|
m_self->onCloseDialog();
|
|
});
|
|
|
|
return dlg;
|
|
} // SymbolModificationDialog * AttributeDialogManager::InternalData::buildSymbolModifyDialog( QWidget * parent, bool isParticipant )
|
|
|
|
|
|
|
|
static void colorizeButton(QAbstractButton *button, const QColor color)
|
|
{
|
|
if (button)
|
|
{
|
|
const QString &buttonName = button->objectName();
|
|
button -> setStyleSheet(QLatin1String("QToolButton#") + buttonName + QLatin1String(" { background-color: ") + color.name() + QLatin1String(" }"));
|
|
}
|
|
} // colorizeButton( QAbstractButton * button )
|
|
|
|
|
|
SymbologyXML::SymbolDialog *AttributeDialogManager::InternalData::buildSymbolXMLDialog(QWidget *parent)
|
|
{
|
|
TRACE_LOG(m_logger) << LOGFUNCTION << " START " << ", this=" << this;
|
|
|
|
SymbologyXML::SymbolDialog *dlg = new SymbologyXML::SymbolDialog(m_map->symbolDictionary(),m_geoModel,true,parent);
|
|
if(dlg)
|
|
{
|
|
dlg->show();
|
|
|
|
m_session.addOrReplaceWidget(dlg, m_planEditor->title(), tr("Symbol XML"), LtsWidgets::LayoutArea::eDialogTab);
|
|
|
|
QObject::connect(dlg, &SymbologyXML::SymbolDialog::signalAboutToClose, m_self, [this]()
|
|
{
|
|
m_dlgSymbolXML.clear();
|
|
m_self->onCloseDialog();
|
|
});
|
|
|
|
QObject::connect( dlg, &SymbologyXML::SymbolDialog::changedSymbolAffiliation, m_self, [this](SymbologyXML::SymbolTypes::t_affil v) { updateSymbolXmlAttribute(SituationMap::GeometryModel::Attribute::Affiliation ,int(v)); });
|
|
QObject::connect( dlg, &SymbologyXML::SymbolDialog::changedSymbolMobility , m_self, [this](SymbologyXML::SymbolTypes::t_mob v) { updateSymbolXmlAttribute(SituationMap::GeometryModel::Attribute::Mobility ,int(v)); });
|
|
QObject::connect( dlg, &SymbologyXML::SymbolDialog::changedSymbolState , m_self, [this](SymbologyXML::SymbolTypes::t_state v) { updateSymbolXmlAttribute(SituationMap::GeometryModel::Attribute::SymbolState ,int(v)); });
|
|
QObject::connect( dlg, &SymbologyXML::SymbolDialog::changedSymbolUncertainty, m_self, [this](SymbologyXML::SymbolTypes::t_uncertainty v) { updateSymbolXmlAttribute(SituationMap::GeometryModel::Attribute::SymbolUncertainty ,int(v)); });
|
|
QObject::connect( dlg, &SymbologyXML::SymbolDialog::changedSymbolVBG , m_self, [this](SituationMap::GeometryModel::t_vbg_et v) { updateSymbolXmlAttribute(SituationMap::GeometryModel::Attribute::att_vbg_et ,int(v)); });
|
|
QObject::connect( dlg, &SymbologyXML::SymbolDialog::changedParty , m_self, [this](int id) { updateSymbolXmlAttribute(SituationMap::GeometryModel::Attribute::ForceId ,id ); });
|
|
QObject::connect( dlg, &SymbologyXML::SymbolDialog::changedDamageParty , m_self, [this](int id) { updateSymbolXmlAttribute(SituationMap::GeometryModel::Attribute::DamageForceId ,id ); });
|
|
QObject::connect( dlg, &SymbologyXML::SymbolDialog::changedScale , m_self, [this](double s) { updateSymbolXmlAttribute(SituationMap::GeometryModel::Attribute::SymbolExplicitScale,s ); });
|
|
|
|
QObject::connect( dlg, &SymbologyXML::SymbolDialog::changedTextW , m_self, [this](const QString & txt) { updateSymbolXmlAttribute(SituationMap::GeometryModel::Attribute::Text_W ,txt); });
|
|
QObject::connect( dlg, &SymbologyXML::SymbolDialog::changedTextXY, m_self, [this](const QString & txt) { updateSymbolXmlAttribute(SituationMap::GeometryModel::Attribute::Text_XY ,txt); });
|
|
QObject::connect( dlg, &SymbologyXML::SymbolDialog::changedTextV , m_self, [this](const QString & txt) { updateSymbolXmlAttribute(SituationMap::GeometryModel::Attribute::Text_V ,txt); });
|
|
QObject::connect( dlg, &SymbologyXML::SymbolDialog::changedTextT , m_self, [this](const QString & txt) { updateSymbolXmlAttribute(SituationMap::GeometryModel::Attribute::Text_T ,txt); });
|
|
QObject::connect( dlg, &SymbologyXML::SymbolDialog::changedTextZ , m_self, [this](const QString & txt) { updateSymbolXmlAttribute(SituationMap::GeometryModel::Attribute::Text_Z ,txt); });
|
|
QObject::connect( dlg, &SymbologyXML::SymbolDialog::changedTextEF, m_self, [this](const QString & txt) { updateSymbolXmlAttribute(SituationMap::GeometryModel::Attribute::Text_EF ,txt); });
|
|
QObject::connect( dlg, &SymbologyXML::SymbolDialog::changedTextG , m_self, [this](const QString & txt) { updateSymbolXmlAttribute(SituationMap::GeometryModel::Attribute::Text_G ,txt); });
|
|
QObject::connect( dlg, &SymbologyXML::SymbolDialog::changedTextH , m_self, [this](const QString & txt) { updateSymbolXmlAttribute(SituationMap::GeometryModel::Attribute::Text_H ,txt); });
|
|
QObject::connect( dlg, &SymbologyXML::SymbolDialog::changedTextM , m_self, [this](const QString & txt) { updateSymbolXmlAttribute(SituationMap::GeometryModel::Attribute::Text_M ,txt); });
|
|
QObject::connect( dlg, &SymbologyXML::SymbolDialog::changedTextJ , m_self, [this](const QString & txt) { updateSymbolXmlAttribute(SituationMap::GeometryModel::Attribute::Text_KLNPJ,txt); });
|
|
|
|
QObject::connect( dlg, &SymbologyXML::SymbolDialog::changedOffset, m_self, [this]( const QPoint & p)
|
|
{
|
|
updateSymbolXmlAttribute( SituationMap::GeometryModel::Attribute::SymbolOffsetX, p.x() );
|
|
updateSymbolXmlAttribute( SituationMap::GeometryModel::Attribute::SymbolOffsetY, p.y() );
|
|
} );
|
|
|
|
QObject::connect(dlg, &SymbologyXML::SymbolDialog::changedDirection, m_self, [this](bool valid, int degree)
|
|
{
|
|
updateSymbolXmlAttribute( SituationMap::GeometryModel::Attribute::SymbolDirection, (valid) ? degree : 0 );
|
|
});
|
|
}
|
|
return dlg;
|
|
} // SymbologyXML::SymbolDialog *AttributeDialogManager::InternalData::buildSymbolXMLDialog(QWidget *parent)
|
|
|
|
|
|
void AttributeDialogManager::InternalData::symbolXmlUpdateParties()
|
|
{
|
|
const QVector<int> &partyIds = m_map->partyIdToColorFunctor().partyIds();
|
|
QVector <QColor> partyColors;
|
|
QVector <QString> partyNames;
|
|
QVector<AdvancedSymbology::Role> partyRoles;
|
|
|
|
partyColors.reserve(partyIds.size());
|
|
partyNames.reserve(partyIds.size());
|
|
partyRoles.reserve(partyIds.size());
|
|
|
|
for (int partyId : partyIds)
|
|
{
|
|
partyColors.append( m_map->partyIdToColorFunctor().partyIdToColor(partyId) );
|
|
partyNames.append ( m_map->partyIdToColorFunctor().partyIdToName (partyId) );
|
|
partyRoles.append ( m_map->partyIdToColorFunctor().partyIdToRole (partyId) );
|
|
}
|
|
m_dlgSymbolXML->updateParties( partyIds, partyColors, partyNames, partyRoles );
|
|
|
|
} // void AttributeDialogManager::InternalData::symbolXmlUpdateParties()
|
|
|
|
|
|
LtsWidgets::LtsDialog *AttributeDialogManager::InternalData::buildDrawAttrBox(QWidget *parent)
|
|
{
|
|
Dialog *dlg = new Dialog(parent);
|
|
|
|
dlg->setObjectName(QLatin1String("PlanEditor::DrawAttributeBox"));
|
|
dlg->setTitle(tr("Edit Draw Attributes"));
|
|
dlg->setOnlineHelpFilename(QStringLiteral("Plan_Editor-Create_Graphics"));
|
|
|
|
QVBoxLayout *tabLayout = new QVBoxLayout(dlg);
|
|
QGroupBox *gbLayer = new QGroupBox(tr("Graphic Attributes"), dlg);
|
|
LtsWidgets::LtsGridLayout *tmpLay = new LtsWidgets::LtsGridLayout(LtsWidgets::ButtonSize::eDefault, gbLayer, 10);
|
|
QAction *tmpAction;
|
|
QToolButton *tbTmp;
|
|
ComboBox *cmbTmp;
|
|
QSpinBox *sbTmp;
|
|
QCheckBox *cbTmp;
|
|
QLabel *lbTmp;
|
|
|
|
tabLayout -> addWidget(gbLayer);
|
|
tabLayout -> addStretch(2);
|
|
|
|
tmpLay->setContentsMargins(10, 10, 10, 10);
|
|
tmpLay->setHorizontalSpacing(10);
|
|
tmpLay->setVerticalSpacing(10);
|
|
|
|
lbTmp = new QLabel(tr("Color"), gbLayer);
|
|
{
|
|
tmpLay -> addWidget(lbTmp, 0, 0, Qt::AlignRight);
|
|
tbTmp = new QToolButton(gbLayer);
|
|
tmpLay -> addWidget(tbTmp, 0, 1, Qt::AlignLeft);
|
|
tmpAction = new QAction(QString(), gbLayer);
|
|
tmpAction -> setToolTip(tr("Popup color dialog to choose color"));
|
|
tbTmp -> setDefaultAction(tmpAction);
|
|
tbTmp -> setObjectName(QLatin1String("ColorButton"));
|
|
tbTmp -> setMaximumWidth(2000);
|
|
|
|
m_tbColor = tbTmp;
|
|
|
|
colorizeButton(m_tbColor, m_color);
|
|
|
|
connect(tmpAction, &QAction::triggered, m_self, &AttributeDialogManager::onDrawColorEdit);
|
|
}
|
|
|
|
lbTmp = new QLabel(tr("Line Style"), gbLayer);
|
|
{
|
|
tmpLay -> addWidget(lbTmp, 1, 0, Qt::AlignRight);
|
|
cmbTmp = new ComboBox(gbLayer);
|
|
tmpLay -> addWidget(cmbTmp, 1, 1);
|
|
|
|
m_cmbLinePattern = cmbTmp;
|
|
|
|
cmbTmp->addItem( Utils::getIcon("line_style_solid") ,tr("Solid") , int(SituationMap::GeometryModel::LineStyle::LineSolid));
|
|
cmbTmp->addItem( Utils::getIcon("line_style_dash") ,tr("Dashed") , int(SituationMap::GeometryModel::LineStyle::Dashed));
|
|
cmbTmp->addItem( Utils::getIcon("line_style_dotdash"),tr("Dashed Dotted"), int(SituationMap::GeometryModel::LineStyle::DashedDotted));
|
|
cmbTmp->addItem( Utils::getIcon("line_style_dot") ,tr("Dotted") , int(SituationMap::GeometryModel::LineStyle::Dotted));
|
|
|
|
cmbTmp->setCurrentIndex(static_cast<int>(m_linePattern));
|
|
|
|
/*
|
|
Add connection with function to activated signal of QComboBox. The fact that the signal is
|
|
overloaded make it neccessary to use static casting to tell the compiler which member function
|
|
should be used.
|
|
*/
|
|
connect(cmbTmp, static_cast<void (QComboBox::*)(int)>(&QComboBox::activated), m_self, &AttributeDialogManager::onSetLinePattern);
|
|
}
|
|
|
|
lbTmp = new QLabel(tr("Line Width"), gbLayer);
|
|
{
|
|
tmpLay -> addWidget(lbTmp, 0, 2, Qt::AlignRight);
|
|
sbTmp = new QSpinBox(gbLayer);
|
|
tmpLay -> addWidget(sbTmp, 0, 3, 1, 2, Qt::AlignLeft);
|
|
|
|
m_sbLineWidth = sbTmp;
|
|
|
|
sbTmp->setRange(1, 99);
|
|
sbTmp->setValue(m_lineWidth);
|
|
/*
|
|
Add connection with lambda function to valueChanged signal of QSpinBox. The fact that the signal
|
|
is overloaded make it neccessary to use static casting to tell the compiler which member function
|
|
should be used.
|
|
*/
|
|
connect(sbTmp, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), m_self, &AttributeDialogManager::onSetLineWidth);
|
|
|
|
}
|
|
|
|
lbTmp = new QLabel(tr("Line Arrow"), gbLayer);
|
|
{
|
|
tmpLay -> addWidget(lbTmp, 1, 2, Qt::AlignRight);
|
|
|
|
m_cbArrowBegin = new QCheckBox(tr("Begin"), gbLayer);
|
|
m_cbArrowEnd = new QCheckBox(tr("End"), gbLayer);
|
|
|
|
m_cbArrowBegin -> setAcceptDrops(false);
|
|
m_cbArrowEnd -> setAcceptDrops(false);
|
|
|
|
m_cbArrowBegin -> setChecked(m_lineArrowBegin);
|
|
m_cbArrowEnd -> setChecked(m_lineArrowEnd);
|
|
|
|
QHBoxLayout *arrowLayout = new QHBoxLayout;
|
|
|
|
arrowLayout -> addWidget(m_cbArrowBegin);
|
|
arrowLayout -> addSpacing(5);
|
|
arrowLayout -> addWidget(m_cbArrowEnd);
|
|
arrowLayout -> addSpacing(5);
|
|
arrowLayout -> addStretch(2);
|
|
|
|
QButtonGroup *bgArrow = new QButtonGroup(gbLayer);
|
|
|
|
bgArrow -> setExclusive(false);
|
|
bgArrow -> addButton(m_cbArrowBegin);
|
|
bgArrow -> addButton(m_cbArrowEnd);
|
|
|
|
|
|
tmpLay->addLayout(arrowLayout, 1, 3, Qt::AlignLeft);
|
|
|
|
connect(m_cbArrowBegin, &QCheckBox::toggled, m_self, &AttributeDialogManager::onSetLineArrowBegin);
|
|
connect(m_cbArrowEnd, &QCheckBox::toggled, m_self, &AttributeDialogManager::onSetLineArrowEnd);
|
|
}
|
|
|
|
tmpLay -> addWidget(Utils::buildVerticalSeparator(gbLayer), 0, 4, 2, 1);
|
|
|
|
lbTmp = new QLabel(tr("Fill"), gbLayer);
|
|
{
|
|
tmpLay -> addWidget(lbTmp, 0, 5, Qt::AlignRight);
|
|
cbTmp = new QCheckBox(QString(), gbLayer);
|
|
tmpLay -> addWidget(cbTmp, 0, 6, Qt::AlignLeft);
|
|
|
|
m_cbFill = cbTmp;
|
|
m_cbFill->setChecked(m_fillPattern != SituationMap::GeometryModel::FillPattern::None);
|
|
QObject::connect(cbTmp, &QToolButton::toggled, m_self, &AttributeDialogManager::onSetFilling);
|
|
}
|
|
|
|
lbTmp = new QLabel(tr("Color"), gbLayer);
|
|
{
|
|
tmpLay -> addWidget(lbTmp, 0, 7, Qt::AlignRight);
|
|
tbTmp = new QToolButton(gbLayer);
|
|
tmpLay -> addWidget(tbTmp, 0, 8, Qt::AlignLeft);
|
|
tmpAction = new QAction(QString(), gbLayer);
|
|
tmpAction -> setToolTip(tr("Popup color dialog to choose fill color"));
|
|
tbTmp -> setDefaultAction(tmpAction);
|
|
tbTmp -> setObjectName(QLatin1String("FillColorButton"));
|
|
tbTmp -> setMaximumWidth(2000);
|
|
|
|
m_tbFillColor = tbTmp;
|
|
|
|
colorizeButton(m_tbFillColor, m_fillColor);
|
|
|
|
QObject::connect(tmpAction, &QAction::triggered, m_self, &AttributeDialogManager::onFillColorEdit);
|
|
}
|
|
|
|
lbTmp = new QLabel(tr("Pattern"), gbLayer);
|
|
{
|
|
tmpLay -> addWidget(lbTmp, 1, 7, Qt::AlignRight);
|
|
cmbTmp = new ComboBox(gbLayer);
|
|
tmpLay -> addWidget(cmbTmp, 1, 8, Qt::AlignLeft);
|
|
|
|
m_cmbFillPattern = cmbTmp;
|
|
|
|
cmbTmp->addItem( Utils::getIcon("fill_style_none") ,tr("None") , int(SituationMap::GeometryModel::FillPattern::None));
|
|
cmbTmp->addItem( Utils::getIcon("fill_style_horizontal"),tr("Horizontal") , int(SituationMap::GeometryModel::FillPattern::Hor2));
|
|
cmbTmp->addItem( Utils::getIcon("fill_style_vertical") ,tr("Vertical") , int(SituationMap::GeometryModel::FillPattern::Ver1));
|
|
cmbTmp->addItem( Utils::getIcon("fill_style_diagonal_1"),tr("Diagonal //") , int(SituationMap::GeometryModel::FillPattern::Diag1));
|
|
cmbTmp->addItem( Utils::getIcon("fill_style_diagonal_2"),tr("Diagonal \\\\"), int(SituationMap::GeometryModel::FillPattern::Diag2));
|
|
cmbTmp->addItem( Utils::getIcon("fill_style_solid") ,tr("Solid") , int(SituationMap::GeometryModel::FillPattern::Solid));
|
|
|
|
cmbTmp->setCurrentIndex(static_cast<int>(m_fillPattern));
|
|
|
|
/*
|
|
Add connection with function to activated signal of QComboBox. The fact that the signal is
|
|
overloaded make it neccessary to use static casting to tell the compiler which member function
|
|
should be used.
|
|
*/
|
|
QObject::connect(cmbTmp, static_cast<void (ComboBox::*)(int)>(&ComboBox::activated), m_self, &AttributeDialogManager::onSetFillPattern);
|
|
}
|
|
|
|
|
|
tmpLay -> addWidget(Utils::buildVerticalSeparator(gbLayer), 0, 9, 2, 1);
|
|
lbTmp = new QLabel(tr("Ellipse Style"), gbLayer);
|
|
{
|
|
tmpLay -> addWidget(lbTmp, 0, 10, 2, 1, {Qt::AlignRight, Qt::AlignVCenter});
|
|
cmbTmp = new ComboBox(gbLayer);
|
|
tmpLay -> addWidget(cmbTmp, 0, 11, 2, 1, {Qt::AlignLeft, Qt::AlignVCenter});
|
|
|
|
m_cmbFillStyle = cmbTmp;
|
|
|
|
cmbTmp->addItem( Utils::getIcon(""), tr("Open"), int(SituationMap::GeometryModel::FillStyle::Open));
|
|
cmbTmp->addItem( Utils::getIcon(""), tr("Chord"), int(SituationMap::GeometryModel::FillStyle::Chord));
|
|
cmbTmp->addItem( Utils::getIcon(""), tr("Pieslice"), int(SituationMap::GeometryModel::FillStyle::Pieslice));
|
|
|
|
cmbTmp->setCurrentIndex(static_cast<int>(m_fillStyle));
|
|
|
|
/*
|
|
Add connection with function to activated signal of QComboBox. The fact that the signal is
|
|
overloaded make it neccessary to use static casting to tell the compiler which member function
|
|
should be used.
|
|
*/
|
|
QObject::connect(cmbTmp, static_cast<void (ComboBox::*)(int)>(&ComboBox::activated), m_self, &AttributeDialogManager::onSetFillStyle);
|
|
}
|
|
|
|
QHBoxLayout *stretch = new QHBoxLayout;
|
|
stretch->addStretch(2);
|
|
tmpLay->addLayout(stretch, 0, 12, 2, 1);
|
|
|
|
m_session.addOrReplaceWidget(dlg, m_planEditor->title(), QLatin1String("DrawAttributes"), LtsWidgets::LayoutArea::eDialogTab, true);
|
|
|
|
QObject::connect(dlg, &Dialog::signalAboutToClose, m_self, [this]()
|
|
{
|
|
m_dlgDrawAttr.clear(); // set pointer of DrawAttr dialog to nullptr
|
|
m_self->onCloseDialog();
|
|
});
|
|
|
|
return dlg;
|
|
|
|
} // AttributeDialogManager::InternalData::buildDrawAttrBox( QWidget * parent )
|
|
|
|
|
|
LtsWidgets::LtsDialog *AttributeDialogManager::InternalData::buildTextAttrBox(QWidget *parent)
|
|
{
|
|
Dialog *dlg = new Dialog(parent);
|
|
|
|
dlg->setObjectName(QLatin1String("PlanEditor::TextAttributeBox"));
|
|
dlg->setTitle(tr("Edit Text Attributes"));
|
|
dlg->setOnlineHelpFilename(QStringLiteral("Plan_Editor-Create_Graphics"));
|
|
|
|
QVBoxLayout *tabLayout = new QVBoxLayout(dlg);
|
|
QGroupBox *gbTextAttr = new QGroupBox(tr("Text Attributes"), dlg);
|
|
|
|
|
|
tabLayout -> addWidget(gbTextAttr);
|
|
tabLayout -> addStretch(2);
|
|
|
|
QVBoxLayout *attrTextLayout = new QVBoxLayout(gbTextAttr);
|
|
{
|
|
QHBoxLayout *layout = new QHBoxLayout;
|
|
QFormLayout *layoutL = new QFormLayout;
|
|
QFormLayout *layoutM = new QFormLayout;
|
|
QFormLayout *layoutR = new QFormLayout;
|
|
|
|
m_teText = new QTextEdit(gbTextAttr);
|
|
m_teText -> setAcceptRichText(false);
|
|
|
|
m_teText -> setPlainText(m_textLines);
|
|
|
|
attrTextLayout -> addWidget(m_teText);
|
|
attrTextLayout -> addSpacing(5);
|
|
attrTextLayout -> addLayout(layout);
|
|
attrTextLayout -> addStretch(2);
|
|
|
|
layout -> addSpacing(5);
|
|
layout -> addLayout(layoutL);
|
|
layout -> addSpacing(5);
|
|
layout->addWidget(Utils::buildVerticalSeparator(gbTextAttr));
|
|
layout -> addSpacing(5);
|
|
layout -> addLayout(layoutM);
|
|
layout -> addSpacing(5);
|
|
layout->addWidget(Utils::buildVerticalSeparator(gbTextAttr));
|
|
layout -> addSpacing(5);
|
|
layout -> addLayout(layoutR);
|
|
layout -> addSpacing(5);
|
|
layout -> addStretch(2);
|
|
|
|
connect(m_teText, &QTextEdit::textChanged, m_self, &AttributeDialogManager::onEditTextLines);
|
|
|
|
QDoubleSpinBox *dspTmp;
|
|
ComboBox *cmbTmp;
|
|
QToolButton *tbTmp;
|
|
QAction *tmpAction;
|
|
|
|
dspTmp = new QDoubleSpinBox(gbTextAttr);
|
|
dspTmp -> setMinimum(5);
|
|
dspTmp -> setMaximum(72);
|
|
dspTmp -> setValue(m_fontSize);
|
|
|
|
layoutL -> addRow(tr("Size"), dspTmp);
|
|
|
|
connect(dspTmp, static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged), m_self, &AttributeDialogManager::onSetFontSize);
|
|
|
|
m_dsbFontSize = dspTmp;
|
|
|
|
cmbTmp = new ComboBox(gbTextAttr);
|
|
cmbTmp -> addItem(tr("SansSerif"), int(SituationMap::GeometryModel::Font::SansSerif));
|
|
cmbTmp -> addItem(tr("Serif"), int(SituationMap::GeometryModel::Font::Serif));
|
|
cmbTmp -> addItem(tr("Fixed"), int(SituationMap::GeometryModel::Font::Fixed));
|
|
cmbTmp -> addItem(tr("Decorative"), int(SituationMap::GeometryModel::Font::Decorative));
|
|
|
|
layoutL -> addRow(tr("Font"), cmbTmp);
|
|
|
|
m_cmbFontFace = cmbTmp;
|
|
|
|
connect(cmbTmp, static_cast<void (ComboBox::*)(int)>(&ComboBox::currentIndexChanged), m_self, [this](int index)
|
|
{
|
|
SituationMap::GeometryModel::Font font = (SituationMap::GeometryModel::Font) m_cmbFontFace->itemData(index).toInt();
|
|
QString fontName;
|
|
|
|
switch (font)
|
|
{
|
|
case SituationMap::GeometryModel::Font::SansSerif : fontName = QLatin1String("Arial"); break;
|
|
case SituationMap::GeometryModel::Font::Serif : fontName = QLatin1String("Times New Roman"); break;
|
|
case SituationMap::GeometryModel::Font::Fixed : fontName = QLatin1String("Courier New"); break;
|
|
case SituationMap::GeometryModel::Font::Decorative : fontName = QLatin1String("Freestyle Script"); break;
|
|
default : fontName = QLatin1String("Wingdings"); break;
|
|
}
|
|
|
|
QFont qFont = m_teText->font();
|
|
qFont.setFamily(fontName);
|
|
m_teText->setFont(qFont);
|
|
|
|
});
|
|
|
|
connect(cmbTmp, static_cast<void (ComboBox::*)(int)>(&ComboBox::activated), m_self, &AttributeDialogManager::onSetFontFace);
|
|
|
|
cmbTmp->setCurrentIndex(1);
|
|
|
|
|
|
QWidget *styleWidget = new QWidget(gbTextAttr);
|
|
QGridLayout *styleLayout = new QGridLayout(styleWidget);
|
|
m_tbStyleBold = new QToolButton(styleWidget);
|
|
m_tbStyleItalic = new QToolButton(styleWidget);
|
|
|
|
m_tbStyleBold -> setIcon(Utils::getIcon(QLatin1String(FONT_STYLE_BOLD_ICON_NAME)));
|
|
m_tbStyleItalic-> setIcon(Utils::getIcon(QLatin1String(FONT_STYLE_ITALIC_ICON_NAME)));
|
|
|
|
m_tbStyleBold -> setCheckable(true);
|
|
m_tbStyleItalic -> setCheckable(true);
|
|
|
|
m_tbStyleBold -> setChecked(m_fontBold);
|
|
m_tbStyleItalic -> setChecked(m_fontItalic);
|
|
|
|
connect(m_tbStyleBold, &QToolButton::clicked, m_self, &AttributeDialogManager::onSetFontBold);
|
|
|
|
connect(m_tbStyleItalic, &QToolButton::clicked, m_self, &AttributeDialogManager::onSetFontItalic);
|
|
|
|
styleLayout -> addWidget(m_tbStyleBold, 0, 0);
|
|
styleLayout -> addWidget(m_tbStyleItalic, 0, 1);
|
|
|
|
layoutL -> addRow(tr("Style"), styleWidget);
|
|
|
|
tbTmp = new QToolButton(gbTextAttr);
|
|
tmpAction = new QAction(QString(), gbTextAttr);
|
|
tmpAction -> setToolTip(tr("Popup color dialog to choose text color"));
|
|
tbTmp -> setDefaultAction(tmpAction);
|
|
tbTmp -> setObjectName(QLatin1String("TextColorButton"));
|
|
tbTmp -> setMaximumWidth(2000);
|
|
|
|
m_tbFontColor = tbTmp;
|
|
|
|
QHBoxLayout *stretchHorizontal = new QHBoxLayout;
|
|
stretchHorizontal->addWidget(m_tbFontColor, 2);
|
|
|
|
layoutM -> addRow(tr("Text Color"), stretchHorizontal);
|
|
|
|
colorizeButton(m_tbFontColor, m_fontColor);
|
|
|
|
connect(tmpAction, &QAction::triggered, m_self, &AttributeDialogManager::onFontColorEdit);
|
|
|
|
QWidget *anchorWidget = new QWidget(gbTextAttr);
|
|
QGridLayout *anchorLayout = new QGridLayout(anchorWidget);
|
|
|
|
layoutM -> addRow(tr("Anchor"), anchorWidget);
|
|
|
|
for (int r = 0; r < 3; ++r)
|
|
{
|
|
for (int c = 0; c < 3; ++c)
|
|
{
|
|
QToolButton *anchor = new QToolButton(anchorWidget);
|
|
connect(anchor, &QRadioButton::clicked, m_self, &AttributeDialogManager::onSetTextAnchor);
|
|
anchor->setIcon(Utils::getIcon(QLatin1String(FONT_ANCHOR_ICON_NAME[r][c])));
|
|
anchor->setCheckable(true);
|
|
anchor->setChecked(((c == int(m_fontHAnchor)) && ((2 - r) == int(m_fontVAnchor))));
|
|
anchorLayout->addWidget(anchor, r, c, Qt::AlignCenter);
|
|
m_tbTextAnchor[r][c] = anchor;
|
|
}
|
|
}
|
|
|
|
m_slFontRotate = new QDial(gbTextAttr);
|
|
m_slFontRotate->setMinimum(0);
|
|
m_slFontRotate->setMaximum(360);
|
|
m_slFontRotate->setWrapping(true);
|
|
m_slFontRotate->setInvertedControls(true);
|
|
m_slFontRotate->setValue(90);
|
|
connect(m_slFontRotate, &QDial::valueChanged, m_self, &AttributeDialogManager::onRotateText);
|
|
layoutR->addRow(tr("Rotation"), m_slFontRotate);
|
|
|
|
m_sbFontRotate = new QSpinBox(gbTextAttr);
|
|
m_sbFontRotate->setMinimum(-1);
|
|
m_sbFontRotate->setMaximum(360);
|
|
connect(m_sbFontRotate, QOverload<int>::of(&QSpinBox::valueChanged), m_self, &AttributeDialogManager::onRotateTextSp);
|
|
layoutR->addRow(nullptr, m_sbFontRotate);
|
|
|
|
} // attrTextLayout
|
|
|
|
m_session.addOrReplaceWidget(dlg, m_planEditor->title(), QLatin1String("TextAttributes"), LtsWidgets::LayoutArea::eDialogTab, true);
|
|
|
|
QObject::connect(dlg, &Dialog::signalAboutToClose, m_self, [this]()
|
|
{
|
|
m_dlgTextAttr.clear();
|
|
m_self->onCloseDialog();
|
|
});
|
|
|
|
return dlg;
|
|
} // AttributeDialogManager::buildTextAttrBox( QWidget * parent )
|
|
|
|
|
|
LtsWidgets::LtsDialog * AttributeDialogManager::InternalData::buildParticipantBox(QWidget *parent)
|
|
{
|
|
TRACE_LOG(m_logger) << LOGFUNCTION << " START, this=" << this;
|
|
Dialog *dlg = new Dialog(parent);
|
|
|
|
dlg->setObjectName(QLatin1String("PlanEditor::ParticipantData"));
|
|
dlg->setTitle(tr("Edit Participant Attributes"));
|
|
dlg->setOnlineHelpFilename(QStringLiteral("Plan_Editor-Create_Graphics"));
|
|
|
|
QVBoxLayout * layout = new QVBoxLayout(dlg);
|
|
QHBoxLayout * layoutSymbol = new QHBoxLayout(dlg);
|
|
|
|
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);
|
|
{
|
|
QFormLayout * layoutAttrForm = new QFormLayout();
|
|
|
|
layoutAttr->addStretch(2);
|
|
layoutAttr->addLayout(layoutAttrForm);
|
|
{
|
|
m_cbPpStatus = new LtsWidgets::LtsComboBox(dlg);
|
|
m_cbPpTeamColor = new LtsWidgets::LtsComboBox(dlg);
|
|
m_cbPpTeamDColor = new LtsWidgets::LtsComboBox(dlg);
|
|
|
|
m_cbPpStatus->addItem(tr("No Injury"), static_cast<int>(AdvancedSymbology::Injury::NoInjury));
|
|
m_cbPpStatus->addItem(tr("Hit"), static_cast<int>(AdvancedSymbology::Injury::Hit));
|
|
m_cbPpStatus->addItem(tr("Mobility Kill"), static_cast<int>(AdvancedSymbology::Injury::MobilityKill));
|
|
m_cbPpStatus->addItem(tr("Weapon Kill"), static_cast<int>(AdvancedSymbology::Injury::WeaponKill));
|
|
m_cbPpStatus->addItem(tr("Total Kill"), static_cast<int>(AdvancedSymbology::Injury::TotalKill));
|
|
|
|
layoutAttrForm->addRow(new QLabel(tr("Status"), dlg), m_cbPpStatus);
|
|
layoutAttrForm->addRow(new QLabel(tr("Team Color:"), dlg), m_cbPpTeamColor);
|
|
layoutAttrForm->addRow(new QLabel(tr("Damage Team Color:"), dlg), m_cbPpTeamDColor);
|
|
}
|
|
layoutAttrForm->setLabelAlignment(Qt::AlignRight);
|
|
layoutAttr->addStretch(2);
|
|
}
|
|
|
|
layoutSymbol->addStretch(2);
|
|
|
|
layoutSymbol->addLayout(layoutLeftText);
|
|
{
|
|
m_lePpTextW = new QLineEdit(dlg);
|
|
m_lePpTextW->setToolTip(tr("W"));
|
|
m_lePpTextXY = new QLineEdit(dlg);
|
|
m_lePpTextXY->setToolTip(tr("X|Y"));
|
|
m_lePpTextV = new QLineEdit(dlg);
|
|
m_lePpTextV->setToolTip(tr("V"));
|
|
m_lePpTextT = new QLineEdit(dlg);
|
|
m_lePpTextT->setToolTip(tr("T"));
|
|
m_lePpTextZ = new QLineEdit(dlg);
|
|
m_lePpTextZ->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_lePpTextW, 0, 1, Qt::Alignment::enum_type::AlignLeft);
|
|
layoutLeftText->addWidget(m_lePpTextXY, 1, 1, Qt::Alignment::enum_type::AlignLeft);
|
|
layoutLeftText->addWidget(m_lePpTextV, 2, 1, Qt::Alignment::enum_type::AlignLeft);
|
|
layoutLeftText->addWidget(m_lePpTextT, 3, 1, Qt::Alignment::enum_type::AlignLeft);
|
|
layoutLeftText->addWidget(m_lePpTextZ, 4, 1, Qt::Alignment::enum_type::AlignLeft);
|
|
}
|
|
|
|
layoutSymbol->addLayout(layoutSymbolView);
|
|
{
|
|
QPixmap symbolPixmap(QSize(200, 200));
|
|
|
|
symbolPixmap.fill(QColor(Qt::gray));
|
|
|
|
m_laPpView = new QLabel(dlg);
|
|
m_laPpView->setPixmap(symbolPixmap);
|
|
layoutSymbolView->addStretch(2);
|
|
layoutSymbolView->addWidget(m_laPpView);
|
|
layoutSymbolView->addStretch(2);
|
|
}
|
|
|
|
layoutSymbol->addLayout(layoutRightText);
|
|
{
|
|
m_lePpTextEF = new QLineEdit(dlg);
|
|
m_lePpTextEF->setToolTip(tr("E|F"));
|
|
m_lePpTextG = new QLineEdit(dlg);
|
|
m_lePpTextG->setToolTip(tr("G"));
|
|
m_lePpTextH = new QLineEdit(dlg);
|
|
m_lePpTextH->setToolTip(tr("H"));
|
|
m_lePpTextM = new QLineEdit(dlg);
|
|
m_lePpTextM->setToolTip(tr("M"));
|
|
m_lePpTextJ = new QLineEdit(dlg);
|
|
m_lePpTextJ->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_lePpTextEF, 0, 0, Qt::Alignment::enum_type::AlignLeft);
|
|
layoutRightText->addWidget(m_lePpTextG, 1, 0, Qt::Alignment::enum_type::AlignLeft);
|
|
layoutRightText->addWidget(m_lePpTextH, 2, 0, Qt::Alignment::enum_type::AlignLeft);
|
|
layoutRightText->addWidget(m_lePpTextM, 3, 0, Qt::Alignment::enum_type::AlignLeft);
|
|
layoutRightText->addWidget(m_lePpTextJ, 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);
|
|
}
|
|
layout->addStretch(2);
|
|
|
|
m_cbPpStatus->connect(m_cbPpStatus, static_cast<void (QComboBox::*)(int)>(&QComboBox::activated), m_self, [this](int idx)
|
|
{
|
|
m_ppState = static_cast<AdvancedSymbology::Injury>(m_cbPpStatus->itemData(idx).toInt());
|
|
m_self->onChangedParticipant();
|
|
});
|
|
|
|
m_cbPpTeamColor->connect(m_cbPpTeamColor, static_cast<void (QComboBox::*)(int)>(&QComboBox::activated), m_self, [this](int idx)
|
|
{
|
|
m_ppTeamColor = m_cbPpTeamColor->itemData(idx).toInt();
|
|
m_self->onChangedParticipant();
|
|
});
|
|
|
|
m_cbPpTeamDColor->connect(m_cbPpTeamDColor, static_cast<void (QComboBox::*)(int)>(&QComboBox::activated), m_self, [this](int idx)
|
|
{
|
|
m_ppTeamDColor = m_cbPpTeamDColor->itemData(idx).toInt();
|
|
m_self->onChangedParticipant();
|
|
});
|
|
|
|
|
|
m_lePpTextW->connect(m_lePpTextW, &QLineEdit::textChanged, m_self, [this](const QString &text)
|
|
{
|
|
m_ppTextModifier[SituationMap::Participant::TextModifier::W_DateTimeGroup] = text;
|
|
m_self->onChangedParticipant();
|
|
});
|
|
|
|
m_lePpTextXY->connect(m_lePpTextXY, &QLineEdit::textChanged, m_self, [this](const QString &text)
|
|
{
|
|
m_ppTextModifier[SituationMap::Participant::TextModifier::XY_AltitudeLocation] = text;
|
|
m_self->onChangedParticipant();
|
|
});
|
|
|
|
m_lePpTextV->connect(m_lePpTextV, &QLineEdit::textChanged, m_self, [this](const QString &text)
|
|
{
|
|
m_ppTextModifier[SituationMap::Participant::TextModifier::V_Type] = text;
|
|
m_self->onChangedParticipant();
|
|
});
|
|
|
|
m_lePpTextT->connect(m_lePpTextT, &QLineEdit::textChanged, m_self, [this](const QString &text)
|
|
{
|
|
m_ppTextModifier[SituationMap::Participant::TextModifier::T_UniqueDesignation] = text;
|
|
m_self->onChangedParticipant();
|
|
});
|
|
|
|
m_lePpTextZ->connect(m_lePpTextZ, &QLineEdit::textChanged, m_self, [this](const QString &text)
|
|
{
|
|
m_ppTextModifier[SituationMap::Participant::TextModifier::Z_Speed] = text;
|
|
m_self->onChangedParticipant();
|
|
});
|
|
|
|
m_lePpTextEF->connect(m_lePpTextEF, &QLineEdit::textChanged, m_self, [this](const QString &text)
|
|
{
|
|
m_ppTextModifier[SituationMap::Participant::TextModifier::EF_ReinforcedReduced] = text;
|
|
m_self->onChangedParticipant();
|
|
});
|
|
|
|
m_lePpTextG->connect(m_lePpTextG, &QLineEdit::textChanged, m_self, [this](const QString &text)
|
|
{
|
|
m_ppTextModifier[SituationMap::Participant::TextModifier::G_StaffComments] = text;
|
|
m_self->onChangedParticipant();
|
|
});
|
|
|
|
m_lePpTextH->connect(m_lePpTextH, &QLineEdit::textChanged, m_self, [this](const QString &text)
|
|
{
|
|
m_ppTextModifier[SituationMap::Participant::TextModifier::H_AdditionalInformation] = text;
|
|
m_self->onChangedParticipant();
|
|
});
|
|
|
|
m_lePpTextM->connect(m_lePpTextM, &QLineEdit::textChanged, m_self, [this](const QString &text)
|
|
{
|
|
m_ppTextModifier[SituationMap::Participant::TextModifier::M_HigherFormation] = text;
|
|
m_self->onChangedParticipant();
|
|
});
|
|
|
|
m_lePpTextJ->connect(m_lePpTextJ, &QLineEdit::textChanged, m_self, [this](const QString &text)
|
|
{
|
|
m_ppTextModifier[SituationMap::Participant::TextModifier::JKLNP] = text;
|
|
m_self->onChangedParticipant();
|
|
});
|
|
|
|
m_self->onUpdateParticipantColors();
|
|
|
|
connect(&m_map->partyIdToColorFunctor()
|
|
, &SituationMap::PartyIdToColorFunctor::partyChanged
|
|
, m_self
|
|
, &AttributeDialogManager::onUpdateParticipantColors);
|
|
|
|
m_session.addOrReplaceWidget(dlg, m_planEditor->title(), QLatin1String("ParticipantAttributes"), LtsWidgets::LayoutArea::eDialogTab, true);
|
|
|
|
QObject::connect(dlg, &Dialog::signalAboutToClose, m_self, [this]()
|
|
{
|
|
m_dlgSymbolParticipant.clear();
|
|
m_self->onCloseDialog();
|
|
});
|
|
|
|
TRACE_LOG(m_logger) << LOGFUNCTION << " END, this=" << this;
|
|
return dlg;
|
|
} // void AttributeDialogManager::buildParticipantBox( QWidget * widget )
|
|
|
|
|
|
void AttributeDialogManager::updateSelectedFeature(const QString &undoToken, SituationMap::GeometryModel::Attribute changedAttribute)
|
|
{
|
|
if (m_internal->m_blockUpdateSelectedFeature) return; // skip feature update because dialog widgets are set up from feature node
|
|
|
|
// Update only attributes that have been changed. For this remember attribute type to skip unchanged attributes
|
|
// in addStyleAttributes
|
|
m_internal->m_changedAttribute = changedAttribute;
|
|
m_internal->m_planEditor->updateSelectedFeature(undoToken);
|
|
m_internal->m_changedAttribute = SituationMap::GeometryModel::Attribute::None;
|
|
} // AttributeDialogManager::updateSelectedFeature()
|
|
|
|
|
|
bool AttributeDialogManager::attributeNeedsUpdate(SituationMap::GeometryModel::Attribute attribute)
|
|
{
|
|
if (SituationMap::GeometryModel::Attribute::None == m_internal->m_changedAttribute) return false;
|
|
|
|
if (SituationMap::GeometryModel::Attribute::Fill == m_internal->m_changedAttribute)
|
|
{
|
|
if (SituationMap::GeometryModel::Attribute::FillPattern == attribute) return true;
|
|
}
|
|
|
|
if (SituationMap::GeometryModel::Attribute::AnchorHorizontal == m_internal->m_changedAttribute)
|
|
{
|
|
if (SituationMap::GeometryModel::Attribute::AnchorVertical == attribute) return true;
|
|
}
|
|
|
|
if (SituationMap::GeometryModel::Attribute::LineColor == attribute)
|
|
{
|
|
return (SituationMap::GeometryModel::Attribute::Color == m_internal->m_changedAttribute);
|
|
}
|
|
|
|
if (SituationMap::GeometryModel::Attribute::Injury == attribute) { return m_internal->m_ppState.changed(); }
|
|
if (SituationMap::GeometryModel::Attribute::ForceId == attribute) { return m_internal->m_ppTeamColor.changed(); }
|
|
if (SituationMap::GeometryModel::Attribute::DamageForceId == attribute) { return m_internal->m_ppTeamDColor.changed(); }
|
|
|
|
if (SituationMap::GeometryModel::Attribute::Text_EF == attribute)
|
|
{
|
|
return m_internal->m_ppTextModifier[SituationMap::Participant::TextModifier::EF_ReinforcedReduced].changed();
|
|
}
|
|
if (SituationMap::GeometryModel::Attribute::Text_G == attribute)
|
|
{
|
|
return m_internal->m_ppTextModifier[SituationMap::Participant::TextModifier::G_StaffComments].changed();
|
|
}
|
|
if (SituationMap::GeometryModel::Attribute::Text_H == attribute)
|
|
{
|
|
return m_internal->m_ppTextModifier[SituationMap::Participant::TextModifier::H_AdditionalInformation].changed();
|
|
}
|
|
if (SituationMap::GeometryModel::Attribute::Text_KLNPJ == attribute)
|
|
{
|
|
return m_internal->m_ppTextModifier[SituationMap::Participant::TextModifier::JKLNP].changed();
|
|
}
|
|
if (SituationMap::GeometryModel::Attribute::Text_M == attribute)
|
|
{
|
|
return m_internal->m_ppTextModifier[SituationMap::Participant::TextModifier::M_HigherFormation ].changed();
|
|
}
|
|
if (SituationMap::GeometryModel::Attribute::Text_T == attribute)
|
|
{
|
|
return m_internal->m_ppTextModifier[SituationMap::Participant::TextModifier::T_UniqueDesignation].changed();
|
|
}
|
|
if (SituationMap::GeometryModel::Attribute::Text_V == attribute)
|
|
{
|
|
return m_internal->m_ppTextModifier[SituationMap::Participant::TextModifier::V_Type].changed();
|
|
}
|
|
if (SituationMap::GeometryModel::Attribute::Text_W == attribute)
|
|
{
|
|
return m_internal->m_ppTextModifier[SituationMap::Participant::TextModifier::W_DateTimeGroup].changed();
|
|
}
|
|
if (SituationMap::GeometryModel::Attribute::Text_XY == attribute)
|
|
{
|
|
return m_internal->m_ppTextModifier[SituationMap::Participant::TextModifier::XY_AltitudeLocation].changed();
|
|
}
|
|
if (SituationMap::GeometryModel::Attribute::Text_Z == attribute)
|
|
{
|
|
return m_internal->m_ppTextModifier[SituationMap::Participant::TextModifier::Z_Speed].changed();
|
|
}
|
|
|
|
|
|
|
|
return (m_internal->m_changedAttribute == attribute);
|
|
} // bool AttributeDialogManager::attributeNeedsUpdate( const QString & attributeName )
|
|
|
|
|
|
|
|
void AttributeDialogManager::onSymbolChanged()
|
|
{
|
|
// ToDo: check which symbol norm is the sidc
|
|
const QString &newSidc = m_internal->m_dlgSymbolModify->getWidget()->modifiedSidc();
|
|
const QString &lastSidc = m_internal->m_dlgSymbolModify->getWidget()->lastModifiedSidc();
|
|
|
|
AdvancedSymbology::SymbologyType symbologyType = m_internal->m_dlgSymbolModify->getWidget()->symbologyType();
|
|
|
|
QString sidcPattern;
|
|
|
|
for (int i = 0; i < newSidc.size(); ++i)
|
|
{
|
|
sidcPattern += ((i >= lastSidc.size()) || (newSidc[i] != lastSidc[i])) ? newSidc[i] : QLatin1Char('*');
|
|
}
|
|
|
|
if (AdvancedSymbology::SymbologyType::APP6B == symbologyType)
|
|
{
|
|
const unsigned int rawSidcOffset = AdvancedSymbology::SidcCodec::rawSidcOffset();
|
|
if (newSidc.size() > int(rawSidcOffset+11))
|
|
{
|
|
if ((newSidc[rawSidcOffset + 10] != lastSidc[rawSidcOffset + 10]) || (newSidc[rawSidcOffset + 11] != lastSidc[rawSidcOffset + 11]))
|
|
{
|
|
sidcPattern[rawSidcOffset + 10] = newSidc[rawSidcOffset + 10];
|
|
sidcPattern[rawSidcOffset + 11] = newSidc[rawSidcOffset + 11];
|
|
}
|
|
}
|
|
}
|
|
|
|
const QMap<QString, QVariant> &fieldAttributes = m_internal->m_dlgSymbolModify->getWidget()->fieldAttributes();
|
|
const QString &symbolAttributes = m_internal->m_geoModel->buildSymbolAttributeString(fieldAttributes);
|
|
|
|
m_internal->m_planEditor->onSymbolModified( symbologyType
|
|
, sidcPattern
|
|
, symbolAttributes
|
|
, m_internal->m_ppState
|
|
, m_internal->m_ppTeamColor
|
|
, m_internal->m_ppTeamDColor
|
|
, m_internal->m_ppTextModifier );
|
|
|
|
} // void AttributeDialogManager::onSymbolChanged()
|
|
|
|
|
|
void AttributeDialogManager::onUpdateParticipantColors()
|
|
{
|
|
if (!m_internal->m_map ||
|
|
!m_internal->m_cbPpTeamColor ||
|
|
!m_internal->m_cbPpTeamDColor)
|
|
return;
|
|
|
|
const SituationMap::PartyIdToColorFunctor &partyToColorFunctor = m_internal->m_map->partyIdToColorFunctor();
|
|
const QVector<int> &partyColorIds = partyToColorFunctor.partyIds();
|
|
|
|
m_internal->m_cbPpTeamColor->clear();
|
|
m_internal->m_cbPpTeamDColor->clear();
|
|
|
|
m_internal->m_cbPpTeamColor->addItem(tr("None"), -1);
|
|
m_internal->m_cbPpTeamDColor->addItem(tr("None"), -1);
|
|
|
|
for (int partyId : partyColorIds)
|
|
{
|
|
const QColor &color = partyToColorFunctor.partyIdToColor(partyId);
|
|
const QString &partyName = partyToColorFunctor.partyIdToName(partyId);
|
|
const QString &colorLabel = QStringLiteral("%1(%2)").arg(partyName).arg(partyId);
|
|
|
|
QPixmap colorIcon(30, 30); colorIcon.fill(color);
|
|
|
|
m_internal->m_cbPpTeamColor->addItem(colorIcon, colorLabel, partyId);
|
|
m_internal->m_cbPpTeamDColor->addItem(colorIcon, colorLabel, partyId);
|
|
}
|
|
|
|
} // void AttributeDialogManager::onUpdateParticipantColors( int )
|
|
|
|
|
|
void AttributeDialogManager::onDrawColorEdit()
|
|
{
|
|
m_internal->updateDefaultColors();
|
|
m_internal->m_colorDialog->setCurrentColor(m_internal->m_color);
|
|
if (m_internal->m_colorDialog->exec() == QDialog::Accepted)
|
|
{
|
|
m_internal->m_color = m_internal->m_colorDialog->currentColor();
|
|
colorizeButton(m_internal->m_tbColor, m_internal->m_color);
|
|
updateSelectedFeature(tr("modify draw color", TR_UNDO_TOKEN), SituationMap::GeometryModel::Attribute::Color);
|
|
}
|
|
} // AttributeDialogManager::onDrawColorEdit()
|
|
|
|
|
|
void AttributeDialogManager::onFillColorEdit()
|
|
{
|
|
m_internal->updateDefaultColors();
|
|
m_internal->m_colorDialog->setCurrentColor(m_internal->m_fillColor);
|
|
if (m_internal->m_colorDialog->exec() == QDialog::Accepted)
|
|
{
|
|
m_internal->m_fillColor = m_internal->m_colorDialog->currentColor();
|
|
colorizeButton(m_internal->m_tbFillColor, m_internal->m_fillColor);
|
|
updateSelectedFeature(tr("modify fill color", TR_UNDO_TOKEN), SituationMap::GeometryModel::Attribute::FillColor);
|
|
}
|
|
} // AttributeDialogManager::onFillColorEdit()
|
|
|
|
|
|
void AttributeDialogManager::onFontColorEdit()
|
|
{
|
|
m_internal->updateDefaultColors();
|
|
m_internal->m_colorDialog->setCurrentColor(m_internal->m_fontColor);
|
|
if (m_internal->m_colorDialog->exec() == QDialog::Accepted)
|
|
{
|
|
m_internal->m_fontColor = m_internal->m_colorDialog->currentColor();
|
|
colorizeButton(m_internal->m_tbFontColor, m_internal->m_fontColor);
|
|
updateSelectedFeature(tr("modify font color", TR_UNDO_TOKEN), SituationMap::GeometryModel::Attribute::Color);
|
|
}
|
|
} // AttributeDialogManager::onFontColorEdit()
|
|
|
|
|
|
void AttributeDialogManager::onSetLinePattern(int index)
|
|
{
|
|
m_internal->m_linePattern = SituationMap::GeometryModel::LineStyle(m_internal->m_cmbLinePattern->itemData(index).toInt());
|
|
updateSelectedFeature(tr("modify line pattern", TR_UNDO_TOKEN), SituationMap::GeometryModel::Attribute::LineStyle);
|
|
} // AttributeDialogManager::onSetLinePattern( int index )
|
|
|
|
|
|
void AttributeDialogManager::onSetLineWidth(int width)
|
|
{
|
|
m_internal->m_lineWidth = width;
|
|
updateSelectedFeature(tr("modify line width", TR_UNDO_TOKEN), SituationMap::GeometryModel::Attribute::LineWidth);
|
|
} // AttributeDialogManager::onSetLineWidth( int width )
|
|
|
|
|
|
void AttributeDialogManager::onSetFillPattern(int index)
|
|
{
|
|
m_internal->m_fillPattern = SituationMap::GeometryModel::FillPattern(m_internal->m_cmbFillPattern->itemData(index).toInt());
|
|
updateSelectedFeature(tr("modify fill pattern", TR_UNDO_TOKEN), SituationMap::GeometryModel::Attribute::FillPattern);
|
|
} // AttributeDialogManager::onSetFillPattern( int index )
|
|
|
|
|
|
void AttributeDialogManager::onSetFillStyle(int index)
|
|
{
|
|
m_internal->m_fillStyle = SituationMap::GeometryModel::FillStyle(m_internal->m_cmbFillStyle->itemData(index).toInt());
|
|
updateSelectedFeature(tr("modify ellipse style", TR_UNDO_TOKEN), SituationMap::GeometryModel::Attribute::FillStyle);
|
|
} // AttributeDialogManager::onSetFillStyle( int index )
|
|
|
|
|
|
void AttributeDialogManager::onSetLineArrowBegin(bool on)
|
|
{
|
|
m_internal->m_lineArrowBegin = on;
|
|
updateSelectedFeature(tr("modify line arrow begin", TR_UNDO_TOKEN), SituationMap::GeometryModel::Attribute::Arrows);
|
|
} // AttributeDialogManager::onSetLineArrowBegin( bool on )
|
|
|
|
|
|
void AttributeDialogManager::onSetLineArrowEnd(bool on)
|
|
{
|
|
m_internal->m_lineArrowEnd = on;
|
|
updateSelectedFeature(tr("modify line arrow end", TR_UNDO_TOKEN), SituationMap::GeometryModel::Attribute::Arrows);
|
|
} // AttributeDialogManager::onSetLineArrowEnd( bool on )
|
|
|
|
|
|
void AttributeDialogManager::onSetFilling(bool on)
|
|
{
|
|
if ((on) && (m_internal->m_fillPattern == SituationMap::GeometryModel::FillPattern::None))
|
|
{
|
|
m_internal->m_fillPattern = SituationMap::GeometryModel::FillPattern::Solid;
|
|
m_internal->m_cmbFillPattern -> setCurrentIndex(m_internal->m_cmbFillPattern->findData(int(m_internal->m_fillPattern)));
|
|
}
|
|
|
|
if (!on)
|
|
{
|
|
m_internal->m_fillPattern = SituationMap::GeometryModel::FillPattern::None;
|
|
m_internal->m_cmbFillPattern -> setCurrentIndex(m_internal->m_cmbFillPattern->findData(int(m_internal->m_fillPattern)));
|
|
}
|
|
|
|
QString undoToken(on ? tr("set filling on", TR_UNDO_TOKEN) : tr("set filling off", TR_UNDO_TOKEN));
|
|
updateSelectedFeature(undoToken, SituationMap::GeometryModel::Attribute::Fill);
|
|
|
|
// Implicit setting fill color and pattern could be wrong here. Comment out for secure
|
|
// updateSelectedFeature( SituationMap::GeometryModel::Attribute::FillColor );
|
|
// updateSelectedFeature( SituationMap::GeometryModel::Attribute::FillPattern );
|
|
|
|
} // AttributeDialogManager::onSetFilling( bool on )
|
|
|
|
|
|
void AttributeDialogManager::onEditTextLines()
|
|
{
|
|
m_internal->m_textLines = m_internal->m_teText->toPlainText();
|
|
updateSelectedFeature(tr("modify text", TR_UNDO_TOKEN), SituationMap::GeometryModel::Attribute::MaxAttributes); // There isn't a fitting attribute use MaxAttributes as workaround
|
|
} // AttributeDialogManager::onEditTextLines( const QString & txt )
|
|
|
|
|
|
void AttributeDialogManager::onSetFontSize(double value)
|
|
{
|
|
m_internal->m_fontSize = value;
|
|
updateSelectedFeature(tr("modify font size", TR_UNDO_TOKEN), SituationMap::GeometryModel::Attribute::FontSize);
|
|
} // AttributeDialogManager::onSetFontSize( double value )
|
|
|
|
|
|
void AttributeDialogManager::onSetFontFace(int index)
|
|
{
|
|
m_internal->m_fontFace = (SituationMap::GeometryModel::Font) m_internal->m_cmbFontFace->itemData(index).toInt();
|
|
updateSelectedFeature(tr("modify font face", TR_UNDO_TOKEN), SituationMap::GeometryModel::Attribute::Font);
|
|
} // AttributeDialogManager::onSetFontFace( int index )
|
|
|
|
|
|
void AttributeDialogManager::onSetFontBold(bool on)
|
|
{
|
|
m_internal->m_fontBold = on;
|
|
QString undoToken(on ? tr("set text style weight to bold", TR_UNDO_TOKEN) : tr("set text style weight to normal", TR_UNDO_TOKEN));
|
|
updateSelectedFeature(undoToken, SituationMap::GeometryModel::Attribute::FontBold);
|
|
} // AttributeDialogManager::onSetFontBold( bool on )
|
|
|
|
|
|
|
|
void AttributeDialogManager::onSetFontItalic(bool on)
|
|
{
|
|
m_internal->m_fontItalic = on;
|
|
QString undoToken(on ? tr("set text style weight italic on", TR_UNDO_TOKEN) : tr("set text style italic off", TR_UNDO_TOKEN));
|
|
updateSelectedFeature(undoToken, SituationMap::GeometryModel::Attribute::FontItalic);
|
|
} // AttributeDialogManager::onSetFontItalic( bool on )
|
|
|
|
|
|
void AttributeDialogManager::onSetTextAnchor(bool)
|
|
{
|
|
const QToolButton *anchor = dynamic_cast<const QToolButton *>(sender());
|
|
for (int r = 0; r < 3; ++r)
|
|
{
|
|
for (int c = 0; c < 3; ++c)
|
|
{
|
|
if (anchor == m_internal->m_tbTextAnchor[r][c])
|
|
{
|
|
m_internal->m_tbTextAnchor[r][c]->setChecked(true);
|
|
m_internal->m_fontHAnchor = SituationMap::GeometryModel::HorizontalAlign(c);
|
|
m_internal->m_fontVAnchor = SituationMap::GeometryModel::VerticalAlign(2 - r);
|
|
}
|
|
else m_internal->m_tbTextAnchor[r][c]->setChecked(false);
|
|
}
|
|
}
|
|
updateSelectedFeature(tr("modify text anchor", TR_UNDO_TOKEN), SituationMap::GeometryModel::Attribute::AnchorHorizontal);
|
|
|
|
} // AttributeDialogManager::onSetTextAnchor( bool on )
|
|
|
|
|
|
void AttributeDialogManager::onRotateText(int value)
|
|
{
|
|
double phi = double(value + 90) / 180.0 * MathConst::pi;
|
|
m_internal->m_slFontRotate->setValue(value);
|
|
m_internal->m_sbFontRotate->setValue(360 - value);
|
|
m_internal->m_fontOVec.setX(cos(phi));
|
|
m_internal->m_fontOVec.setY(sin(phi));
|
|
updateSelectedFeature(tr("modify text rotation", TR_UNDO_TOKEN), SituationMap::GeometryModel::Attribute::Rotate);
|
|
} // AttributeDialogManager::onRotateText( int value )
|
|
|
|
void AttributeDialogManager::onRotateTextSp(int value)
|
|
{
|
|
if (value == 360)
|
|
value = 0;
|
|
if (value == -1)
|
|
value = 359;
|
|
onRotateText(360 - value);
|
|
}
|
|
|
|
void AttributeDialogManager::onChangedParticipant()
|
|
{
|
|
if (!m_internal->m_dlgSymbolModify) return;
|
|
if (!m_internal->m_map) return;
|
|
|
|
const QString &sidc = m_internal->m_dlgSymbolModify->getWidget()->modifiedSidc();
|
|
int partyId = m_internal->m_ppTeamColor.value();
|
|
int damageId = m_internal->m_ppTeamDColor.value();
|
|
const SituationMap::PartyIdToColorFunctor &partyToColorFunctor = m_internal->m_map->partyIdToColorFunctor();
|
|
|
|
// build icon preview
|
|
|
|
AdvancedSymbology::SymbolResultWatcher *symbolGuard = new AdvancedSymbology::SymbolResultWatcher(this);
|
|
|
|
QLabel *lblToSet = m_internal->m_laPpView;
|
|
if (!lblToSet)
|
|
return;
|
|
QObject::connect(symbolGuard, &AdvancedSymbology::SymbolResultWatcher::resultReady, lblToSet, [lblToSet, symbolGuard]()
|
|
{
|
|
QSharedPointer<AdvancedSymbology::SymbolResult> symbolResult = symbolGuard->symbolResult();
|
|
if (nullptr != symbolResult)
|
|
{
|
|
QPixmap symbolPixmap = QPixmap::fromImage(symbolResult->symbolImage().image());
|
|
|
|
if (symbolPixmap.width() > 200) symbolPixmap = symbolPixmap.scaledToWidth(200);
|
|
if (symbolPixmap.height() > 200) symbolPixmap = symbolPixmap.scaledToHeight(200);
|
|
|
|
lblToSet->setPixmap(symbolPixmap);
|
|
}
|
|
});
|
|
|
|
AdvancedSymbology::SymbolDataToRender symDataToRender(sidc);
|
|
|
|
symDataToRender.fillColorReplace = (partyId >= 0);
|
|
symDataToRender.fillColor = partyToColorFunctor.partyIdToColor(partyId);
|
|
symDataToRender.injuryColor = partyToColorFunctor.partyIdToColor(damageId);
|
|
symDataToRender.injury = m_internal->m_ppState.value();
|
|
symDataToRender.role = partyToColorFunctor.partyIdToRole(partyId);
|
|
|
|
symbolGuard->setSymbolResult(m_internal->m_map->symbolDictionary().fetchSymbol(symDataToRender));
|
|
|
|
if (m_internal->m_dlgSymbolModify)
|
|
{
|
|
AdvancedSymbology::SymbologyType symbologyType = m_internal->m_dlgSymbolModify->getWidget()->symbologyType();
|
|
|
|
const QMap<QString, QVariant> &fieldAttributes = m_internal->m_dlgSymbolModify->getWidget()->fieldAttributes();
|
|
const QString &symbolAttributes = m_internal->m_geoModel->buildSymbolAttributeString(fieldAttributes);
|
|
|
|
m_internal->m_planEditor->onSymbolModified( symbologyType
|
|
, QString().fill(QLatin1Char('*'),20)
|
|
, symbolAttributes
|
|
, m_internal->m_ppState
|
|
, m_internal->m_ppTeamColor
|
|
, m_internal->m_ppTeamDColor
|
|
, m_internal->m_ppTextModifier);
|
|
}
|
|
} // void AttributeDialogManager::onChangedParticipant
|
|
|
|
|
|
void AttributeDialogManager::addStyleAttributes(const SituationMap::GeometryModel::Node &node, bool prepareUndo, bool changedAttrOnly)
|
|
{
|
|
SituationMap::GeometryModel::PrimitiveType primitiveType = m_internal->m_geoModel->getType(node);
|
|
QList<SituationMap::GeometryModel::Attribute> supportedStyleAttributes = m_internal->m_geoModel->supportedAttributes(primitiveType);
|
|
QList<SituationMap::GeometryModel::Attribute>::iterator attrIt = supportedStyleAttributes.begin();
|
|
|
|
// Remove geometry attributes
|
|
while (attrIt != supportedStyleAttributes.end())
|
|
{
|
|
if (attributeNeedsUpdate(*attrIt))
|
|
{
|
|
switch (*attrIt)
|
|
{
|
|
// ToDo : add missing geometry attibutes
|
|
case SituationMap::GeometryModel::Attribute::Close:
|
|
case SituationMap::GeometryModel::Attribute::Width:
|
|
case SituationMap::GeometryModel::Attribute::Height:
|
|
{
|
|
attrIt = supportedStyleAttributes.erase(attrIt);
|
|
} break;
|
|
|
|
case SituationMap::GeometryModel::Attribute::Rotate:
|
|
{
|
|
if (primitiveType != SituationMap::GeometryModel::PrimitiveType::Text)
|
|
attrIt = supportedStyleAttributes.erase(attrIt);
|
|
else
|
|
++attrIt;
|
|
} break;
|
|
|
|
default:
|
|
++attrIt;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
++attrIt;
|
|
} // while
|
|
|
|
for (attrIt = supportedStyleAttributes.begin(); attrIt != supportedStyleAttributes.end(); ++attrIt)
|
|
{
|
|
|
|
if (changedAttrOnly && (!attributeNeedsUpdate(*attrIt))) continue;
|
|
|
|
QVariant attrValue;
|
|
|
|
switch (*attrIt)
|
|
{
|
|
|
|
case SituationMap::GeometryModel::Attribute::Arrows:
|
|
{
|
|
if (m_internal->m_lineArrowBegin)
|
|
{
|
|
if (m_internal->m_lineArrowEnd) attrValue = int(SituationMap::GeometryModel::Arrows::Both);
|
|
else attrValue = int(SituationMap::GeometryModel::Arrows::Start);
|
|
}
|
|
else
|
|
{
|
|
if (m_internal->m_lineArrowEnd) attrValue = int(SituationMap::GeometryModel::Arrows::End);
|
|
else attrValue = int(SituationMap::GeometryModel::Arrows::NoArrows);
|
|
}
|
|
} break;
|
|
|
|
case SituationMap::GeometryModel::Attribute::LineWidth : attrValue = m_internal->m_lineWidth; break;
|
|
case SituationMap::GeometryModel::Attribute::Color : attrValue = (primitiveType == SituationMap::GeometryModel::PrimitiveType::Text)
|
|
? m_internal->m_fontColor : m_internal->m_color; break;
|
|
case SituationMap::GeometryModel::Attribute::Fill : attrValue = (m_internal->m_fillPattern != SituationMap::GeometryModel::FillPattern::None); break;
|
|
case SituationMap::GeometryModel::Attribute::FillColor : attrValue = m_internal->m_fillColor; break;
|
|
case SituationMap::GeometryModel::Attribute::FillPattern : attrValue = int(m_internal->m_fillPattern); break;
|
|
case SituationMap::GeometryModel::Attribute::FillStyle : attrValue = int(m_internal->m_fillStyle); break;
|
|
case SituationMap::GeometryModel::Attribute::LineColor : attrValue = m_internal->m_color; break;
|
|
case SituationMap::GeometryModel::Attribute::LineStyle : attrValue = int(m_internal->m_linePattern); break;
|
|
case SituationMap::GeometryModel::Attribute::Font : attrValue = int(m_internal->m_fontFace); break;
|
|
case SituationMap::GeometryModel::Attribute::FontSize : attrValue = m_internal->m_fontSize; break;
|
|
case SituationMap::GeometryModel::Attribute::FontBold : attrValue = m_internal->m_fontBold; break;
|
|
case SituationMap::GeometryModel::Attribute::FontItalic : attrValue = m_internal->m_fontItalic; break;
|
|
case SituationMap::GeometryModel::Attribute::AnchorHorizontal : attrValue = int(m_internal->m_fontHAnchor); break;
|
|
case SituationMap::GeometryModel::Attribute::AnchorVertical : attrValue = int(m_internal->m_fontVAnchor); break;
|
|
case SituationMap::GeometryModel::Attribute::Rotate:
|
|
{
|
|
if (primitiveType == SituationMap::GeometryModel::PrimitiveType::Text)
|
|
attrValue = SituationMap::MathUtils::getMathAngle(m_internal->m_fontOVec) * 180.0 / MathConst::pi;
|
|
} break;
|
|
|
|
case SituationMap::GeometryModel::Attribute::Injury : attrValue = int(m_internal->m_ppState.value()); break;
|
|
case SituationMap::GeometryModel::Attribute::ForceId : attrValue = m_internal->m_ppTeamColor.value(); break;
|
|
case SituationMap::GeometryModel::Attribute::DamageForceId : attrValue = m_internal->m_ppTeamDColor.value(); break;
|
|
|
|
case SituationMap::GeometryModel::Attribute::Text_EF :
|
|
{
|
|
attrValue = m_internal->m_ppTextModifier[SituationMap::Participant::TextModifier::EF_ReinforcedReduced].value();
|
|
} break;
|
|
|
|
case SituationMap::GeometryModel::Attribute::Text_G :
|
|
{
|
|
attrValue = m_internal->m_ppTextModifier[SituationMap::Participant::TextModifier::G_StaffComments].value();
|
|
} break;
|
|
|
|
case SituationMap::GeometryModel::Attribute::Text_H :
|
|
{
|
|
attrValue = m_internal->m_ppTextModifier[SituationMap::Participant::TextModifier::H_AdditionalInformation].value();
|
|
} break;
|
|
|
|
case SituationMap::GeometryModel::Attribute::Text_KLNPJ :
|
|
{
|
|
attrValue = m_internal->m_ppTextModifier[SituationMap::Participant::TextModifier::JKLNP].value();
|
|
} break;
|
|
|
|
case SituationMap::GeometryModel::Attribute::Text_M :
|
|
{
|
|
attrValue = m_internal->m_ppTextModifier[SituationMap::Participant::TextModifier::M_HigherFormation].value();
|
|
} break;
|
|
|
|
case SituationMap::GeometryModel::Attribute::Text_T :
|
|
{
|
|
attrValue = m_internal->m_ppTextModifier[SituationMap::Participant::TextModifier::T_UniqueDesignation].value();
|
|
} break;
|
|
|
|
case SituationMap::GeometryModel::Attribute::Text_V :
|
|
{
|
|
attrValue = m_internal->m_ppTextModifier[SituationMap::Participant::TextModifier::V_Type].value();
|
|
} break;
|
|
|
|
case SituationMap::GeometryModel::Attribute::Text_W :
|
|
{
|
|
attrValue = m_internal->m_ppTextModifier[SituationMap::Participant::TextModifier::W_DateTimeGroup].value();
|
|
} break;
|
|
|
|
case SituationMap::GeometryModel::Attribute::Text_XY :
|
|
{
|
|
attrValue = m_internal->m_ppTextModifier[SituationMap::Participant::TextModifier::XY_AltitudeLocation].value();
|
|
} break;
|
|
|
|
case SituationMap::GeometryModel::Attribute::Text_Z :
|
|
{
|
|
attrValue = m_internal->m_ppTextModifier[SituationMap::Participant::TextModifier::Z_Speed].value();
|
|
} break;
|
|
|
|
default: break;
|
|
} // switch
|
|
|
|
if (attrValue.isValid())
|
|
{
|
|
if (prepareUndo)
|
|
{
|
|
m_internal->m_geoModel->startUndoBlock();
|
|
m_internal->m_geoModel->setPrimitiveAttribute(node, *attrIt, attrValue);
|
|
m_internal->m_geoModel->endUndoBlock(tr("modifiy feature style", TR_UNDO_TOKEN));
|
|
}
|
|
else m_internal->m_geoModel->setPrimitiveAttribute(node, *attrIt, attrValue);
|
|
}
|
|
} // for attrIt
|
|
|
|
// There isn't a fitting attribute use MaxAttributes as workaround
|
|
if (attributeNeedsUpdate(SituationMap::GeometryModel::Attribute::MaxAttributes))
|
|
m_internal->m_geoModel->setTextData(node, textLines(), SituationMap::GeometryModel::HorizontalAlign::Left);
|
|
} // AttributeDialogManager::addStyleAttributes( const SituationMap::GeometryModel::Node & node, bool prepareUndo )
|
|
|
|
|
|
void AttributeDialogManager::getStyleAttributes(const SituationMap::GeometryModel::Node &node)
|
|
{
|
|
TRACE_LOG(m_internal->m_logger) << LOGFUNCTION << " START "
|
|
<< ", m_dlgSymbolModify= " << m_internal->m_dlgSymbolModify
|
|
<< ", m_dlgSymbolXML= " << m_internal->m_dlgSymbolXML;
|
|
onResetWidgets();
|
|
|
|
m_internal->m_blockUpdateSelectedFeature = true;
|
|
|
|
SituationMap::GeometryModel::PrimitiveType primitiveType = m_internal->m_geoModel->getType(node);
|
|
const QList<SituationMap::GeometryModel::Attribute> &supportedStyleAttributes = m_internal->m_geoModel->supportedAttributes(primitiveType);
|
|
|
|
for (auto attr : supportedStyleAttributes)
|
|
{
|
|
QVariant attrValue = m_internal->m_geoModel->getAttribute(node, attr);
|
|
|
|
if (attrValue.isValid())
|
|
{
|
|
switch (attr)
|
|
{
|
|
case SituationMap::GeometryModel::Attribute::Color:
|
|
{
|
|
if (SituationMap::GeometryModel::PrimitiveType::Text == primitiveType)
|
|
{
|
|
m_internal->m_fontColor = attrValue.value<QColor>();
|
|
colorizeButton(m_internal->m_tbFontColor, m_internal->m_fontColor);
|
|
}
|
|
else
|
|
{
|
|
m_internal->m_color = attrValue.value<QColor>();
|
|
colorizeButton(m_internal->m_tbColor, m_internal->m_color);
|
|
}
|
|
} break;
|
|
|
|
case SituationMap::GeometryModel::Attribute::Fill:
|
|
{
|
|
if (m_internal->m_cbFill) m_internal->m_cbFill->setChecked(attrValue.toBool());
|
|
} break;
|
|
|
|
case SituationMap::GeometryModel::Attribute::FillColor:
|
|
{
|
|
m_internal->m_fillColor = attrValue.value<QColor>();
|
|
colorizeButton(m_internal->m_tbFillColor, m_internal->m_fillColor);
|
|
} break;
|
|
|
|
case SituationMap::GeometryModel::Attribute::FillPattern:
|
|
{
|
|
m_internal->m_fillPattern = SituationMap::GeometryModel::FillPattern(attrValue.toInt());
|
|
if (m_internal->m_cmbFillPattern) m_internal->m_cmbFillPattern -> setCurrentIndex(m_internal->m_cmbFillPattern->findData(int(m_internal->m_fillPattern)));
|
|
} break;
|
|
|
|
case SituationMap::GeometryModel::Attribute::FillStyle:
|
|
{
|
|
m_internal->m_fillStyle = SituationMap::GeometryModel::FillStyle(attrValue.toInt());
|
|
if (m_internal->m_cmbFillStyle) m_internal->m_cmbFillStyle -> setCurrentIndex(m_internal->m_cmbFillStyle->findData(int(m_internal->m_fillStyle)));
|
|
} break;
|
|
|
|
case SituationMap::GeometryModel::Attribute::LineColor:
|
|
{
|
|
m_internal->m_color = attrValue.value<QColor>();
|
|
colorizeButton(m_internal->m_tbColor, m_internal->m_color);
|
|
} break;
|
|
|
|
case SituationMap::GeometryModel::Attribute::LineStyle:
|
|
{
|
|
m_internal->m_linePattern = SituationMap::GeometryModel::LineStyle(attrValue.toInt());
|
|
if (m_internal->m_cmbLinePattern) m_internal->m_cmbLinePattern -> setCurrentIndex(m_internal->m_cmbLinePattern->findData(int(m_internal->m_linePattern)));
|
|
} break;
|
|
|
|
case SituationMap::GeometryModel::Attribute::LineWidth:
|
|
{
|
|
m_internal->m_lineWidth = attrValue.toInt();
|
|
if (m_internal->m_sbLineWidth) m_internal->m_sbLineWidth->setValue(m_internal->m_lineWidth);
|
|
} break;
|
|
|
|
case SituationMap::GeometryModel::Attribute::Arrows:
|
|
{
|
|
SituationMap::GeometryModel::Arrows arrows = (SituationMap::GeometryModel::Arrows) attrValue.toInt();
|
|
|
|
if (m_internal->m_cbArrowBegin && m_internal->m_cbArrowEnd)
|
|
{
|
|
m_internal->m_cbArrowBegin -> setChecked(false);
|
|
m_internal->m_cbArrowEnd -> setChecked(false);
|
|
|
|
switch (arrows)
|
|
{
|
|
case SituationMap::GeometryModel::Arrows::Both : m_internal->m_cbArrowEnd -> setChecked(true); Q_FALLTHROUGH();
|
|
case SituationMap::GeometryModel::Arrows::Start : m_internal->m_cbArrowBegin -> setChecked(true); break;
|
|
case SituationMap::GeometryModel::Arrows::End : m_internal->m_cbArrowEnd -> setChecked(true); break;
|
|
case SituationMap::GeometryModel::Arrows::NoArrows :
|
|
default: break;
|
|
}
|
|
}
|
|
} break;
|
|
|
|
case SituationMap::GeometryModel::Attribute::Font:
|
|
{
|
|
m_internal->m_fontFace = SituationMap::GeometryModel::Font(attrValue.toInt());
|
|
if (m_internal->m_cmbFontFace) m_internal->m_cmbFontFace->setCurrentIndex(m_internal->m_cmbFontFace->findData(int(m_internal->m_fontFace)));
|
|
} break;
|
|
|
|
case SituationMap::GeometryModel::Attribute::FontSize:
|
|
{
|
|
bool ok = false;
|
|
double val = attrValue.toDouble(&ok);
|
|
if ((ok) && (val > 5.0)) m_internal->m_fontSize = val;
|
|
if (m_internal->m_dsbFontSize) m_internal->m_dsbFontSize->setValue(m_internal->m_fontSize);
|
|
} break;
|
|
|
|
case SituationMap::GeometryModel::Attribute::FontBold:
|
|
{
|
|
m_internal->m_fontBold = attrValue.toBool();
|
|
if (m_internal->m_tbStyleBold) m_internal->m_tbStyleBold->setChecked(m_internal->m_fontBold);
|
|
} break;
|
|
|
|
case SituationMap::GeometryModel::Attribute::FontItalic:
|
|
{
|
|
m_internal->m_fontItalic = attrValue.toBool();
|
|
if (m_internal->m_tbStyleItalic) m_internal->m_tbStyleItalic->setChecked(m_internal->m_fontItalic);
|
|
} break;
|
|
|
|
case SituationMap::GeometryModel::Attribute::AnchorHorizontal:
|
|
{
|
|
m_internal->m_fontHAnchor = SituationMap::GeometryModel::HorizontalAlign(attrValue.toInt());
|
|
} break;
|
|
|
|
case SituationMap::GeometryModel::Attribute::AnchorVertical:
|
|
{
|
|
m_internal->m_fontVAnchor = SituationMap::GeometryModel::VerticalAlign(attrValue.toInt());
|
|
} break;
|
|
|
|
case SituationMap::GeometryModel::Attribute::Rotate:
|
|
{
|
|
const double phi = attrValue.toDouble() / 180.0 * MathConst::pi;
|
|
|
|
m_internal->m_fontOVec.setX(cos(phi));
|
|
m_internal->m_fontOVec.setY(sin(phi));
|
|
|
|
int value = qRound(attrValue.toDouble() - 90);
|
|
if (value < 0) value = 360 + value;
|
|
|
|
if (m_internal->m_slFontRotate) m_internal->m_slFontRotate->setValue(value);
|
|
if (m_internal->m_sbFontRotate) m_internal->m_sbFontRotate->setValue(360 - value);
|
|
} break;
|
|
|
|
case SituationMap::GeometryModel::Attribute::SIDC:
|
|
{
|
|
if (m_internal->m_dlgSymbolModify)
|
|
{
|
|
m_internal->m_dlgSymbolModify->getWidget()->blockSignals(true);
|
|
m_internal->m_dlgSymbolModify->getWidget()->setSidc(attrValue.toString());
|
|
m_internal->m_dlgSymbolModify->getWidget()->blockSignals(false);
|
|
}
|
|
} break;
|
|
|
|
case SituationMap::GeometryModel::Attribute::SIDC_Attributes:
|
|
{
|
|
if (m_internal->m_dlgSymbolModify)
|
|
{
|
|
QMap<QString, QVariant> attrMap;
|
|
const QString &symbolFieldAttr = m_internal->m_geoModel->getAttribute(node, SituationMap::GeometryModel::Attribute::SIDC_Attributes).toString();
|
|
m_internal -> m_geoModel->parseSymbolAttributeString(symbolFieldAttr, attrMap);
|
|
m_internal->m_dlgSymbolModify->getWidget()->blockSignals(true);
|
|
m_internal->m_dlgSymbolModify->getWidget()->setFieldAttributes(attrMap);
|
|
m_internal->m_dlgSymbolModify->getWidget()->blockSignals(false);
|
|
}
|
|
} break;
|
|
|
|
case SituationMap::GeometryModel::Attribute::Injury:
|
|
{
|
|
if (m_internal->m_dlgSymbolModify)
|
|
{
|
|
AdvancedSymbology::Injury injury = static_cast<AdvancedSymbology::Injury>(m_internal->m_geoModel->getAttribute(node, SituationMap::GeometryModel::Attribute::Injury).toInt());
|
|
m_internal->setParticipantState(injury);
|
|
}
|
|
} break;
|
|
|
|
case SituationMap::GeometryModel::Attribute::ForceId:
|
|
{
|
|
if (m_internal->m_dlgSymbolModify)
|
|
{
|
|
int partyId = m_internal->m_geoModel->getAttribute(node, SituationMap::GeometryModel::Attribute::ForceId).toInt();
|
|
m_internal->setParticipantPartyId(partyId);
|
|
}
|
|
} break;
|
|
|
|
case SituationMap::GeometryModel::Attribute::DamageForceId:
|
|
{
|
|
if (m_internal->m_dlgSymbolModify)
|
|
{
|
|
int damageId = m_internal->m_geoModel->getAttribute(node, SituationMap::GeometryModel::Attribute::DamageForceId).toInt();
|
|
m_internal->setParticipantDamageId(damageId);
|
|
}
|
|
} break;
|
|
|
|
case SituationMap::GeometryModel::Attribute::Text_EF:
|
|
{
|
|
if (m_internal->m_dlgSymbolModify)
|
|
{
|
|
const QString &text = m_internal->m_geoModel->getAttribute(node, attr).toString();
|
|
m_internal->setParticipantTextModifier(SituationMap::Participant::TextModifier::EF_ReinforcedReduced,text);
|
|
}
|
|
} break;
|
|
case SituationMap::GeometryModel::Attribute::Text_G:
|
|
{
|
|
if (m_internal->m_dlgSymbolModify)
|
|
{
|
|
const QString &text = m_internal->m_geoModel->getAttribute(node, attr).toString();
|
|
m_internal->setParticipantTextModifier(SituationMap::Participant::TextModifier::G_StaffComments,text);
|
|
}
|
|
} break;
|
|
case SituationMap::GeometryModel::Attribute::Text_H:
|
|
{
|
|
if (m_internal->m_dlgSymbolModify)
|
|
{
|
|
const QString &text = m_internal->m_geoModel->getAttribute(node, attr).toString();
|
|
m_internal->setParticipantTextModifier(SituationMap::Participant::TextModifier::H_AdditionalInformation,text);
|
|
}
|
|
} break;
|
|
case SituationMap::GeometryModel::Attribute::Text_KLNPJ:
|
|
{
|
|
if (m_internal->m_dlgSymbolModify)
|
|
{
|
|
const QString &text = m_internal->m_geoModel->getAttribute(node, attr).toString();
|
|
m_internal->setParticipantTextModifier(SituationMap::Participant::TextModifier::JKLNP, text);
|
|
}
|
|
} break;
|
|
case SituationMap::GeometryModel::Attribute::Text_M:
|
|
{
|
|
if (m_internal->m_dlgSymbolModify)
|
|
{
|
|
const QString &text = m_internal->m_geoModel->getAttribute(node, attr).toString();
|
|
m_internal->setParticipantTextModifier(SituationMap::Participant::TextModifier::M_HigherFormation, text);
|
|
}
|
|
} break;
|
|
case SituationMap::GeometryModel::Attribute::Text_T:
|
|
{
|
|
if (m_internal->m_dlgSymbolModify)
|
|
{
|
|
const QString &text = m_internal->m_geoModel->getAttribute(node, attr).toString();
|
|
m_internal->setParticipantTextModifier(SituationMap::Participant::TextModifier::T_UniqueDesignation, text);
|
|
}
|
|
} break;
|
|
case SituationMap::GeometryModel::Attribute::Text_V:
|
|
{
|
|
if (m_internal->m_dlgSymbolModify)
|
|
{
|
|
const QString &text = m_internal->m_geoModel->getAttribute(node, attr).toString();
|
|
m_internal->setParticipantTextModifier(SituationMap::Participant::TextModifier::V_Type, text);
|
|
}
|
|
} break;
|
|
case SituationMap::GeometryModel::Attribute::Text_W:
|
|
{
|
|
if (m_internal->m_dlgSymbolModify)
|
|
{
|
|
const QString &text = m_internal->m_geoModel->getAttribute(node, attr).toString();
|
|
m_internal->setParticipantTextModifier(SituationMap::Participant::TextModifier::W_DateTimeGroup, text);
|
|
}
|
|
} break;
|
|
case SituationMap::GeometryModel::Attribute::Text_XY:
|
|
{
|
|
if (m_internal->m_dlgSymbolModify)
|
|
{
|
|
const QString &text = m_internal->m_geoModel->getAttribute(node, attr).toString();
|
|
m_internal->setParticipantTextModifier(SituationMap::Participant::TextModifier::XY_AltitudeLocation, text);
|
|
}
|
|
} break;
|
|
case SituationMap::GeometryModel::Attribute::Text_Z:
|
|
{
|
|
if (m_internal->m_dlgSymbolModify)
|
|
{
|
|
const QString &text = m_internal->m_geoModel->getAttribute(node, attr).toString();
|
|
m_internal->setParticipantTextModifier(SituationMap::Participant::TextModifier::Z_Speed, text);
|
|
}
|
|
} break;
|
|
|
|
default: break;
|
|
}
|
|
}
|
|
}
|
|
|
|
for (int r = 0; r < 3; ++r)
|
|
{
|
|
for (int c = 0; c < 3; ++c)
|
|
{
|
|
if (nullptr != m_internal->m_tbTextAnchor[r][c])
|
|
m_internal->m_tbTextAnchor[r][c]->setChecked(((int(m_internal->m_fontHAnchor) == c) && (int(m_internal->m_fontVAnchor) == (2 - r))));
|
|
}
|
|
}
|
|
|
|
if (m_internal->m_teText) m_internal->m_teText->setPlainText(m_internal->m_geoModel->getTextData(node));
|
|
|
|
m_internal->m_blockUpdateSelectedFeature = false;
|
|
|
|
} // AttributeDialogManager::getStyleAttributes(const SituationMap::GeometryModel::Node & node)
|
|
|
|
} // namespace PlanEditor
|