6 #include <QCoreApplication>
8 #include <QStringBuilder>
22 using namespace swift::misc::db;
26 namespace swift::misc::aviation
30 CLivery::CLivery(
const QString &combinedCode,
const CAirlineIcaoCode &airline,
const QString &description)
31 :
CLivery(-1, combinedCode, airline, description,
"",
"", false)
35 const QString &colorFuselage,
const QString &colorTail,
bool isMilitary)
36 :
CLivery(-1, combinedCode, airline, description, colorFuselage, colorTail, isMilitary)
41 :
CLivery(-1, combinedCode, airline, description, colorFuselage, colorTail, isMilitary)
45 const QString &description,
const QString &colorFuselage,
const QString &colorTail,
48 m_description(description.trimmed()), m_colorFuselage(
CRgbColor(colorFuselage)),
49 m_colorTail(
CRgbColor(colorTail)), m_military(isMilitary)
53 const QString &description,
const CRgbColor &colorFuselage,
const CRgbColor &colorTail,
56 m_description(description.trimmed()), m_colorFuselage(colorFuselage), m_colorTail(colorTail),
57 m_military(isMilitary)
83 if (m_airline == airlineIcao) {
return false; }
84 m_airline = airlineIcao;
90 if (m_airline.
getDesignator() == airlineIcaoDesignator) {
return false; }
103 if (candidate.isEmpty() || !this->hasCombinedCode()) {
return false; }
104 const QString c(candidate.trimmed().toUpper());
105 return c == m_combinedCode;
115 static const QString livery(
"Livery");
116 static const QString liveryI18n(QCoreApplication::translate(
"Aviation",
"Livery"));
118 return (i18n ? liveryI18n : livery) % u
" cc: '" % m_combinedCode % u
"' airline: '" % m_airline.
toQString(i18n) %
119 u
"' desc.: '" % m_description % u
"' F: '" % m_colorFuselage.
hex() % u
"' T: '" % m_colorTail.
hex() %
123 (void)QT_TRANSLATE_NOOP(
"Aviation",
"Livery");
150 u
"Livery: color livery, but airline looks odd"));
163 Q_ASSERT_X(!m_combinedCode.startsWith(
"." +
standardLiveryMarker()), Q_FUNC_INFO,
"illegal combined code");
164 return !m_combinedCode.isEmpty();
195 const double d = xDist * xDist + yDist * yDist;
209 const QString combinedCode(json.value(prefix % u
"combinedcode").toString());
210 if (combinedCode.isEmpty())
218 const QString description(json.value(prefix % u
"description").toString());
219 const CRgbColor colorFuselage(json.value(prefix % u
"colorfuselage").toString());
220 const CRgbColor colorTail(json.value(prefix % u
"colortail").toString());
221 const bool military = CDatastoreUtility::dbBoolStringToBool(json.value(prefix % u
"military").toString());
224 CLivery livery(combinedCode, airline, description, colorFuselage, colorTail, military);
230 Q_FUNC_INFO,
"inconsistent data");
236 const QString &prefix)
244 const QString combinedCode(json.value(prefix % u
"combinedcode").toString());
245 if (combinedCode.isEmpty())
253 const QString description(json.value(prefix % u
"description").toString());
254 const CRgbColor colorFuselage(json.value(prefix % u
"colorfuselage").toString());
255 const CRgbColor colorTail(json.value(prefix % u
"colortail").toString());
256 const bool military = CDatastoreUtility::dbBoolStringToBool(json.value(prefix % u
"military").toString());
261 static const QString prefixAirline(
"al_");
262 const int idAirlineIcao = json.value(prefixAirline % u
"id").toInt(-1);
263 const bool cachedAirlineIcao = idAirlineIcao >= 0 && airlineIcaos.contains(idAirlineIcao);
265 airline = cachedAirlineIcao ? airlineIcaos[idAirlineIcao] :
268 if (!cachedAirlineIcao && airline.
isLoadedFromDb()) { airlineIcaos[idAirlineIcao] = airline; }
271 CLivery livery(combinedCode, airline, description, colorFuselage, colorTail, military);
277 Q_FUNC_INFO,
"inconsistent data");
284 if (candidate.isEmpty()) {
return false; }
288 if (candidate.count(
'.') != 1) {
return false; }
289 return candidate.length() > 2;
295 static const QString s(
"_STD");
307 static const QString s(
"_CC");
313 static const QString temp(
"_CC_NOCOLOR");
331 if (!log) {
return; }
332 if (message.isEmpty()) {
return; }
338 if (index.
isMyself()) {
return QVariant::fromValue(*
this); }
339 if (IDatastoreObjectWithIntegerKey::canHandleIndex(index))
341 return IDatastoreObjectWithIntegerKey::propertyByIndex(index);
349 case IndexDescription:
return QVariant::fromValue(m_description);
350 case IndexCombinedCode:
return QVariant::fromValue(m_combinedCode);
351 case IndexIsMilitary:
return QVariant::fromValue(m_military);
360 (*this) = variant.value<
CLivery>();
363 if (IDatastoreObjectWithIntegerKey::canHandleIndex(index))
365 IDatastoreObjectWithIntegerKey::setPropertyByIndex(index, variant);
371 case IndexDescription: m_description = variant.toString();
break;
375 case IndexCombinedCode: this->
setCombinedCode(variant.toString());
break;
376 case IndexIsMilitary: this->
setMilitary(variant.toBool());
break;
384 if (IDatastoreObjectWithIntegerKey::canHandleIndex(index))
386 return IDatastoreObjectWithIntegerKey::comparePropertyByIndex(index, compareValue);
391 case IndexDescription:
return m_description.compare(compareValue.
getDescription(), Qt::CaseInsensitive);
392 case IndexAirlineIcaoCode:
394 case IndexColorFuselage:
402 Q_ASSERT_X(
false, Q_FUNC_INFO,
"No compare function");
433 return QStringLiteral(
"%1%2Airline: %3")
438 .replace(
" ",
" ");
451 Q_ASSERT_X(sameAirlineIcaoLevel == 60, Q_FUNC_INFO,
"airline scoring changed");
460 score += 60 * colorMultiplier;
463 QStringLiteral(
"2 color liveries, color multiplier %1: %2").arg(colorMultiplier).arg(score));
473 score += 25 * colorMultiplier;
476 QStringLiteral(
"2 airline liveries, color multiplier %1: %2").arg(colorMultiplier).arg(score));
491 score = preferColorLiveries ? 25 : 0;
492 score += 25 * colorMultiplier;
495 QStringLiteral(
"Color/airline mixed, color multiplier %1: %2").arg(colorMultiplier).arg(score));
static const QString & aviation()
Aviation specific.
A sequence of log categories.
static CLogCategoryList fromQStringList(const QStringList &stringList)
Convert a string list, such as that returned by toQStringList(), into a CLogCategoryList.
Non-owning reference to a CPropertyIndex with a subset of its features.
Q_REQUIRED_RESULT CPropertyIndexRef copyFrontRemoved() const
Copy with first element removed.
CastType frontCasted() const
First element casted to given type, usually the PropertIndex enum.
bool isMyself() const
Myself index, used with nesting.
QVariant propertyByIndex(swift::misc::CPropertyIndexRef index) const
Property by index.
QString hex(bool withHash=false) const
Hex value.
double colorDistance(const CRgbColor &color) const
Color distance [0..1] http://stackoverflow.com/questions/4754506/color-similarity-distance-in-rgba-co...
void setPropertyByIndex(swift::misc::CPropertyIndexRef index, const QVariant &variant)
Set property by index.
int comparePropertyByIndex(CPropertyIndexRef index, const CRgbColor &compareValue) const
Compare for index.
bool isValid() const
Valid?
void push_back(const T &value)
Appends an element at the end of the sequence.
Streamable status message, e.g.
constexpr static auto SeverityError
Status severities.
constexpr static auto SeverityWarning
Status severities.
Status messages, e.g. from Core -> GUI.
QDateTime getUtcTimestamp() const
Get timestamp.
void setUtcTimestamp(const QDateTime ×tamp)
Set timestamp.
Value object for ICAO classification.
bool isNull() const
Null ICAO?
bool isContainedInSimplifiedName(const QString &candidate) const
Does simplified name contain the candidate.
void setPropertyByIndex(CPropertyIndexRef index, const QVariant &variant)
Set property by index.
QVariant propertyByIndex(CPropertyIndexRef index) const
Property by index.
const QString & getDesignator() const
Get airline, e.g. "DLH".
CStatusMessageList validate() const
Validate data.
bool hasValidDesignator() const
Airline designator available?
static CAirlineIcaoCode fromDatabaseJson(const QJsonObject &json, const QString &prefix=QString())
From our DB JSON.
void updateMissingParts(const CAirlineIcaoCode &otherIcaoCode)
Update missing parts.
int calculateScore(const CAirlineIcaoCode &otherCode, CStatusMessageList *log=nullptr) const
Score against other code 0..100.
void setDesignator(const QString &icaoDesignator)
Set airline, e.g. "DLH".
int comparePropertyByIndex(CPropertyIndexRef index, const CAirlineIcaoCode &compareValue) const
Compare for index.
QString getVDesignator() const
Get airline, e.g. "DLH", but "VMVA" for virtual airlines.
bool isOperating() const
Operating?
bool hasName() const
Has (airline) name?
Value object encapsulating information about an airpot.
bool isMilitary() const
Military livery.
const CRgbColor & getColorTail() const
Get tail color.
void setCombinedCode(const QString &code)
Combined code.
static const QString & tempLiveryCode()
The code for a temporary livery.
bool setAirlineIcaoCode(const CAirlineIcaoCode &airlineIcao)
Airline ICAO code.
CStatusMessageList validate() const
Validate data.
const QString & getAirlineIcaoCodeDesignator() const
Corresponding airline designator, if any.
void setColorTail(const CRgbColor &color)
Set tail color.
bool hasAirlineName() const
Has airline name?
QString convertToQString(bool i18n=false) const
Cast as QString.
double getColorDistance(const CLivery &otherLivery) const
Color distance 0..1 (0 is best)
ColumnIndex
Properties by index.
bool isNull() const
Null livery?
bool matchesCombinedCode(const QString &candidate) const
Matches combined code.
static CLivery fromDatabaseJson(const QJsonObject &json, const QString &prefix=QString("liv_"))
Object from JSON.
const CAirlineIcaoCode & getAirlineIcaoCode() const
Corresponding airline, if any.
static const QString & colorLiveryMarker()
Color livery marker.
QString asHtmlSummary(const QString &separator) const
As a brief HTML summary (e.g. used in tooltips)
QVariant propertyByIndex(CPropertyIndexRef index) const
Property by index.
QString getCombinedCodePlusInfoAndId() const
Combined code, info, plus id.
static bool isValidCombinedCode(const QString &candidate)
Valid combined code string?
bool setAirlineIcaoCodeDesignator(const QString &airlineIcaoDesignator)
Airline ICAO code designator.
void setMilitary(bool isMilitary)
Military aircraft?
static QString getStandardCode(const aviation::CAirlineIcaoCode &airline)
Standard code for airline.
static CStatusMessage logMessage(const CLivery &livery, const QString &message, const QStringList &extraCategories={}, CStatusMessage::StatusSeverity s=CStatusMessage::SeverityInfo)
Specialized log message for matching / reverse lookup.
bool hasValidAirlineDesignator() const
Airline available?
bool hasColorTail() const
Tail color set?
bool isAirlineOperating() const
Is airline operating?
bool hasColorFuselage() const
Fuselage color set?
bool hasCompleteData() const
Complete data?
static const CLivery & null()
NULL object.
bool isAirlineStandardLivery() const
Livery representing airline standard livery.
const QString & getCombinedCode() const
Combined code.
bool matchesColors(const CRgbColor &fuselage, const CRgbColor &tail) const
Matches colors.
const QString & getDescription() const
Get description.
void setColorFuselage(const CRgbColor &color)
Set fuselage color.
bool isAirlineLivery() const
Livery representing airline.
static CLivery fromDatabaseJsonCaching(const QJsonObject &json, AirlineIcaoIdMap &airlineIcaos, const QString &prefix=QString("liv_"))
Object from JSON caching.
bool hasValidColors() const
Has valid (fuselage/tail) colors?
void setPropertyByIndex(CPropertyIndexRef index, const QVariant &variant)
Set property by index.
QString getCombinedCodePlusId() const
Combined code plus id.
bool isContainedInSimplifiedAirlineName(const QString &candidate) const
Does simplified airline name contain the candidate.
bool hasCombinedCode() const
Livery combined code available?
bool isColorLivery() const
Color livery?
int comparePropertyByIndex(CPropertyIndexRef index, const CLivery &compareValue) const
Compare for index.
CLivery()
Default constructor.
static const QString & standardLiveryMarker()
Standard livery marker string.
int calculateScore(const CLivery &otherLivery, bool preferColorLiveries=false, CStatusMessageList *log=nullptr) const
Score by comparison to another livery 0..100.
static void addLogDetailsToList(CStatusMessageList *log, const CLivery &livery, const QString &message, const QStringList &extraCategories={}, CStatusMessage::StatusSeverity s=CStatusMessage::SeverityInfo)
Specialized log for matching / reverse lookup.
void setDescription(const QString &description)
Set description.
void updateMissingParts(const CLivery &otherLivery)
Update missing parts.
QString getCombinedCodePlusInfo() const
Combined code plus info.
const CRgbColor & getColorFuselage() const
Get fuselage color.
Class from which a derived class can inherit datastore-related functions.
int getDbKey() const
Get DB key.
bool isLoadedFromDb() const
Loaded from DB.
static bool existsKey(const QJsonObject &json, const QString &prefix=QString())
Is a key available?
void setDbKey(int key)
Set the DB key.
bool isDbEqual(const IDatastoreObjectWithIntegerKey &other) const
Same DB key and hence equal.
QString getDbKeyAsStringInParentheses(const QString &prefix={}) const
Db key in parentheses, e.g. "(3)".
void setKeyVersionTimestampFromDatabaseJson(const QJsonObject &json, const QString &prefix=QString())
Set key and timestamp values.
bool hasValidDbKey() const
Has valid DB key.
void setPropertyByIndex(CPropertyIndexRef index, const QVariant &variant)
Set property by index.
QVariant propertyByIndex(CPropertyIndexRef index) const
Property by index.
QString toQString(bool i18n=false) const
Cast as QString.
Free functions in swift::misc.
StatusSeverity
Status severities.
SWIFT_MISC_EXPORT const QString & boolToYesNo(bool v)
Bool to yes/no.
#define SWIFT_DEFINE_VALUEOBJECT_MIXINS(Namespace, Class)
Explicit template definition of mixins for a CValueObject subclass.
#define SWIFT_VERIFY_X(COND, WHERE, WHAT)
A weaker kind of assert.