Files
qt5-legatus-legacy/Lts/Plugins/ProjectDataManagement/Gui/PdmChargeTable/charge_table_model.h
T
2026-08-13 18:33:10 +02:00

199 lines
5.0 KiB
C++
Executable File

/**
* @RDE_HEADER@
* HMI Plugin for OperatorManagement - Operator Overview Dialog Model
* $Id$
* $HeadURL$
* $Author$
* Created by Christian Ehrlicher, SLSE, 2016-02-29
*/
#pragma once
#include <ProjectDataManagement/pdm_dtc.h>
#include <ProjectDataManagement/logger.h>
#include <LtsWidgets/lts_abstract_table_model.h>
#include <QSet>
namespace ProjectDataManagement
{
inline uint qHash(GearClass gc)
{
return ::qHash(gc.underlying());
}
// --------------------------------------------------------
// OperatorManagementModel
// --------------------------------------------------------
class /* OPMCHANGEPASSWORDGUI_EXPORT*/ ChargeTableDialogModel final : public LtsWidgets::LtsAbstractTableModel<ProjectDataManagement::ChargeType>
{
Q_OBJECT
public:
enum Columns
{
Id,
IsVisible,
PredefinedName,
ShortName,
LongName,
DirectImpact,
TopAttack,
BurstOfFire,
AirBurst,
Unarmed,
ShortTime,
FireAndForget,
ShortTimeScanning,
DisEntity
};
enum Offsets
{
None = 0,
Grandparent = 0,
ShortTimeChild1 = 1500,
ShortTimeChild2 = 1600,
ShortTimeChild3 = 1700,
ShortTimeChild4 = 1800,
ShortTimeChild5 = 1900,
DirectImpactGrandparent = 0,
TopAttackGrandparent = 0,
DirectImpactChild = 1000,
TopAttackChild = 1000,
BurstOfFireParent = 2000,
BurstOfFireChild = 3000,
AirBurstParent = 4000,
AirBurstChild = 5000,
UnarmedParent = 6000,
UnarmedChild = 7000,
FireAndForgetParent = 10000,
FireAndForgetChild = 11000,
ShortTimeScanningParent = 20000,
ShortTimeScanningChild = 21000
};
explicit ChargeTableDialogModel(bool isOrganiser, QObject *parent = nullptr);
~ChargeTableDialogModel();
bool initModel(const std::shared_ptr<ProjectDataManagement::Interface::Dtc> &dtc, const QSet<GearClass> &gearClasses = {GearClass::DuelSim});
QVariant data(const QModelIndex &, int) const override final;
bool setData(const QModelIndex &idx, const QVariant &value, int role = Qt::EditRole) override final;
Qt::ItemFlags flags(const QModelIndex &index) const override final
{
Qt::ItemFlags flags(LtsWidgets::LtsAbstractTableModel<ProjectDataManagement::ChargeType>::flags(index));
switch (index.column())
{
case IsVisible:
case DirectImpact:
case TopAttack:
case AirBurst:
case BurstOfFire:
case Unarmed:
case ShortTime:
case ShortTimeScanning:
case FireAndForget:
flags.setFlag(Qt::ItemIsUserCheckable);
break;
default:
break;
}
return flags;
}
QVector<ChargeType> getChargeTypesWithChangedVisibility() const;
bool isFiltered( const ProjectDataManagement::ChargeType &data, DataModification modType ) const override;
QSet<int> selectedCharges() const;
template<typename T>
bool setValues(const T &uleisCodes, bool includeChildren = false)
{
m_visibleCharges.clear();
if (includeChildren && !m_isOrganiser)
{
std::vector<int> inclusive = chargesIncludingChildren(uleisCodes);
for (auto val : inclusive)
m_visibleCharges.insert(val);
}
else
{
for (auto val : uleisCodes)
{
m_visibleCharges.insert(val);
}
}
emit dataChanged(index(0, 0), index(m_vecData.size()-1, columnCount()-1));
return true;
}
template<typename T>
static std::vector<int> chargesIncludingChildren(const T &parentalCharges)
{
std::vector<int> retVal;
for (auto val : parentalCharges)
{
if (val < 1000)
retVal.push_back(val);
else if (val > 3000)
continue;
if (val >= 47 && val <= 76)
{
for (const auto &type : ALL_TAS)
retVal.push_back(type + val);
}
else if (val > 2000 && val < 3000)
{
for (const auto &type : ALL_ULEIS)
retVal.push_back(type + val);
}
}
return retVal;
}
static bool isBaseCharge(int type) { return (type < 1000 || (type > 2000 && type < 3000));}
static int baseCharge(int chargeTypeId);
template<typename T>
static int chargeCountBaseCharges(const T &chargeTypes)
{
QSet<int> tmp;
for (int type : chargeTypes)
tmp.insert(baseCharge(type));
return tmp.size();
}
signals:
void chargeVisibilityChanged(bool hasChanges);
private:
bool isFiltered(int chargeTypeId) const;
private:
std::shared_ptr<ProjectDataManagement::Interface::Dtc> m_dtc;
// For not always decoding JSON Properties, store temp visibility seperately:
QSet<int> m_visibleCharges;
// Charge type ids, whose Visibility changed:
QSet<int> m_differences;
QSet<GearClass> m_gearClasses;
bool m_isOrganiser;
LOGGER_T m_logger;
static const QVector<int> ALL_ULEIS;
static const QVector<int> ALL_TAS;
// We could store all ChargeTypes by ULEIS Code in a seperate map.
// Then, we could put names/DIS/data to the respective column if a Code >3000 is defined.
// Nevertheless, the row data copy is the master. But that's only altered in organiser mode.
};
} // namespace ProjectDataManagement