mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-03-22 23:05:36 +08:00
Ref T265, Ref T430, Ref T473 "supported parts" in model
* added part member * unified parsing from DB "CAircraftModel::fromDatabaseJsonBaseImpl"
This commit is contained in:
committed by
Mat Sutcliffe
parent
2d3e2e2d99
commit
ecb77191e5
@@ -17,6 +17,7 @@
|
||||
#include "blackmisc/statusmessage.h"
|
||||
#include "blackmisc/compare.h"
|
||||
#include "blackmisc/verify.h"
|
||||
#include "blackconfig/buildconfig.h"
|
||||
|
||||
#include <QJsonDocument>
|
||||
#include <QJsonObject>
|
||||
@@ -27,6 +28,7 @@
|
||||
#include <QStringBuilder>
|
||||
#include <QFileInfo>
|
||||
|
||||
using namespace BlackConfig;
|
||||
using namespace BlackMisc::Aviation;
|
||||
using namespace BlackMisc::PhysicalQuantities;
|
||||
using namespace BlackMisc::Db;
|
||||
@@ -53,6 +55,10 @@ namespace BlackMisc
|
||||
m_aircraftIcao(icao), m_livery(livery), m_modelString(model.trimmed().toUpper()), m_description(description.trimmed()), m_modelType(type)
|
||||
{}
|
||||
|
||||
CAircraftModel::CAircraftModel(const QString &model, CAircraftModel::ModelType type, const CSimulatorInfo &simulator, const QString &name, const QString &description) :
|
||||
m_simulator(simulator), m_modelString(model.trimmed().toUpper()), m_name(name.trimmed()), m_description(description.trimmed()), m_modelType(type)
|
||||
{ }
|
||||
|
||||
CAircraftModel::CAircraftModel(const QString &model, CAircraftModel::ModelType type, const CSimulatorInfo &simulator, const QString &name, const QString &description, const CAircraftIcaoCode &icao, const CLivery &livery) :
|
||||
m_aircraftIcao(icao), m_livery(livery), m_simulator(simulator), m_modelString(model.trimmed().toUpper()), m_name(name.trimmed()), m_description(description.trimmed()), m_modelType(type)
|
||||
{ }
|
||||
@@ -78,7 +84,8 @@ namespace BlackMisc
|
||||
obj.insert("name", this->getName());
|
||||
obj.insert("modelstring", QJsonValue(m_modelString));
|
||||
obj.insert("description", QJsonValue(m_description));
|
||||
obj.insert("version", QJsonValue(m_version));
|
||||
obj.insert("parts", QJsonValue(m_supportedParts));
|
||||
obj.insert("version", CBuildConfig::getVersionString());
|
||||
obj.insert("mode", QJsonValue(getModelModeAsString().left(1).toUpper())); // clazy:exclude=qstring-left
|
||||
if (m_cg.isNull())
|
||||
{
|
||||
@@ -228,6 +235,7 @@ namespace BlackMisc
|
||||
case IndexName: return CVariant(m_name);
|
||||
case IndexFileName: return CVariant(m_fileName);
|
||||
case IndexCG: return m_cg.propertyByIndex(index.copyFrontRemoved());
|
||||
case IndexSupportedParts: return CVariant(m_supportedParts);
|
||||
case IndexFileTimestamp: return CVariant::fromValue(this->getFileTimestamp());
|
||||
case IndexFileTimestampFormattedYmdhms: return CVariant::fromValue(this->getFormattedFileTimestampYmdhms());
|
||||
case IndexIconPath: return CVariant(m_iconPath);
|
||||
@@ -257,6 +265,7 @@ namespace BlackMisc
|
||||
case IndexName: m_name = variant.toQString(); break;
|
||||
case IndexIconPath: m_iconPath = variant.toQString(); break;
|
||||
case IndexCG: m_cg.setPropertyByIndex(index.copyFrontRemoved(), variant); break;
|
||||
case IndexSupportedParts: this->setSupportedParts(variant.toQString()); break;
|
||||
case IndexModelType: m_modelType = variant.value<ModelType>(); break;
|
||||
case IndexFileName: m_fileName = variant.toQString(); break;
|
||||
case IndexCallsign:
|
||||
@@ -315,6 +324,7 @@ namespace BlackMisc
|
||||
case IndexFileName: return m_fileName.compare(compareValue.getFileName(), Qt::CaseInsensitive);
|
||||
case IndexIconPath: return m_iconPath.compare(compareValue.getIconPath(), Qt::CaseInsensitive);
|
||||
case IndexCG: return m_cg.comparePropertyByIndex(index.copyFrontRemoved(), compareValue.getCG());
|
||||
case IndexSupportedParts: return m_supportedParts.compare(compareValue.getSupportedParts());
|
||||
case IndexModelTypeAsString:
|
||||
case IndexModelType: return Compare::compare(m_modelType, compareValue.getModelType());
|
||||
case IndexSimulatorInfoAsString:
|
||||
@@ -442,6 +452,11 @@ namespace BlackMisc
|
||||
return distributors.matchesAnyKeyOrAlias(m_distributor.getDbKey());
|
||||
}
|
||||
|
||||
void CAircraftModel::setSupportedParts(const QString &supportedParts)
|
||||
{
|
||||
m_supportedParts = CAircraftModel::cleanUpPartsString(supportedParts);
|
||||
}
|
||||
|
||||
bool CAircraftModel::matchesMode(ModelModeFilter mode) const
|
||||
{
|
||||
if (mode == All) { return true; }
|
||||
@@ -787,6 +802,14 @@ namespace BlackMisc
|
||||
if (details) { validationMsgs.push_back(equalMessage(equal, *this, QStringLiteral("mode"), dbModel.getModelModeAsString(), this->getModelModeAsString())); }
|
||||
changed |= !equal;
|
||||
|
||||
equal = dbModel.getCG() == this->getCG();
|
||||
if (details) { validationMsgs.push_back(equalMessage(equal, *this, QStringLiteral("CG"), dbModel.getCG().toQString(true), this->getCG().toQString(true))); }
|
||||
changed |= !equal;
|
||||
|
||||
equal = dbModel.getSupportedParts() == this->getSupportedParts();
|
||||
if (details) { validationMsgs.push_back(equalMessage(equal, *this, QStringLiteral("Supported parts"), dbModel.getSupportedParts(), this->getSupportedParts())); }
|
||||
changed |= !equal;
|
||||
|
||||
// clean messages
|
||||
if (changed && details)
|
||||
{
|
||||
@@ -856,57 +879,47 @@ namespace BlackMisc
|
||||
return i; // default
|
||||
}
|
||||
|
||||
CAircraftModel CAircraftModel::fromDatabaseJsonBaseImpl(const QJsonObject &json, const QString &prefix, const CAircraftIcaoCode &aircraftIcao, const CLivery &livery, const CDistributor &distributor)
|
||||
{
|
||||
const QString modelString(json.value(prefix % u"modelstring").toString());
|
||||
const QString modelDescription(json.value(prefix % u"description").toString());
|
||||
const QString modelName(json.value(prefix % u"name").toString());
|
||||
const QString modelMode(json.value(prefix % u"mode").toString());
|
||||
const QString parts(json.value(prefix % u"parts").toString());
|
||||
const QJsonValue cgjv = json.value(prefix % u"cgft");
|
||||
const CLength cg = cgjv.isNull() ? CLength::null() : CLength(cgjv.toDouble(), CLengthUnit::ft());
|
||||
|
||||
const CSimulatorInfo simInfo = CSimulatorInfo::fromDatabaseJson(json, prefix);
|
||||
CAircraftModel model(modelString, CAircraftModel::TypeDatabaseEntry, simInfo, modelName, modelDescription);
|
||||
model.setModelModeAsString(modelMode);
|
||||
model.setSupportedParts(parts);
|
||||
model.setCG(cg);
|
||||
model.setKeyVersionTimestampFromDatabaseJson(json, prefix);
|
||||
model.setDistributor(distributor);
|
||||
model.setAircraftIcaoCode(aircraftIcao);
|
||||
model.setLivery(livery);
|
||||
return model;
|
||||
}
|
||||
|
||||
CAircraftModel CAircraftModel::fromDatabaseJson(const QJsonObject &json, const QString &prefix)
|
||||
{
|
||||
static const QString prefixAircraftIcao("ac_");
|
||||
static const QString prefixLivery("liv_");
|
||||
static const QString prefixDistributor("dist_");
|
||||
const QString idDistributor = json.value(prefixDistributor % u"id").toString();
|
||||
const int idAircraftIcao = json.value(prefixAircraftIcao % u"id").toInt(-1);
|
||||
const int idLivery = json.value(prefixLivery % u"id").toInt(-1);
|
||||
|
||||
const QString modelString(json.value(prefix % u"modelstring").toString());
|
||||
const QString modelDescription(json.value(prefix % u"description").toString());
|
||||
const QString modelName(json.value(prefix % u"name").toString());
|
||||
const QString modelMode(json.value(prefix % u"mode").toString());
|
||||
|
||||
const CSimulatorInfo simInfo = CSimulatorInfo::fromDatabaseJson(json, prefix);
|
||||
CDistributor distributor(CDistributor::fromDatabaseJson(json, prefixDistributor));
|
||||
CAircraftIcaoCode aircraftIcao(CAircraftIcaoCode::fromDatabaseJson(json, prefixAircraftIcao));
|
||||
CLivery livery(CLivery::fromDatabaseJson(json, prefixLivery));
|
||||
|
||||
//! \todo KB 2018-08 "idaircrafticao" seem not to be used anymore (remove???) in "vAircraftModelDenormalized", but was used in "vAircraftModelComplete"
|
||||
if (!aircraftIcao.isLoadedFromDb())
|
||||
{
|
||||
const int idAircraftIcao = json.value(prefix % u"idaircrafticao").toInt(-1);
|
||||
if (idAircraftIcao >= 0)
|
||||
{
|
||||
aircraftIcao.setDbKey(idAircraftIcao);
|
||||
}
|
||||
}
|
||||
if (!aircraftIcao.isLoadedFromDb() && idAircraftIcao >= 0) { aircraftIcao.setDbKey(idAircraftIcao); }
|
||||
if (!livery.isLoadedFromDb() && idLivery >= 0) { livery.setDbKey(idLivery); }
|
||||
if (!distributor.isLoadedFromDb() && !idDistributor.isEmpty()) { distributor.setDbKey(idDistributor); }
|
||||
|
||||
if (!livery.isLoadedFromDb())
|
||||
{
|
||||
const int idLivery = json.value(prefix % u"idlivery").toInt(-1);
|
||||
if (idLivery >= 0)
|
||||
{
|
||||
livery.setDbKey(idLivery);
|
||||
}
|
||||
}
|
||||
|
||||
if (!distributor.isLoadedFromDb())
|
||||
{
|
||||
const QString idDistributor = json.value(prefix % u"iddistributor").toString();
|
||||
if (!idDistributor.isEmpty())
|
||||
{
|
||||
distributor.setDbKey(idDistributor);
|
||||
}
|
||||
}
|
||||
|
||||
CAircraftModel model(
|
||||
modelString, CAircraftModel::TypeDatabaseEntry, simInfo, modelName, modelDescription, aircraftIcao, livery
|
||||
);
|
||||
model.setDistributor(distributor);
|
||||
model.setModelModeAsString(modelMode);
|
||||
model.setKeyAndTimestampFromDatabaseJson(json, prefix);
|
||||
return model;
|
||||
// full model
|
||||
return CAircraftModel::fromDatabaseJsonBaseImpl(json, prefix, aircraftIcao, livery, distributor);
|
||||
}
|
||||
|
||||
CAircraftModel CAircraftModel::fromDatabaseJsonCaching(
|
||||
@@ -917,16 +930,10 @@ namespace BlackMisc
|
||||
static const QString prefixAircraftIcao("ac_");
|
||||
static const QString prefixLivery("liv_");
|
||||
static const QString prefixDistributor("dist_");
|
||||
|
||||
const QString modelString(json.value(prefix % u"modelstring").toString());
|
||||
const QString modelDescription(json.value(prefix % u"description").toString());
|
||||
const QString modelName(json.value(prefix % u"name").toString());
|
||||
const QString modelMode(json.value(prefix % u"mode").toString());
|
||||
|
||||
const CSimulatorInfo simInfo = CSimulatorInfo::fromDatabaseJson(json, prefix);
|
||||
const QString idDistributor = json.value(prefixDistributor % u"id").toString();
|
||||
const int idAircraftIcao = json.value(prefixAircraftIcao % u"id").toInt(-1);
|
||||
const int idLivery = json.value(prefixLivery % u"id").toInt(-1);
|
||||
const QString idDistributor = json.value(prefixDistributor % u"id").toString();
|
||||
|
||||
const bool cachedAircraftIcao = (idAircraftIcao >= 0) && aircraftIcaos.contains(idAircraftIcao);
|
||||
const bool cachedLivery = (idLivery >= 0) && liveries.contains(idLivery);
|
||||
const bool cachedDistributor = !idDistributor.isEmpty() && distributors.contains(idDistributor);
|
||||
@@ -943,34 +950,25 @@ namespace BlackMisc
|
||||
distributors[idDistributor] :
|
||||
CDistributor::fromDatabaseJson(json, prefixDistributor));
|
||||
|
||||
if (!aircraftIcao.isLoadedFromDb())
|
||||
{
|
||||
if (idAircraftIcao >= 0) { aircraftIcao.setDbKey(idAircraftIcao); }
|
||||
}
|
||||
|
||||
if (!aircraftIcao.isLoadedFromDb() && idAircraftIcao >= 0) { aircraftIcao.setDbKey(idAircraftIcao); }
|
||||
if (!livery.isLoadedFromDb())
|
||||
{
|
||||
const int idLivery = json.value(prefix % u"idlivery").toInt(-1);
|
||||
if (idLivery >= 0) { livery.setDbKey(idLivery); }
|
||||
}
|
||||
|
||||
if (!distributor.isLoadedFromDb())
|
||||
{
|
||||
const QString idDistributor = json.value(prefix % u"iddistributor").toString();
|
||||
if (!idDistributor.isEmpty()) { distributor.setDbKey(idDistributor); }
|
||||
}
|
||||
|
||||
// store in temp.cache
|
||||
if (!cachedAircraftIcao && aircraftIcao.isLoadedFromDb()) { aircraftIcaos[aircraftIcao.getDbKey()] = aircraftIcao; }
|
||||
if (!cachedLivery && livery.isLoadedFromDb()) { liveries[livery.getDbKey()] = livery; }
|
||||
if (!cachedDistributor && distributor.isLoadedFromDb()) { distributors[distributor.getDbKey()] = distributor; }
|
||||
|
||||
CAircraftModel model(
|
||||
modelString, CAircraftModel::TypeDatabaseEntry, simInfo, modelName, modelDescription, aircraftIcao, livery
|
||||
);
|
||||
model.setDistributor(distributor);
|
||||
model.setModelModeAsString(modelMode);
|
||||
model.setKeyAndTimestampFromDatabaseJson(json, prefix);
|
||||
return model;
|
||||
// full model
|
||||
return CAircraftModel::fromDatabaseJsonBaseImpl(json, prefix, aircraftIcao, livery, distributor);
|
||||
}
|
||||
|
||||
const QString &CAircraftModel::autoGenerated()
|
||||
@@ -978,5 +976,19 @@ namespace BlackMisc
|
||||
static const QString ag("swift auto generated");
|
||||
return ag;
|
||||
}
|
||||
|
||||
QString CAircraftModel::cleanUpPartsString(const QString &p)
|
||||
{
|
||||
if (p.isEmpty()) { return QString(); }
|
||||
QString pc = removeChars(p.toUpper(), [](QChar c) { return !supportedParts().contains(c); });
|
||||
std::sort(pc.begin(), pc.end());
|
||||
return pc;
|
||||
}
|
||||
|
||||
const QString &CAircraftModel::supportedParts()
|
||||
{
|
||||
static const QString p("EFGLS");
|
||||
return p;
|
||||
}
|
||||
} // namespace
|
||||
} // namespace
|
||||
|
||||
@@ -119,6 +119,7 @@ namespace BlackMisc
|
||||
IndexModelTypeAsString,
|
||||
IndexModelMode,
|
||||
IndexModelModeAsString,
|
||||
IndexSupportedParts,
|
||||
IndexModelModeAsIcon,
|
||||
IndexHasQueriedModelString,
|
||||
IndexMembersDbStatus
|
||||
@@ -139,6 +140,9 @@ namespace BlackMisc
|
||||
//! Constructor.
|
||||
CAircraftModel(const QString &model, ModelType type, const QString &description, const Aviation::CAircraftIcaoCode &icao, const Aviation::CLivery &livery = Aviation::CLivery());
|
||||
|
||||
//! Constructor.
|
||||
CAircraftModel(const QString &model, ModelType type, const CSimulatorInfo &simulator, const QString &name, const QString &description);
|
||||
|
||||
//! Constructor.
|
||||
CAircraftModel(const QString &model, ModelType type, const CSimulatorInfo &simulator, const QString &name, const QString &description, const Aviation::CAircraftIcaoCode &icao, const Aviation::CLivery &livery = Aviation::CLivery());
|
||||
|
||||
@@ -289,6 +293,12 @@ namespace BlackMisc
|
||||
//! CG value available?
|
||||
bool hasCG() const { return !m_cg.isNull(); }
|
||||
|
||||
//! Supported parts
|
||||
const QString &getSupportedParts() const { return m_supportedParts; }
|
||||
|
||||
//! Supported parts
|
||||
void setSupportedParts(const QString &supportedParts);
|
||||
|
||||
//! Model type
|
||||
ModelType getModelType() const { return m_modelType; }
|
||||
|
||||
@@ -473,7 +483,17 @@ namespace BlackMisc
|
||||
//! Hint, that model was automatically generated (e.g. by auto stashing)
|
||||
static const QString &autoGenerated();
|
||||
|
||||
//! Clean up parts string
|
||||
static QString cleanUpPartsString(const QString &p);
|
||||
|
||||
//! Supported parts
|
||||
//! \remark Engine, Flaps, Gear, Lights, Spoilers
|
||||
static const QString &supportedParts();
|
||||
|
||||
private:
|
||||
//! Common implemenation of all fromDatabaseJson functions
|
||||
static CAircraftModel fromDatabaseJsonBaseImpl(const QJsonObject &json, const QString &prefix, const Aviation::CAircraftIcaoCode &aircraftIcao, const Aviation::CLivery &livery, const CDistributor &distributor);
|
||||
|
||||
Aviation::CCallsign m_callsign; //!< aircraft's callsign if any
|
||||
Aviation::CAircraftIcaoCode m_aircraftIcao; //!< ICAO code if available
|
||||
Aviation::CLivery m_livery; //!< livery information
|
||||
@@ -485,6 +505,7 @@ namespace BlackMisc
|
||||
QString m_description; //!< descriptive text
|
||||
QString m_fileName; //!< file name
|
||||
QString m_iconPath; //!< a file representing the aircraft as icon
|
||||
QString m_supportedParts; //!< supported parts
|
||||
qint64 m_fileTimestamp = -1; //!< file timestamp of originating file (if applicable)
|
||||
ModelType m_modelType = TypeUnknown; //!< model string is coming representing ...?
|
||||
ModelMode m_modelMode = Include; //!< model mode (include / exclude)
|
||||
@@ -500,6 +521,7 @@ namespace BlackMisc
|
||||
BLACK_METAMEMBER(simulator),
|
||||
BLACK_METAMEMBER(distributor),
|
||||
BLACK_METAMEMBER(cg),
|
||||
BLACK_METAMEMBER(supportedParts),
|
||||
BLACK_METAMEMBER(modelString, 0, CaseInsensitiveComparison),
|
||||
BLACK_METAMEMBER(name),
|
||||
BLACK_METAMEMBER(description, 0, DisabledForComparison),
|
||||
|
||||
Reference in New Issue
Block a user