Ref T265, Ref T430, Ref T473 "supported parts" in model

* added part member
* unified parsing from DB "CAircraftModel::fromDatabaseJsonBaseImpl"
This commit is contained in:
Klaus Basan
2018-12-20 04:10:36 +01:00
committed by Mat Sutcliffe
parent 2d3e2e2d99
commit ecb77191e5
2 changed files with 96 additions and 62 deletions

View File

@@ -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

View File

@@ -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),