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/statusmessage.h"
#include "blackmisc/compare.h" #include "blackmisc/compare.h"
#include "blackmisc/verify.h" #include "blackmisc/verify.h"
#include "blackconfig/buildconfig.h"
#include <QJsonDocument> #include <QJsonDocument>
#include <QJsonObject> #include <QJsonObject>
@@ -27,6 +28,7 @@
#include <QStringBuilder> #include <QStringBuilder>
#include <QFileInfo> #include <QFileInfo>
using namespace BlackConfig;
using namespace BlackMisc::Aviation; using namespace BlackMisc::Aviation;
using namespace BlackMisc::PhysicalQuantities; using namespace BlackMisc::PhysicalQuantities;
using namespace BlackMisc::Db; 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) 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) : 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) 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("name", this->getName());
obj.insert("modelstring", QJsonValue(m_modelString)); obj.insert("modelstring", QJsonValue(m_modelString));
obj.insert("description", QJsonValue(m_description)); 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 obj.insert("mode", QJsonValue(getModelModeAsString().left(1).toUpper())); // clazy:exclude=qstring-left
if (m_cg.isNull()) if (m_cg.isNull())
{ {
@@ -228,6 +235,7 @@ namespace BlackMisc
case IndexName: return CVariant(m_name); case IndexName: return CVariant(m_name);
case IndexFileName: return CVariant(m_fileName); case IndexFileName: return CVariant(m_fileName);
case IndexCG: return m_cg.propertyByIndex(index.copyFrontRemoved()); case IndexCG: return m_cg.propertyByIndex(index.copyFrontRemoved());
case IndexSupportedParts: return CVariant(m_supportedParts);
case IndexFileTimestamp: return CVariant::fromValue(this->getFileTimestamp()); case IndexFileTimestamp: return CVariant::fromValue(this->getFileTimestamp());
case IndexFileTimestampFormattedYmdhms: return CVariant::fromValue(this->getFormattedFileTimestampYmdhms()); case IndexFileTimestampFormattedYmdhms: return CVariant::fromValue(this->getFormattedFileTimestampYmdhms());
case IndexIconPath: return CVariant(m_iconPath); case IndexIconPath: return CVariant(m_iconPath);
@@ -257,6 +265,7 @@ namespace BlackMisc
case IndexName: m_name = variant.toQString(); break; case IndexName: m_name = variant.toQString(); break;
case IndexIconPath: m_iconPath = variant.toQString(); break; case IndexIconPath: m_iconPath = variant.toQString(); break;
case IndexCG: m_cg.setPropertyByIndex(index.copyFrontRemoved(), variant); 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 IndexModelType: m_modelType = variant.value<ModelType>(); break;
case IndexFileName: m_fileName = variant.toQString(); break; case IndexFileName: m_fileName = variant.toQString(); break;
case IndexCallsign: case IndexCallsign:
@@ -315,6 +324,7 @@ namespace BlackMisc
case IndexFileName: return m_fileName.compare(compareValue.getFileName(), Qt::CaseInsensitive); case IndexFileName: return m_fileName.compare(compareValue.getFileName(), Qt::CaseInsensitive);
case IndexIconPath: return m_iconPath.compare(compareValue.getIconPath(), Qt::CaseInsensitive); case IndexIconPath: return m_iconPath.compare(compareValue.getIconPath(), Qt::CaseInsensitive);
case IndexCG: return m_cg.comparePropertyByIndex(index.copyFrontRemoved(), compareValue.getCG()); case IndexCG: return m_cg.comparePropertyByIndex(index.copyFrontRemoved(), compareValue.getCG());
case IndexSupportedParts: return m_supportedParts.compare(compareValue.getSupportedParts());
case IndexModelTypeAsString: case IndexModelTypeAsString:
case IndexModelType: return Compare::compare(m_modelType, compareValue.getModelType()); case IndexModelType: return Compare::compare(m_modelType, compareValue.getModelType());
case IndexSimulatorInfoAsString: case IndexSimulatorInfoAsString:
@@ -442,6 +452,11 @@ namespace BlackMisc
return distributors.matchesAnyKeyOrAlias(m_distributor.getDbKey()); return distributors.matchesAnyKeyOrAlias(m_distributor.getDbKey());
} }
void CAircraftModel::setSupportedParts(const QString &supportedParts)
{
m_supportedParts = CAircraftModel::cleanUpPartsString(supportedParts);
}
bool CAircraftModel::matchesMode(ModelModeFilter mode) const bool CAircraftModel::matchesMode(ModelModeFilter mode) const
{ {
if (mode == All) { return true; } 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())); } if (details) { validationMsgs.push_back(equalMessage(equal, *this, QStringLiteral("mode"), dbModel.getModelModeAsString(), this->getModelModeAsString())); }
changed |= !equal; 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 // clean messages
if (changed && details) if (changed && details)
{ {
@@ -856,57 +879,47 @@ namespace BlackMisc
return i; // default 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) CAircraftModel CAircraftModel::fromDatabaseJson(const QJsonObject &json, const QString &prefix)
{ {
static const QString prefixAircraftIcao("ac_"); static const QString prefixAircraftIcao("ac_");
static const QString prefixLivery("liv_"); static const QString prefixLivery("liv_");
static const QString prefixDistributor("dist_"); 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)); CDistributor distributor(CDistributor::fromDatabaseJson(json, prefixDistributor));
CAircraftIcaoCode aircraftIcao(CAircraftIcaoCode::fromDatabaseJson(json, prefixAircraftIcao)); CAircraftIcaoCode aircraftIcao(CAircraftIcaoCode::fromDatabaseJson(json, prefixAircraftIcao));
CLivery livery(CLivery::fromDatabaseJson(json, prefixLivery)); 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() && idAircraftIcao >= 0) { aircraftIcao.setDbKey(idAircraftIcao); }
if (!aircraftIcao.isLoadedFromDb()) if (!livery.isLoadedFromDb() && idLivery >= 0) { livery.setDbKey(idLivery); }
{ if (!distributor.isLoadedFromDb() && !idDistributor.isEmpty()) { distributor.setDbKey(idDistributor); }
const int idAircraftIcao = json.value(prefix % u"idaircrafticao").toInt(-1);
if (idAircraftIcao >= 0)
{
aircraftIcao.setDbKey(idAircraftIcao);
}
}
if (!livery.isLoadedFromDb()) // full model
{ return CAircraftModel::fromDatabaseJsonBaseImpl(json, prefix, aircraftIcao, livery, distributor);
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;
} }
CAircraftModel CAircraftModel::fromDatabaseJsonCaching( CAircraftModel CAircraftModel::fromDatabaseJsonCaching(
@@ -917,16 +930,10 @@ namespace BlackMisc
static const QString prefixAircraftIcao("ac_"); static const QString prefixAircraftIcao("ac_");
static const QString prefixLivery("liv_"); static const QString prefixLivery("liv_");
static const QString prefixDistributor("dist_"); static const QString prefixDistributor("dist_");
const QString idDistributor = json.value(prefixDistributor % u"id").toString();
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 int idAircraftIcao = json.value(prefixAircraftIcao % u"id").toInt(-1); const int idAircraftIcao = json.value(prefixAircraftIcao % u"id").toInt(-1);
const int idLivery = json.value(prefixLivery % 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 cachedAircraftIcao = (idAircraftIcao >= 0) && aircraftIcaos.contains(idAircraftIcao);
const bool cachedLivery = (idLivery >= 0) && liveries.contains(idLivery); const bool cachedLivery = (idLivery >= 0) && liveries.contains(idLivery);
const bool cachedDistributor = !idDistributor.isEmpty() && distributors.contains(idDistributor); const bool cachedDistributor = !idDistributor.isEmpty() && distributors.contains(idDistributor);
@@ -943,34 +950,25 @@ namespace BlackMisc
distributors[idDistributor] : distributors[idDistributor] :
CDistributor::fromDatabaseJson(json, prefixDistributor)); CDistributor::fromDatabaseJson(json, prefixDistributor));
if (!aircraftIcao.isLoadedFromDb()) if (!aircraftIcao.isLoadedFromDb() && idAircraftIcao >= 0) { aircraftIcao.setDbKey(idAircraftIcao); }
{
if (idAircraftIcao >= 0) { aircraftIcao.setDbKey(idAircraftIcao); }
}
if (!livery.isLoadedFromDb()) if (!livery.isLoadedFromDb())
{ {
const int idLivery = json.value(prefix % u"idlivery").toInt(-1); const int idLivery = json.value(prefix % u"idlivery").toInt(-1);
if (idLivery >= 0) { livery.setDbKey(idLivery); } if (idLivery >= 0) { livery.setDbKey(idLivery); }
} }
if (!distributor.isLoadedFromDb()) if (!distributor.isLoadedFromDb())
{ {
const QString idDistributor = json.value(prefix % u"iddistributor").toString(); const QString idDistributor = json.value(prefix % u"iddistributor").toString();
if (!idDistributor.isEmpty()) { distributor.setDbKey(idDistributor); } if (!idDistributor.isEmpty()) { distributor.setDbKey(idDistributor); }
} }
// store in temp.cache
if (!cachedAircraftIcao && aircraftIcao.isLoadedFromDb()) { aircraftIcaos[aircraftIcao.getDbKey()] = aircraftIcao; } if (!cachedAircraftIcao && aircraftIcao.isLoadedFromDb()) { aircraftIcaos[aircraftIcao.getDbKey()] = aircraftIcao; }
if (!cachedLivery && livery.isLoadedFromDb()) { liveries[livery.getDbKey()] = livery; } if (!cachedLivery && livery.isLoadedFromDb()) { liveries[livery.getDbKey()] = livery; }
if (!cachedDistributor && distributor.isLoadedFromDb()) { distributors[distributor.getDbKey()] = distributor; } if (!cachedDistributor && distributor.isLoadedFromDb()) { distributors[distributor.getDbKey()] = distributor; }
CAircraftModel model( // full model
modelString, CAircraftModel::TypeDatabaseEntry, simInfo, modelName, modelDescription, aircraftIcao, livery return CAircraftModel::fromDatabaseJsonBaseImpl(json, prefix, aircraftIcao, livery, distributor);
);
model.setDistributor(distributor);
model.setModelModeAsString(modelMode);
model.setKeyAndTimestampFromDatabaseJson(json, prefix);
return model;
} }
const QString &CAircraftModel::autoGenerated() const QString &CAircraftModel::autoGenerated()
@@ -978,5 +976,19 @@ namespace BlackMisc
static const QString ag("swift auto generated"); static const QString ag("swift auto generated");
return ag; 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
} // namespace } // namespace

View File

@@ -119,6 +119,7 @@ namespace BlackMisc
IndexModelTypeAsString, IndexModelTypeAsString,
IndexModelMode, IndexModelMode,
IndexModelModeAsString, IndexModelModeAsString,
IndexSupportedParts,
IndexModelModeAsIcon, IndexModelModeAsIcon,
IndexHasQueriedModelString, IndexHasQueriedModelString,
IndexMembersDbStatus IndexMembersDbStatus
@@ -139,6 +140,9 @@ namespace BlackMisc
//! Constructor. //! Constructor.
CAircraftModel(const QString &model, ModelType type, const QString &description, const Aviation::CAircraftIcaoCode &icao, const Aviation::CLivery &livery = Aviation::CLivery()); 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. //! 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()); 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? //! CG value available?
bool hasCG() const { return !m_cg.isNull(); } 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 //! Model type
ModelType getModelType() const { return m_modelType; } ModelType getModelType() const { return m_modelType; }
@@ -473,7 +483,17 @@ namespace BlackMisc
//! Hint, that model was automatically generated (e.g. by auto stashing) //! Hint, that model was automatically generated (e.g. by auto stashing)
static const QString &autoGenerated(); 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: 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::CCallsign m_callsign; //!< aircraft's callsign if any
Aviation::CAircraftIcaoCode m_aircraftIcao; //!< ICAO code if available Aviation::CAircraftIcaoCode m_aircraftIcao; //!< ICAO code if available
Aviation::CLivery m_livery; //!< livery information Aviation::CLivery m_livery; //!< livery information
@@ -485,6 +505,7 @@ namespace BlackMisc
QString m_description; //!< descriptive text QString m_description; //!< descriptive text
QString m_fileName; //!< file name QString m_fileName; //!< file name
QString m_iconPath; //!< a file representing the aircraft as icon 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) qint64 m_fileTimestamp = -1; //!< file timestamp of originating file (if applicable)
ModelType m_modelType = TypeUnknown; //!< model string is coming representing ...? ModelType m_modelType = TypeUnknown; //!< model string is coming representing ...?
ModelMode m_modelMode = Include; //!< model mode (include / exclude) ModelMode m_modelMode = Include; //!< model mode (include / exclude)
@@ -500,6 +521,7 @@ namespace BlackMisc
BLACK_METAMEMBER(simulator), BLACK_METAMEMBER(simulator),
BLACK_METAMEMBER(distributor), BLACK_METAMEMBER(distributor),
BLACK_METAMEMBER(cg), BLACK_METAMEMBER(cg),
BLACK_METAMEMBER(supportedParts),
BLACK_METAMEMBER(modelString, 0, CaseInsensitiveComparison), BLACK_METAMEMBER(modelString, 0, CaseInsensitiveComparison),
BLACK_METAMEMBER(name), BLACK_METAMEMBER(name),
BLACK_METAMEMBER(description, 0, DisabledForComparison), BLACK_METAMEMBER(description, 0, DisabledForComparison),