/** * @RDE_HEADER@ * GUI Plugin for ParticipantManagement - ParticipantConfigDialog * $Id$ * $HeadURL$ * $Author$ * Created by Patric Karwat, SLSE, 2016-06-13 */ #include "participant_config_dialog.h" #include "ui_participant_config_dialog.h" #include #include #include #include #include namespace ParticipantManagement { int ParticipantConfigDialog::s_preselectedParty = -1; ParticipantConfigDialog::ParticipantConfigDialog(int ddsId, DialogType type, QWidget *parent) : LtsWidgets::LtsDialog(parent, LtsWidgets::ButtonCombination::OkApplyCancel) , m_dialogType(type) , m_ddsId(ddsId) , m_typeClass(TypeClass::Human) , m_model(nullptr) , m_maxChars(80) , m_eqId(0) , m_dtc(nullptr) , m_ftc(nullptr) , m_pdmGuiIfc(nullptr) , m_ppmCbxIfc(nullptr) , m_stateChanged(false) , m_modeChanged(false) , m_windowTitle(tr("Set Participant Status")) , m_requestHelper(new LtsUtils::RequestHelper(this)) , m_ui(new Ui::ParticipantConfigDialog) , m_isTarget(false) , m_logger(getLogger("ParticipantConfigDialog")) { m_ui->setupUi(this); connect(m_ui->cbStatus, &LtsWidgets::LtsComboBox::currentTextChanged, this, &ParticipantConfigDialog::onStateAreaChanged); connect(m_ui->cbResetGearCharge, &QCheckBox::toggled, this, &ParticipantConfigDialog::onStateAreaChanged); connect(m_ui->cbResetManipulation, &QCheckBox::toggled, this, &ParticipantConfigDialog::onStateAreaChanged); connect(m_ui->cbResetMedSupplies, &QCheckBox::toggled, this, &ParticipantConfigDialog::onStateAreaChanged); connect(m_ui->teMail, &QPlainTextEdit::textChanged, this, &ParticipantConfigDialog::onTextChanged); connect(m_ui->cbLanguage, &LtsWidgets::LtsComboBox::currentTextChanged, this, &ParticipantConfigDialog::onModeChanged); connect(m_ui->cbCheating, &LtsWidgets::LtsComboBox::currentTextChanged, this, &ParticipantConfigDialog::onModeChanged); connect(m_ui->cbPersonalProtection, &LtsWidgets::LtsComboBox::currentTextChanged, this, &ParticipantConfigDialog::onModeChanged); connect(m_ui->cbProtectionLevel, &LtsWidgets::LtsComboBox::currentTextChanged, this, &ParticipantConfigDialog::onModeChanged); connect(m_ui->cbGrenadeSearchMode, &LtsWidgets::LtsComboBox::currentTextChanged, this, &ParticipantConfigDialog::onModeChanged); connect(m_ui->cbInternationalMode, &LtsWidgets::LtsComboBox::currentTextChanged, this, &ParticipantConfigDialog::onModeChanged); connect(m_ui->cbABCProtectionMode, &LtsWidgets::LtsComboBox::currentTextChanged, this, &ParticipantConfigDialog::onModeChanged); connect(m_ui->cbVest, &LtsWidgets::LtsComboBox::currentTextChanged, this, &ParticipantConfigDialog::onModeChanged); connect(m_ui->cbHelmet, &LtsWidgets::LtsComboBox::currentTextChanged, this, &ParticipantConfigDialog::onModeChanged); connect(m_ui->slDecontamination, &QSlider::valueChanged, this, [this](int value) { changeLabelText(m_ui->lbDecontamination, value); }); connect(m_ui->slMaintenance, &QSlider::valueChanged, this, [this](int value) { changeLabelText(m_ui->lbMaintenance, value); }); connect(m_ui->slMedical, &QSlider::valueChanged, this, [this](int value) { changeLabelText(m_ui->lbMedical, value); }); connect(m_ui->tvParticipants, &QTreeView::clicked, this, [this]() { retranslate(); }); setUnchangeable(true); connect(this, &ParticipantConfigDialog::signalChangesReset, this, [this]() { m_buttonBox->getButton(LtsWidgets::DialogButton::Ok)->setEnabled(true); m_buttonBox->getButton(LtsWidgets::DialogButton::Apply)->setEnabled(true); }); m_buttonBox->getButton(LtsWidgets::DialogButton::Ok)->setEnabled(true); m_buttonBox->getButton(LtsWidgets::DialogButton::Apply)->setEnabled(true); connect(m_ui->cbParty, static_cast(&LtsWidgets::LtsComboBox::currentIndexChanged), this, &ParticipantConfigDialog::slotPartyChanged); connect(m_ui->cbAll, &QCheckBox::toggled, this, &ParticipantConfigDialog::slotPartyChanged); // maybe Add Icon? m_buttonBox->getButton(LtsWidgets::DialogButton::Ok)->setText(tr("Send and Close")); m_buttonBox->getButton(LtsWidgets::DialogButton::Apply)->setText(tr("Send")); m_ui->lblCharsLeft->setText(tr("Characters left: %1").arg(m_maxChars)); QFontMetricsF fm(m_ui->lblCharsLeft->font()); m_ui->lblCharsLeft->setFixedWidth(fm.width(m_ui->lblCharsLeft->text())); const bool bEnableProtectionLevel = LtsUtils::ProjectSettings::isFunctionEnabled(QStringLiteral("ParticipantStatus"), QStringLiteral("ProtectionLevel")); m_ui->lbProtectionLevel->setVisible(bEnableProtectionLevel); m_ui->cbProtectionLevel->setVisible(bEnableProtectionLevel); const bool bEnablePersonalProtection = LtsUtils::ProjectSettings::isFunctionEnabled(QStringLiteral("ParticipantStatus"), QStringLiteral("PersonalProtection")); m_ui->cbPersonalProtection->setVisible(bEnablePersonalProtection); m_ui->lbPersonalProtection->setVisible(bEnablePersonalProtection); const bool bEnableCheatingCheck = LtsUtils::ProjectSettings::isFunctionEnabled(QStringLiteral("ParticipantStatus"), QStringLiteral("CheatingCheck")); m_ui->cbCheating->setVisible(bEnableCheatingCheck); m_ui->lbCheating->setVisible(bEnableCheatingCheck); const bool bHgrSearchMode = LtsUtils::ProjectSettings::isFunctionEnabled(QStringLiteral("ParticipantStatus"), QStringLiteral("HgrSearchMode")); m_ui->lbGrenadeSearchMode->setVisible(bHgrSearchMode); m_ui->cbGrenadeSearchMode->setVisible(bHgrSearchMode); const bool showPvSan = LtsUtils::ProjectSettings::isFunctionEnabled(QStringLiteral("ParticipantInformation"), QStringLiteral("HasPvSan")); m_ui->cbVitality->setVisible(showPvSan); m_ui->lblVitality->setVisible(showPvSan); m_ui->cbResetMedSupplies->setVisible(showPvSan); if (m_dialogType == DialogType::Config) setOnlineHelpFilename(QStringLiteral("Situation-Set_Participant_Status")); else if (m_dialogType == DialogType::ConfigMulti) setOnlineHelpFilename(QStringLiteral("Situation-Set_Participant_Status_Multi")); else setOnlineHelpFilename(QStringLiteral("Situation-Send_Participant_Message")); bool showABCProtectionMode = strcmp(PROJECTBUILD, "commaster") == 0 ? true : false; m_ui->cbABCProtectionMode->setVisible(showABCProtectionMode); m_ui->lbABCProtectionMode->setVisible(showABCProtectionMode); } ParticipantConfigDialog::~ParticipantConfigDialog() { delete m_ui; } void ParticipantConfigDialog::retranslate() { QString id; if (m_eqId > 0) id = QString::number(m_eqId); else if (m_ui->tvParticipants && m_ui->tvParticipants->selectionModel()) { QModelIndexList idxList = m_ui->tvParticipants->selectionModel()->selectedIndexes(); if (!idxList.isEmpty()) id = QString::number(m_model->data(idxList.first(), Qt::DisplayRole).toInt()); } QString title = m_windowTitle; if (!id.isEmpty()) title += QStringLiteral(": ") + id; translate(m_ui, title); fillCbx(); fillVitalityCbx(); fillCbxWithActualValue(); } bool ParticipantConfigDialog::init(LtsSession::LtsSession *session, const std::shared_ptr &dtc, const std::shared_ptr &ftc) { bool setCurrentValues = false; m_dtc = dtc; m_ftc = ftc; if (!m_dtc || !m_ftc) return false; m_dtc->enableParticipant(); m_dtc->enableParticipantMode(); m_dtc->enableDynamicParticipantData(); m_dtc->waitForHistoricalDataDynamicParticipantData(1000); m_dtc->waitForHistoricalDataParticipantMode(1000); m_dtc->waitForHistoricalDataParticipant(1000); if (!session->getForeignGuiInterface(m_pdmGuiIfc)) return false; if (!session->getForeignGuiInterface(m_ppmCbxIfc)) return false; fillVitalityCbx(); switch (m_dialogType) { case Config: m_ui->gbParticipants->hide(); setCurrentValues = true; Q_FALLTHROUGH(); case ConfigMulti: m_ui->gbMessage->hide(); break; case Message: m_ui->gbParticipants->hide(); setCurrentValues = true; Q_FALLTHROUGH(); case MessageMulti: m_ui->gbMode->hide(); m_ui->gbRes->hide(); m_ui->gbState->hide(); m_windowTitle = tr("Send Message"); m_uiRequirements->addRequirement({ m_ui->lblTextMailBold, [this]() { return (m_ui->teMail->toPlainText().size() > 0); }}); break; } if (m_ddsId > 0) { const Participant participant = m_dtc->participant(m_ddsId); if (participant.equipmentNumber().is_set()) m_eqId = participant.equipmentNumber().get(); if (!m_eqId && (m_dialogType == Config || m_dialogType == Message)) return false; m_typeClass = m_dtc->type(participant.typeId()).typeClass(); } else { m_eqId = 0; m_typeClass = TypeClass::Unknown; } m_stateChanged = false; if (m_typeClass != TypeClass::Human && m_ddsId > 0) { m_ui->cbHelmet->setHidden(true); m_ui->lbHelmet->setHidden(true); m_ui->cbVest->setHidden(true); m_ui->lbVest->setHidden(true); m_ui->cbPersonalProtection->setHidden(true); m_ui->lbPersonalProtection->setHidden(true); m_ui->cbProtectionLevel->setHidden(true); m_ui->lbProtectionLevel->setHidden(true); m_ui->cbGrenadeSearchMode->setHidden(true); m_ui->lbGrenadeSearchMode->setHidden(true); m_ui->lbInternationalMode->setHidden(true); m_ui->cbInternationalMode->setHidden(true); m_ui->lbABCProtectionMode->setHidden(true); m_ui->cbABCProtectionMode->setHidden(true); }else if (m_typeClass == TypeClass::Human && m_ddsId > 0) { m_maxChars = 16; m_ui->lblCharsLeft->setText(tr("Characters left: %1").arg(m_maxChars)); QFontMetricsF fm(m_ui->lblCharsLeft->font()); m_ui->lblCharsLeft->setFixedWidth(fm.width(m_ui->lblCharsLeft->text())); } if (m_dialogType == MessageMulti) { m_maxChars = 16; m_ui->lblCharsLeft->setText(tr("Characters left: %1").arg(m_maxChars)); QFontMetricsF fm(m_ui->lblCharsLeft->font()); m_ui->lblCharsLeft->setFixedWidth(fm.width(m_ui->lblCharsLeft->text())); } m_modeChanged = false; std::shared_ptr asbIfc; session->getForeignDataInterface(asbIfc); m_model = new ParticipantConfigModel(this, m_dtc, asbIfc); if (m_dialogType == DialogType::MessageMulti || m_dialogType == DialogType::ConfigMulti) { m_ui->tvParticipants->setModel(m_model); connect(m_ui->tvParticipants->selectionModel(), &QItemSelectionModel::selectionChanged, this, &ParticipantConfigDialog::onSelectionChanged); fillCbx(); if (setCurrentValues == true) fillCbxWithActualValue(); slotPartyChanged(); for (int column = 0; column < m_model->columnCount(); column++) m_ui->tvParticipants->resizeColumnToContents(column); } if (m_ddsId == 0) { auto cb = [this]() { if (m_ui->cbAll->isChecked()) return true; return !m_ui->tvParticipants->selectionModel()->selectedRows().isEmpty(); }; m_uiRequirements->addRequirement({ m_ui->lbParty, cb }); } // Target display: { const Participant participant = m_dtc->participant(m_ddsId); if (participant.equipmentNumber().is_set()) { const Type type = m_dtc->type(participant.typeId()); const EquipmentType eqType = m_dtc->equipmentType(type.equipmentTypeId()); if (eqType.wmsTypeClass() == WmsTypeClass::TargetHuman || eqType.wmsTypeClass() == WmsTypeClass::TargetVehicle) { NOTICE_LOG(m_logger) << "isTarget = true"; m_ui->gbMode->setHidden(true); m_ui->gbRes->setHidden(true); m_isTarget = true; } } //UAS if (m_dtc->isTypeUas(participant.typeId()) && m_ddsId > 0) { m_ui->cbResetManipulation->hide(); m_ui->cbResetGearCharge->hide(); m_ui->gbRes->hide(); m_ui->gbMode->hide(); } } const bool showPvSan = LtsUtils::ProjectSettings::isFunctionEnabled(QStringLiteral("ParticipantInformation"), QStringLiteral("HasPvSan")) && m_typeClass == TypeClass::Human; m_ui->cbVitality->setVisible(showPvSan); m_ui->lblVitality->setVisible(showPvSan); m_ui->cbResetMedSupplies->setVisible(showPvSan && m_typeClass == TypeClass::Human); return true; } //private void ParticipantConfigDialog::slotPartyChanged() { if (m_ui->cbAll->isChecked()) { m_ui->cbParty->setEnabled(false); m_ui->tvParticipants->setEnabled(false); m_model->resetModel(); } else { m_ui->cbParty->setEnabled(true); m_ui->tvParticipants->setEnabled(true); int curPartyId = m_ui->cbParty->currentData().toInt(); s_preselectedParty = curPartyId; m_model->onReinitModel(curPartyId); m_ui->tvParticipants->expandAll(); } } void ParticipantConfigDialog::onSelectionChanged() { const QModelIndexList currentlySelectedParticipants = m_ui->tvParticipants->selectionModel()->selectedIndexes(); //bool isPureHuman = true; for (const QModelIndex &index : currentlySelectedParticipants) { DEBUG_LOG(m_logger) << "setChildrenSelected row =" << index.row() << " column=" << index.column(); ParticipantManagement::ParticipantData data = m_model->getParticipantData(index); TypeClass tc = m_dtc->type(data.typeId()).typeClass(); if (tc != TypeClass::Human && tc != TypeClass::Unit) { //isPureHuman = false; break; } } m_ui->cbHelmet->setEnabled(true); m_ui->cbVest->setEnabled(true); m_ui->cbPersonalProtection->setEnabled(true); m_ui->cbProtectionLevel->setEnabled(true); m_ui->cbGrenadeSearchMode->setEnabled(true); m_ui->cbInternationalMode->setEnabled(true); m_ui->cbABCProtectionMode->setEnabled(true); } void ParticipantConfigDialog::fillCbx() { // Party (required by setting all participants) if (!m_ddsId) m_ppmCbxIfc->fillPartyComboBox(m_ui->cbParty); const int idx = m_ui->cbParty->findData(s_preselectedParty); if (idx >= 0) m_ui->cbParty->setCurrentIndex(idx); QSignalBlocker(m_ui->cbStatus); m_ui->cbStatus->clear(); //Vulnerability m_ui->cbStatus->addItem(tr("No Change"), -1); if ( m_isTarget) { m_ui->cbStatus->addItem(tr("CombatReady"), ProjectDataManagement::VulnerabilityState::CombatReady); m_ui->cbStatus->addItem(tr("Catastrophic Kill / Killed"), ProjectDataManagement::VulnerabilityState::CatastrophicKill); } else insertVulnerabilityStates(m_ui->cbStatus, m_typeClass); // Player language m_pdmGuiIfc->fillPlayerLanguageComboBox(m_ui->cbLanguage); // Player operation mode m_pdmGuiIfc->fillPlayerOperationModeComboBox(m_ui->cbCheating); // Player mode helmet m_pdmGuiIfc->fillPlayerModeHelmetComboBox(m_ui->cbHelmet); // Player mode vest m_pdmGuiIfc->fillPlayerModeVestComboBox(m_ui->cbVest); // Player personal Protection m_pdmGuiIfc->fillPlayerPersonalProtectionComboBox(m_ui->cbPersonalProtection); // Player protection level m_pdmGuiIfc->fillPlayerProtectionLevelComboBox(m_ui->cbProtectionLevel); // Player handgrenade search mode m_pdmGuiIfc->fillPlayerHandgrenadeSearchModeComboBox(m_ui->cbGrenadeSearchMode); m_pdmGuiIfc->fillPlayerInternationalModeComboBox(m_ui->cbInternationalMode); m_pdmGuiIfc->fillABCProtectionComboBox(m_ui->cbABCProtectionMode); } void ParticipantConfigDialog::fillVitalityCbx() { QSignalBlocker(m_ui->cbVitality); m_ui->cbVitality->disconnect(); m_ui->cbVitality->clear(); m_ui->cbVitality->addItem(tr("No Change"), 0); if (!m_dtc) return; bool setEnabled = false; if (m_dialogType == Config && m_dtc->type(m_dtc->participant(m_ddsId).typeId()).typeClass() == TypeClass::Human) setEnabled = true; switch (m_ui->cbStatus->currentData().toInt()) { case -1: { m_ui->cbVitality->setEnabled(false); break; } case ProjectDataManagement::VulnerabilityState::LightDamage: { for (int i = 90 ; i >= 70; i -= 10) m_ui->cbVitality->addItem(QString::number(i), i); break; } case ProjectDataManagement::VulnerabilityState::MediumDamage: { for (int i = 60 ; i >= 40; i -= 10) m_ui->cbVitality->addItem(QString::number(i), i); break; } case ProjectDataManagement::VulnerabilityState::HeavyDamage: { for (int i = 30 ; i >= 10; i -= 10) m_ui->cbVitality->addItem(QString::number(i), i); break; } case ProjectDataManagement::VulnerabilityState::CombatReady: { m_ui->cbVitality->removeItem(0); m_ui->cbVitality->addItem(QString::number(100), 100); setEnabled = false; //m_ui->cbVitality->setCurrentIndex(m_ui->cbVitality->findData(100)); break; } default: { setEnabled = false; break; } } connect(m_ui->cbVitality, static_cast(&LtsWidgets::LtsComboBox::currentIndexChanged), this, [this] { m_stateChanged = true; }); m_ui->cbVitality->setEnabled(setEnabled); } void ParticipantConfigDialog::setCbxForInitEnabled(bool enabled) { //fixup apache reset and reactivate #ifndef GUEZ_MODE if (enabled && m_ddsId > 0 ) { const Participant participant = m_dtc->participant(m_ddsId); const TypeClass tc = m_dtc->type(participant.typeId()).typeClass(); if (tc == TypeClass::Aircraft && m_ui->cbStatus->currentIndex() < 1) enabled = false; } #endif m_ui->cbResetGearCharge->setEnabled(enabled); m_ui->cbResetGearCharge->setCheckable(enabled); m_ui->cbResetManipulation->setEnabled(enabled); m_ui->cbResetManipulation->setCheckable(enabled); m_ui->cbResetMedSupplies->setCheckable(enabled); m_ui->cbResetMedSupplies->setEnabled(enabled); } void ParticipantConfigDialog::fillCbxWithActualValue() { if(m_eqId <= 0) return; int partId = m_dtc->participantIdByEquipmentNumber(m_eqId); ParticipantManagement::ParticipantMode mode = m_dtc->participantMode(partId); m_ui->cbHelmet->setCurrentIndex(m_ui->cbHelmet->findData(mode.modeHelmet().underlying())); m_ui->cbLanguage->setCurrentIndex(m_ui->cbLanguage->findData(mode.language().underlying())); m_ui->cbPersonalProtection->setCurrentIndex(m_ui->cbPersonalProtection->findData(mode.modePersonalProtection().underlying())); m_ui->cbProtectionLevel->setCurrentIndex(m_ui->cbProtectionLevel->findData(mode.protectionLevel().underlying())); m_ui->cbGrenadeSearchMode->setCurrentIndex(m_ui->cbGrenadeSearchMode->findData(mode.handgrenadeSearchMode().underlying())); m_ui->cbInternationalMode->setCurrentIndex(m_ui->cbInternationalMode->findData(mode.internationalMode().underlying())); m_ui->cbABCProtectionMode->setCurrentIndex(m_ui->cbABCProtectionMode->findData(mode.abcProtectionMode().underlying())); m_ui->cbVest->setCurrentIndex(m_ui->cbVest->findData(mode.modeVest().underlying())); m_modeChanged = false; m_ui->cbStatus->setCurrentIndex(0); m_ui->cbVitality->setCurrentIndex(0); std::vector< ParticipantManagement::StateInformation> stateHistory = m_dtc->dynamicParticipantData(partId).stateHistory(); if (stateHistory.size() > 0) { auto stateInfo = m_dtc->youngestStateInformation(stateHistory); int statusIndex = m_ui->cbStatus->findData(stateInfo.vulnerabilityState().underlying()); if(statusIndex != -1) m_ui->cbStatus->setCurrentIndex(statusIndex); int vitalityIndex = m_ui->cbVitality->findData(stateInfo.vitality()); if(vitalityIndex != -1) m_ui->cbVitality->setCurrentIndex(vitalityIndex); } } //Slots void ParticipantConfigDialog::onStateAreaChanged() { m_stateChanged = false; setCbxForInitEnabled(m_ui->cbStatus->currentIndex() < 2); fillVitalityCbx(); if (m_ui->cbStatus->currentIndex() == 0 && !m_ui->cbResetManipulation->isChecked() && !m_ui->cbResetMedSupplies->isChecked() && !m_ui->cbResetGearCharge->isChecked()) return; m_stateChanged = true; } bool ParticipantConfigDialog::apply() { bool bAll = m_ui->cbAll->isChecked(); // Which participant should be updated const std::set participantIdSet(bAll ? std::set({0}) : getParticipantIds()); if (participantIdSet.empty()) return false; const std::vector participantIds(participantIdSet.begin(), participantIdSet.end()); switch (m_dialogType) { case Config: case ConfigMulti: { if (!m_modeChanged && !m_stateChanged) return false; if (m_stateChanged) { if (m_ui->cbStatus->currentData().toInt() > 100) { OcCommandRequest req; // InitParticipantRequest req; req.action(m_ui->cbStatus->currentData().toInt() - 100); req.participantIds(participantIds); m_ftc->ocCommandRequest(req); } else { const ProjectDataManagement::VulnerabilityState state = static_cast(m_ui->cbStatus->currentData().toInt()); if (m_ui->cbStatus->currentIndex() == 1 || m_ui->cbResetGearCharge->isChecked() || m_ui->cbResetMedSupplies->isChecked() || m_ui->cbResetManipulation->isChecked()) // (1) Ready for action or button checked -> init { InitParticipantRequest req; req.workstationId(LtsSessionData::LtsSessionData::getInstance()->getWorkstationId()); req.restockCharges(m_ui->cbResetGearCharge->isChecked()); req.resetManipulation(m_ui->cbResetManipulation->isChecked()); req.resetVulnerabilityState(state == ProjectDataManagement::VulnerabilityState::CombatReady); req.restockSanitationMaterial(m_ui->cbResetMedSupplies->isChecked()); req.participantIds(participantIds); m_requestHelper->addRequest([req, this]() { return m_ftc->initParticipantRequest(req, this); }); } else //set new State { // Invalid enum value -1 if (m_ui->cbStatus->currentData().toInt() != -1 || m_ui->cbVitality->currentData().toInt() != 0) { ModifyStateRequest req; req.workstationId(LtsSessionData::LtsSessionData::getInstance()->getWorkstationId()); req.vulnerabilityState(state == ProjectDataManagement::VulnerabilityState::NoChange ? ProjectDataManagement::VulnerabilityState::CombatReady : state); req.participantIds(participantIds); req.vitality(m_ui->cbVitality->currentData().toInt()); if(req.vitality() > 0) //if we set the vitality directly send base kind for pvSan req.vulnerabilityKind(2048); m_requestHelper->addRequest([req, this]() { return m_ftc->modifyStateRequest(req, this); }); } } } } if (m_modeChanged) { ProjectDataManagement::LanguageConfiguration lang = static_cast(m_ui->cbLanguage->currentData().toInt()); ProjectDataManagement::OperationMode opMode = static_cast(m_ui->cbCheating->currentData().toInt()); ProjectDataManagement::WphMode helmet = static_cast(m_ui->cbHelmet->currentData().toInt()); ProjectDataManagement::WphMode vest = static_cast(m_ui->cbVest->currentData().toInt()); ProjectDataManagement::PersonalProtection personalProtection = static_cast(m_ui->cbPersonalProtection->currentData().toInt()); ProjectDataManagement::ProtectionLevel protectionLevel = static_cast(m_ui->cbProtectionLevel->currentData().toInt()); ProjectDataManagement::HandgrenadeSearchMode grenadeSearch; if(!m_ui->cbGrenadeSearchMode->isHidden()) { grenadeSearch = static_cast(m_ui->cbGrenadeSearchMode->currentData().toInt()); } else { grenadeSearch = ProjectDataManagement::HandgrenadeSearchMode::NoChange; } ProjectDataManagement::InternationalMode internationalMode = static_cast(m_ui->cbInternationalMode->currentData().toInt()); ProjectDataManagement::ABCProtectionMode abcProtectionMode = static_cast(m_ui->cbABCProtectionMode->currentData().toInt()); int reactDecontMinutes = m_ui->slDecontamination->value() * 10; int reactMaintenanceMinutes = m_ui->slMaintenance->value() * 10; int reactMedicMinutes = m_ui->slMedical->value() * 10; SetParticipantModeRequest req(lang, opMode, reactDecontMinutes, reactMaintenanceMinutes, reactMedicMinutes, vest, helmet, personalProtection, protectionLevel, grenadeSearch, internationalMode, abcProtectionMode, 0); for (int participantId : participantIds) { if(participantId != 0) { auto data = m_dtc->participant(participantId); TypeClass tc = m_dtc->type(data.typeId()).typeClass(); if (tc != TypeClass::Human) continue; } req.participantId(participantId); m_requestHelper->addRequest([req, this]() { return m_ftc->setParticipantModeRequest(req, this); }); } } break; } case Message: case MessageMulti: { SendMessageRequest req; req.message(m_ui->teMail->toPlainText().toStdString()); req.participantIds(participantIds); m_requestHelper->addRequest([req, this]() { return m_ftc->sendMessageRequest(req, this); }); break; } } //now start Requests bool ret = m_requestHelper->startRequests(); return ret; } void ParticipantConfigDialog::onTextChanged() { QString plainText(m_ui->teMail->toPlainText()); int currentUsedChars = plainText.toUtf8().size(); bool bNeedSetNew = false; while (currentUsedChars > m_maxChars) { plainText.chop(1); currentUsedChars = plainText.toUtf8().size(); bNeedSetNew = true; // do not set text directly, results in recursion } // if text longer than allowed if (bNeedSetNew) { m_ui->teMail->setPlainText(plainText); m_ui->teMail->moveCursor(QTextCursor::End); } int charsLeft = m_maxChars - currentUsedChars; if (charsLeft > 9) m_ui->lblCharsLeft->setText(tr("Characters left: %1").arg(QString::number(m_maxChars - currentUsedChars))); else m_ui->lblCharsLeft->setText(tr("Characters left: %1").arg(QString::number(m_maxChars - currentUsedChars))); } void ParticipantConfigDialog::changeLabelText(QLabel *label, int value) { switch (value) { case 0: label->setText(tr("No Change")); break; case 255: label->setText(tr("No Resurrection")); break; default: label->setText(QStringLiteral("%1 min").arg(value * 10)); break; } onModeChanged(); } void ParticipantConfigDialog::onModeChanged() { m_modeChanged = false; if (m_ui->cbLanguage->currentIndex() == 0 && m_ui->cbCheating->currentIndex() == 0 && m_ui->cbPersonalProtection->currentIndex() == 0 && m_ui->cbHelmet->currentIndex() == 0 && m_ui->cbProtectionLevel->currentIndex() == 0 && m_ui->cbGrenadeSearchMode->currentIndex() == 0 && m_ui->cbInternationalMode->currentIndex() == 0 && m_ui->cbABCProtectionMode->currentIndex() == 0 && m_ui->slDecontamination->value() == 0 && m_ui->slMaintenance->value() == 0 && m_ui->slMedical->value() == 0 ) return; m_modeChanged = true; } std::set ParticipantConfigDialog::getParticipantIds() const { if (m_ddsId) // single return {m_ddsId}; const QItemSelectionModel *selectionModel = m_ui->tvParticipants->selectionModel(); const QModelIndexList rows = selectionModel->selectedRows(); std::set ret; for (const QModelIndex &row : rows) { const auto c = getParticipantIds(row); for(auto id : c) { ret.insert(id); } } return ret; } QVector ParticipantConfigDialog::getParticipantIds(const QModelIndex &parent) const { QVector ret; const ParticipantManagement::ParticipantData dataParent(m_model->getParticipantData(parent)); if (dataParent.equipmentNumber().is_set()) ret.append(dataParent.id()); // if(dataParent.equipmentNumber().get() == m_eqId) // { // DEBUG_LOG(m_logger)<<" >>>>>> [SET PP STATUS] participantId: "<< dataParent.id()<<" for equipNumb: "<< dataParent.equipmentNumber(); // } const int rowCount = m_model->rowCount(parent); for (int row = 0; row < rowCount; ++row) { const QModelIndex childIndex = m_model->index(row, 0, parent); ret += getParticipantIds(childIndex); } return ret; } } // namespace ParticipantManagement