Files
qt5-legatus-legacy/Lts/Plugins/ParticipantManagement/Gui/ParticipantInfo/participant_set_injury_dialog.cpp
T
2026-08-13 18:33:10 +02:00

347 lines
11 KiB
C++
Executable File

/**
* @RDE_HEADER@
* ParticipantManagement - ParticipantSetInjury
* $Id$
* $HeadURL$
* $Author$
* Created by Patric Karwat, SLSE, 2020-05-13
*/
#include "participant_set_injury_dialog.h"
#include "ui_participant_set_injury_dialog.h"
#include <LtsSession/lts_session_data.h>
#include <ParticipantManagement/Gui/Common/participant_vulnerability_types.h>
#include <ProjectDataManagement/pdm_to_string.h>
namespace ParticipantManagement
{
ParticipantSetInjuryDialog::ParticipantSetInjuryDialog(int participantId, QWidget *parent)
: LtsWidgets::LtsDialog(parent, LtsWidgets::ButtonCombination::OkApplyCancel)
, m_participantId(participantId)
, m_eqId(-1)
, m_session(nullptr)
, m_dtc(nullptr)
, m_ftc(nullptr)
, m_ppmCbxIfc(nullptr)
, m_requestHelper(new LtsUtils::RequestHelper(this))
, m_bgInjury(nullptr)
, m_bgBodypart(nullptr)
, m_bgSide(nullptr)
, m_ui(new Ui::ParticipantSetInjuryDialog)
, m_logger(getLogger("ParticipantSetInjuryDialog"))
{
m_ui->setupUi(this);
}
bool ParticipantSetInjuryDialog::init(LtsSession::LtsSession *session,
const std::shared_ptr<Interface::Dtc> &dtc,
const std::shared_ptr<Interface::Ftc> &ftc,
const std::shared_ptr<ProjectDataManagement::Interface::Dtc> &dtcPdm)
{
if (!session || !dtc || !ftc || !dtcPdm)
return false;
if (!session->getForeignGuiInterface<ParticipantManagement::ForeignGuiComboboxInterface>(m_ppmCbxIfc))
return false;
m_session = session;
m_dtc = dtc;
m_ftc = ftc;
m_dtcPdm = dtcPdm;
if(!m_dtcPdm->enableSanitationInjury() || !m_dtcPdm->enableSanitationInjuryKind()
|| !m_dtcPdm->enableSanitationInjuryPlace1() || !m_dtcPdm->enableSanitationInjuryPlace2())
return false;
m_dtcPdm->waitForHistoricalDataSanitationInjury(1000);
m_dtcPdm->waitForHistoricalDataSanitationInjuryKind(1000);
m_dtcPdm->waitForHistoricalDataSanitationInjuryPlace1(1000);
m_dtcPdm->waitForHistoricalDataSanitationInjuryPlace2(1000);
const Participant participant = m_dtc->participant(m_participantId);
if (participant.equipmentNumber().is_set())
m_eqId = participant.equipmentNumber().get();
if (m_dtc->type(participant.typeId()).typeClass() != TypeClass::Human)
return false;
auto vec = vulnerabilityStatesForTypeClass(TypeClass::Human);
if (!vec.contains(ProjectDataManagement::VulnerabilityState::LightDamage)
|| !vec.contains(ProjectDataManagement::VulnerabilityState::MediumDamage)
|| !vec.contains(ProjectDataManagement::VulnerabilityState::HeavyDamage))
return false;
m_injuries = m_dtcPdm->sanitationInjurys();
m_injuryKind = m_dtcPdm->sanitationInjuryKinds();
m_injuryPlace1 = m_dtcPdm->sanitationInjuryPlace1s();
m_injuryPlace2 = m_dtcPdm->sanitationInjuryPlace2s();
if (m_injuries.count() == 0 || m_injuryKind.count() == 0 || m_injuryPlace1.count() == 0 || m_injuryPlace2.count() == 0)
return false;
createButtonGroups();
resetRadioStates();
checkRadioStatesBody();
// I dant want to use mininum size here so I add one first and remove it later
//const QString &mediumDamage = toString(ProjectDataManagement::VulnerabilityState::MediumDamage, ProjectDataManagement::VulnerabilityClass::SoldierInjuries);
checkState();
//m_ui->cbState->addItem(mediumDamage, 0);
//m_uiRequirements->addRequirement({ m_ui->lblBodypart, [this]() { return (m_bgBodypart->checkedId() > 0); }});
//m_uiRequirements->addRequirement({ m_ui->lblInjury, [this]() { return (m_bgInjury->checkedId() > 0); }});
//m_uiRequirements->addRequirement({ m_ui->lblSide, [this]() { return ((m_ui->sideLeft->isEnabled() && m_bgSide->checkedId() > 0) || (!m_ui->sideLeft->isEnabled())); }});
//m_uiRequirements->addRequirement({ m_ui->lblState, [this]() { return (m_ui->cbState->currentData().toInt() > 0); }});
//set old data in combo box cbState
const DynamicParticipantData &dynData = m_dtc->dynamicParticipantData(m_participantId);
setOldData(dynData);
return true;
}
ParticipantSetInjuryDialog::~ParticipantSetInjuryDialog()
{
delete m_ui;
}
void ParticipantSetInjuryDialog::retranslate()
{
QString id;
if (m_eqId > 0)
id = QString::number(m_eqId);
translate(m_ui, tr("Set Injury: %1").arg((id)));
}
void ParticipantSetInjuryDialog::createButtonGroups()
{
if (!m_ui->gbBodyPart || !m_ui->gbBodyPart->layout()
|| !m_ui->gbInjury || !m_ui->gbInjury->layout()
|| !m_ui->gbSide || !m_ui->gbSide->layout())
return;
//Add Injury Kinds
QRadioButton *rb;
QSpacerItem *item ;
m_bgInjury = new QButtonGroup(this);
for (const auto &injuryKind : qAsConst(m_injuryKind))
{
rb = new QRadioButton(ProjectDataManagement::trSanitationInjuryKindName(injuryKind.name()), this);
m_bgInjury->addButton(rb, injuryKind.id());
m_ui->gbInjury->layout()->addWidget(rb);
}
//Add Spacer at the end
item = new QSpacerItem(2,2,QSizePolicy::Minimum, QSizePolicy::MinimumExpanding);
m_ui->gbInjury->layout()->addItem(item);
//Now Add Body Parts
m_bgBodypart = new QButtonGroup(this);
for (const auto &injuryplace1 : qAsConst(m_injuryPlace1))
{
rb = new QRadioButton(ProjectDataManagement::trSanitationInjuryPlace1Name(injuryplace1.name()), this);
m_bgBodypart->addButton(rb, injuryplace1.id());
m_ui->gbBodyPart->layout()->addWidget(rb);
}
// Add Spacer at the end
item = new QSpacerItem(2,2,QSizePolicy::Minimum, QSizePolicy::MinimumExpanding);
m_ui->gbBodyPart->layout()->addItem(item);
//Now add Sides
m_bgSide = new QButtonGroup(this);
for (const auto &injuryplace2 : qAsConst(m_injuryPlace2))
{
rb = new QRadioButton(ProjectDataManagement::trSanitationInjuryPlace2Name(injuryplace2.name()), this);
m_bgSide->addButton(rb, injuryplace2.id());
m_ui->gbSide->layout()->addWidget(rb);
}
//Spacer at the end
item = new QSpacerItem(2,2,QSizePolicy::Minimum, QSizePolicy::MinimumExpanding);
m_ui->gbSide->layout()->addItem(item);
connect(m_bgInjury, QOverload<int>::of(&QButtonGroup::buttonClicked), this, &ParticipantSetInjuryDialog::checkRadioStatesBody);
connect(m_bgBodypart, QOverload<int>::of(&QButtonGroup::buttonClicked), this, &ParticipantSetInjuryDialog::checkRadioStatesSides);
// connect(m_bgSide, QOverload<int>::of(&QButtonGroup::buttonClicked), this, &ParticipantSetInjuryDialog::checkState);
}
void ParticipantSetInjuryDialog::setOldData(const DynamicParticipantData &data)
{
if (data.stateHistory().size() == 0)
return;
const StateInformation &lastState = m_dtc->youngestStateInformation(data.stateHistory());
//Todo Set last Stuff
//uint32_t bits = lastState.vulnerabilityBits();
int index = m_ui->cbState->findData(lastState.vulnerabilityState().underlying());
DEBUG_LOG(m_logger) << "Old vulnerability state = " << index;
if (index > 0)
m_ui->cbState->setCurrentIndex(index);
}
uint32_t ParticipantSetInjuryDialog::getInjuryBit()
{
// VBA san = ((injury*16 + bodypart) * 4 + side) + 2048
int side = m_bgSide->button(1)->isEnabled() ? m_bgSide->checkedId() : 0;
DEBUG_LOG(m_logger) << "getInjuryBit() -------------- ";
DEBUG_LOG(m_logger) << "Injury = " << m_bgInjury->checkedId();
DEBUG_LOG(m_logger) << "Body = " << m_bgBodypart->checkedId();
DEBUG_LOG(m_logger) << "Side = " << side;
return (((((m_bgInjury->checkedId() * 16) + m_bgBodypart->checkedId()) * 4) + side) + 2048);
}
//slots
void ParticipantSetInjuryDialog::checkRadioStatesBody()
{
resetRadioStates();
bool firstAvailable = true;
for (const ProjectDataManagement::SanitationInjury& injury : qAsConst(m_injuries))
{
if (injury.kind() == m_bgInjury->checkedId())
{
if (firstAvailable)
{
m_bgBodypart->button(injury.place1())->setChecked(true);
firstAvailable = false;
}
m_bgBodypart->button(injury.place1())->setEnabled(true);
}
}
checkRadioStatesSides();
}
void ParticipantSetInjuryDialog::checkRadioStatesSides()
{
resetRadioStates(true);
for (const ProjectDataManagement::SanitationInjury& injury : qAsConst(m_injuries))
{
if (injury.kind() == m_bgInjury->checkedId() && injury.place1() == m_bgBodypart->checkedId())
m_bgSide->button(injury.place2())->setEnabled(true);
}
if(!m_bgSide->button(1)->isEnabled())
m_bgSide->button(0)->setChecked(true);
else
m_bgSide->button(1)->setChecked(true);
checkState();
}
void ParticipantSetInjuryDialog::checkState()
{
QSignalBlocker(m_ui->cbState);
m_ui->cbState->clear();
//Vulnerability
//m_ui->cbState->addItem(tr("No Change"), -1);
if (m_bgBodypart->checkedId() == 0 || m_bgInjury->checkedId() == 0)
{
m_ui->cbState->setEnabled(false);
return;
}
const QString &lightDamage = tr("Minor"); //toString(ProjectDataManagement::VulnerabilityState::LightDamage, ProjectDataManagement::VulnerabilityClass::SoldierInjuries);
const QString &mediumDamage = tr("Middle"); //toString(ProjectDataManagement::VulnerabilityState::MediumDamage, ProjectDataManagement::VulnerabilityClass::SoldierInjuries);
const QString &heavyDamage = tr("Serious"); //toString(ProjectDataManagement::VulnerabilityState::HeavyDamage, ProjectDataManagement::VulnerabilityClass::SoldierInjuries);
for (const ProjectDataManagement::SanitationInjury& injury : qAsConst(m_injuries))
{
if (injury.kind() == m_bgInjury->checkedId() && injury.place1() == m_bgBodypart->checkedId() && injury.place2() == m_bgSide->checkedId())
{
switch (injury.vbg())
{
case 1:
{
if (m_ui->cbState->findData(ProjectDataManagement::VulnerabilityState_def::LightDamage) < 1)
m_ui->cbState->addItem(lightDamage, ProjectDataManagement::VulnerabilityState_def::LightDamage);
break;
}
case 2:
{
if (m_ui->cbState->findData(ProjectDataManagement::VulnerabilityState_def::MediumDamage) < 1)
m_ui->cbState->addItem(mediumDamage, ProjectDataManagement::VulnerabilityState_def::MediumDamage);
break;
}
case 3:
{
if (m_ui->cbState->findData(ProjectDataManagement::VulnerabilityState_def::HeavyDamage) < 1)
m_ui->cbState->addItem(heavyDamage, ProjectDataManagement::VulnerabilityState_def::HeavyDamage);
break;
}
}
}
}
}
void ParticipantSetInjuryDialog::resetRadioStates(bool onlySides)
{
if (!onlySides)
{
QList<QAbstractButton *> tList = m_bgBodypart->buttons();
auto cb = tList.begin();
while (cb != tList.end())
{
auto *cbBody = *cb;
cbBody->setEnabled(false);
cb++;
}
//m_ui->bodyNone->setChecked(true);
}
QList<QAbstractButton *> sList = m_bgSide->buttons();
auto cbS = sList.begin();
while( cbS != sList.end())
{
auto *cbSide = *cbS;
cbSide->setEnabled(false);
cbS++;
}
//m_ui->sideNone->setChecked(true);
}
bool ParticipantSetInjuryDialog::apply()
{
if (m_ui->cbState->currentData().toInt() <= 0)
return false;
const ProjectDataManagement::VulnerabilityState state = static_cast<ProjectDataManagement::VulnerabilityState_def::type>(m_ui->cbState->currentData().toInt());
ModifyStateRequest req;
req.workstationId(LtsSessionData::LtsSessionData::getInstance()->getWorkstationId());
req.vulnerabilityState(state);
req.participantIds({m_participantId});
req.vulnerabilityKind(getInjuryBit());
DEBUG_LOG(m_logger) << "Saving vulnerability state = " << req.vulnerabilityState();
DEBUG_LOG(m_logger) << "Saving vulnerability kind = " << req.vulnerabilityKind();
return m_requestHelper->startSingleRequest([req, this]()
{
return m_ftc->modifyStateRequest(req, this);
});
}
} //namespace ParticipantManagement