/** * @RDE_HEADER@ * AreaEffectManangement - Aes Item Overview Dialog Model Base Class to be inherited by the Area Types * $Id$ * $HeadURL$ * $Author$ * * Created by Malte Diers, SLSE, 2016-09-26 */ #include "aes_base_model.h" #include #include #include #include #include #include #include #include namespace AreaEffectSimulation { // // AesGuiBasHelpers // AesGuiBasHelpers::AesGuiBasHelpers() : m_aesDtc(nullptr) , m_pdmDtc(nullptr) , m_ppmDtc(nullptr) , m_logger(getLogger("AesGuiBase")) {} bool AesGuiBasHelpers::initModel(LtsSession::LtsSession *session) { if (m_aesDtc) { ERROR_LOG(m_logger) << "double init()!"; return false; } if (!session->getDtc(m_aesDtc)) return false; if (!session->getDtc(m_pdmDtc)) return false; if (!session->getDtc(m_ppmDtc)) return false; session->getForeignGuiInterface(m_ppmGuiCbxIfc); return true; } QVariant AesGuiBasHelpers::stringFromPartyId(const dds::core::optional &id) const { if (!id.is_set()) return QObject::tr("---"); auto it = m_partyNames.find(id.get()); if (it != m_partyNames.end()) return it.value(); const QString name = ParticipantManagement::trPartyName(m_ppmDtc->party(id.get()).name()); m_partyNames.insert(id.get(), name); return name; } QIcon AesGuiBasHelpers::iconFromPartyId(const dds::core::optional &id) const { if (!id.is_set() || !m_ppmGuiCbxIfc) return QIcon(); auto it = m_partyIcons.find(id.get()); if (it != m_partyIcons.end()) return it.value(); const QRgb col = QRgb(m_ppmDtc->party(id.get()).color()); const QIcon icon = m_ppmGuiCbxIfc->pixmapFromParty(col); m_partyIcons.insert(id.get(), icon); return icon; } QVariant AesGuiBasHelpers::hierarchyFromParticipantId(const dds::core::optional &id) const { if (!id.is_set()) return QObject::tr("---"); auto it = m_participantHierarchy.find(id.get()); if (it != m_participantHierarchy.end()) return it.value(); const QString name = m_ppmDtc->hierarchyFromParticipant(id.get()); m_participantHierarchy.insert(id.get(), name); return name; } QVariant AesGuiBasHelpers::chargeTypeName(int chargeTypeId, bool shortName) const { if (shortName) { auto it = m_chargeTypeShortNames.find(chargeTypeId); if (it != m_chargeTypeShortNames.end()) return it.value(); const QString name = m_pdmDtc->trChargeTypeShortName(chargeTypeId, true); m_chargeTypeShortNames.insert(chargeTypeId, name); return name; } auto it = m_chargeTypeNames.find(chargeTypeId); if (it != m_chargeTypeNames.end()) return it.value(); const QString name = m_pdmDtc->trChargeTypeName(chargeTypeId, true); m_chargeTypeNames.insert(chargeTypeId, name); return name; } QString AesGuiBasHelpers::simulationTypeText(bool isCentral) { return isCentral ? QObject::tr("central") : QObject::tr("peripheral"); } void AesGuiBasHelpers::updateEffectStateComboboxFilterData(bool bWithPause) { LtsWidgets::ComboboxFilterContent cfc; LtsWidgets::ComboboxFilterData cfd; const auto effectStates = { AesEffectState::EsExpired, AesEffectState::EsCreated, AesEffectState::EsPrepared, AesEffectState::EsActivated, AesEffectState::EsPaused, AesEffectState::EsFired, AesEffectState::EsReceived }; for (const auto es : effectStates) { if (!bWithPause && es == AesEffectState::EsPaused) continue; cfd.data = es; cfd.text = AreaEffectSimulation::toString(es); cfc.data.push_back(cfd); } cfc.sortItems = false; m_cbxFilterEffectState = cfc.toVariant(); } void AesGuiBasHelpers::updateComboboxFilterData(const QSet &availablePartyIds, const QSet &availabelChargeIds) { LtsWidgets::ComboboxFilterContent cfc; LtsWidgets::ComboboxFilterData cfd; for (const int i : qAsConst(availabelChargeIds)) { cfd.data = i; cfd.text = chargeTypeName(i).toString(); cfc.data.push_back(cfd); } cfc.sortItems = true; m_cbxFilterChargeType = cfc.toVariant(); cfc.data.clear(); for (const int i : qAsConst(availablePartyIds)) { cfd.data = i; cfd.text = ParticipantManagement::trPartyName(m_ppmDtc->party(i).name()); cfd.icon = iconFromPartyId(i); cfc.data.push_back(cfd); } cfc.sortItems = false; m_cbxFilterParty = cfc.toVariant(); } void AreaEffectSimulation::AesGuiBasHelpers::updateSimulationTypeComboboxFilterData() { LtsWidgets::ComboboxFilterContent cfc; LtsWidgets::ComboboxFilterData cfd; cfd.text = simulationTypeText(true); cfd.data = cfd.text; cfc.data.push_back(cfd); cfd.text = simulationTypeText(false); cfd.data = cfd.text; cfc.data.push_back(cfd); cfc.sortItems = false; m_cbxFilterSimulationType = cfc.toVariant(); } void AesGuiBasHelpers::fillAvailableChargeIds(ProjectDataManagement::GearClass gc) { m_availableChargeIds.clear(); const QVector availableCharges = m_pdmDtc->chargesForGearClass(gc); for (const auto &charge : availableCharges) m_availableChargeIds += charge.id(); // enable filter although no charges for this type are available if (m_availableChargeIds.isEmpty()) m_availableChargeIds += 0; } void AesGuiBasHelpers::fillAvailableChargeIds(const QVector &gcs) { m_availableChargeIds.clear(); for (auto gc : qAsConst(gcs)) { const QVector &availableCharges = m_pdmDtc->chargesForGearClass(gc); for (const auto &charge : qAsConst(availableCharges)) m_availableChargeIds += charge.id(); } // enable filter although no charges for this type are available if (m_availableChargeIds.isEmpty()) m_availableChargeIds += 0; } // // AesItemSortFilterProxyModel // AesItemSortFilterProxyModel::AesItemSortFilterProxyModel(LtsSession::LtsSession *session, QObject *parent) : LtsWidgets::LtsColumnFilterProxyModel(parent) , m_session(session) , m_showExpired(false) , m_offset(5 * 60 * 1000) // default: 5 minutes { std::shared_ptr ppmDtc; if (m_session->getDtc(ppmDtc)) { auto cb = [this](const ParticipantManagement::Party &party) { m_partyColors[party.id()] = QColor::fromRgb(QRgb(party.color())); }; ppmDtc->partys(cb); } } void AesItemSortFilterProxyModel::setShowExpired(bool showExpired) { if (m_showExpired == showExpired) return; m_showExpired = showExpired; invalidateFilter(); } void AesItemSortFilterProxyModel::setOffset(int offsetMsecs) { if (m_offset == offsetMsecs) return; m_offset = offsetMsecs; invalidateFilter(); } bool AesItemSortFilterProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const { bool bRet = checkFilter(source_row); if (!bRet) return false; return LtsWidgets::LtsColumnFilterProxyModel::filterAcceptsRow(source_row, source_parent); } bool AesItemSortFilterProxyModel::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const { if (source_left.column() != source_right.column()) return LtsWidgets::LtsColumnFilterProxyModel::lessThan(source_left, source_right); switch (source_left.column()) { case AesGuiBasHelpers::BcEffectStart: { const auto effectStartLeft = aesEffectStart(source_left.row()); const auto effectStartRight = aesEffectStart(source_right.row()); if (effectStartLeft.is_set() && effectStartRight.is_set()) return effectStartLeft.get() < effectStartRight.get(); if (effectStartRight.is_set()) return true; if (effectStartLeft.is_set()) return false; return aesId(source_left.row()) < aesId(source_right.row()); } case AesGuiBasHelpers::BcEffectDuration: { const auto effectDurationLeft = aesEffectDuration(source_left.row()); const auto effectDurationRight = aesEffectDuration(source_right.row()); if (effectDurationLeft == effectDurationRight) return aesId(source_left.row()) < aesId(source_right.row()); return effectDurationLeft < effectDurationRight; } case AesGuiBasHelpers::BcEffectState: { const auto effectStateLeft = aesEffectStateId(source_left.row()); const auto effectStateRight = aesEffectStateId(source_right.row()); if (effectStateLeft == effectStateRight) return aesId(source_left.row()) < aesId(source_right.row()); return effectStateLeft < effectStateRight; } case AesGuiBasHelpers::BcEffectSource: { const auto effectSourceLeft = aesEffectSourceId(source_left.row()); const auto effectSourceRight = aesEffectSourceId(source_right.row()); if (effectSourceLeft == effectSourceRight) return aesId(source_left.row()) < aesId(source_right.row()); return effectSourceLeft < effectSourceRight; } case AesGuiBasHelpers::BcParty: { const auto partyIdLeft = partyId(source_left.row()); const auto partyIdRight = partyId(source_right.row()); if (partyIdLeft == partyIdRight) return aesId(source_left.row()) < aesId(source_right.row()); return partyIdLeft < partyIdRight; } default: break; } return LtsWidgets::LtsColumnFilterProxyModel::lessThan(source_left, source_right); } bool AesItemSortFilterProxyModel::checkFilter(int source_row) const { int32_t party = partyId(source_row); if (party != -1 && !LtsSessionData::LtsSessionData::getInstance()->isVisibleParty(m_session->exerciseId(), party)) return false; const auto effectStateId = aesEffectStateId(source_row); if (effectStateId == AesEffectState_def::EsRemoved) return false; // If showExpired: Show all if (showExpired()) return true; const int id = aesId(source_row); if (id <= 0) return false; // If MA is not in state expired: Show if (effectStateId != AreaEffectSimulation::AesEffectState::EsExpired && effectStateId != AreaEffectSimulation::AesEffectState::EsRemoved) return true; if (!m_session) { // Todo: Log return false; } const auto effectStart = aesEffectStart(source_row); qint64 effectEnd = 0; if (effectStart.is_set()) effectEnd = effectStart.get() + aesEffectDuration(source_row); // Expired. Show only if younger than m_offset if (effectStart.is_set() && effectEnd + m_offset > m_session->partitionTime()) return true; return false; } } // namespace AreaEffectSimulation