mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-17 19:05:31 +08:00
Ref T472, utility functions for aircraft categories
This commit is contained in:
committed by
Mat Sutcliffe
parent
b57003c4e8
commit
5846860382
@@ -83,6 +83,15 @@ namespace BlackMisc
|
|||||||
m_l3 = l3;
|
m_l3 = l3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QList<int> CAircraftCategory::getLevel() const
|
||||||
|
{
|
||||||
|
QList<int> l;
|
||||||
|
if (m_l1 > 0) l << m_l1;
|
||||||
|
if (m_l2 > 0) l << m_l2;
|
||||||
|
if (m_l3 > 0) l << m_l3;
|
||||||
|
return l;
|
||||||
|
}
|
||||||
|
|
||||||
bool CAircraftCategory::isFirstLevel() const
|
bool CAircraftCategory::isFirstLevel() const
|
||||||
{
|
{
|
||||||
return (m_l3 == 0 && m_l2 == 0 && m_l1 > 0);
|
return (m_l3 == 0 && m_l2 == 0 && m_l1 > 0);
|
||||||
@@ -110,6 +119,23 @@ namespace BlackMisc
|
|||||||
return stringCompare(path, this->getPath(), cs);
|
return stringCompare(path, this->getPath(), cs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CAircraftCategory::matchesLevel(int l1, int l2, int l3) const
|
||||||
|
{
|
||||||
|
if (l1 != m_l1) { return false; }
|
||||||
|
if (l2 > 0 && l2 != m_l2) { return false; }
|
||||||
|
if (l3 > 0 && l3 != m_l3) { return false; }
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CAircraftCategory::matchesLevel(const QList<int> &level) const
|
||||||
|
{
|
||||||
|
if (level.isEmpty()) { return false; }
|
||||||
|
const int l1 = level.first();
|
||||||
|
const int l2 = level.size() > 1 ? level.at(1) : 0;
|
||||||
|
const int l3 = level.size() > 2 ? level.at(2) : 0;
|
||||||
|
return this->matchesLevel(l1, l2, l3);
|
||||||
|
}
|
||||||
|
|
||||||
CVariant CAircraftCategory::propertyByIndex(const BlackMisc::CPropertyIndex &index) const
|
CVariant CAircraftCategory::propertyByIndex(const BlackMisc::CPropertyIndex &index) const
|
||||||
{
|
{
|
||||||
if (index.isMyself()) { return CVariant::from(*this); }
|
if (index.isMyself()) { return CVariant::from(*this); }
|
||||||
@@ -184,5 +210,11 @@ namespace BlackMisc
|
|||||||
c = Compare::compare(m_l3, other.m_l3);
|
c = Compare::compare(m_l3, other.m_l3);
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CAircraftCategory::isHigherLevel(const CAircraftCategory &other) const
|
||||||
|
{
|
||||||
|
const int c = this->compareByLevel(other);
|
||||||
|
return c < 0;
|
||||||
|
}
|
||||||
} // namespace
|
} // namespace
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|||||||
@@ -21,6 +21,7 @@
|
|||||||
|
|
||||||
#include <QJsonObject>
|
#include <QJsonObject>
|
||||||
#include <QMap>
|
#include <QMap>
|
||||||
|
#include <QList>
|
||||||
#include <QStringList>
|
#include <QStringList>
|
||||||
#include <QMetaType>
|
#include <QMetaType>
|
||||||
|
|
||||||
@@ -77,6 +78,9 @@ namespace BlackMisc
|
|||||||
//! Level
|
//! Level
|
||||||
void setLevel(int l1, int l2, int l3);
|
void setLevel(int l1, int l2, int l3);
|
||||||
|
|
||||||
|
//! Levels depending on depth, 3.2 -> 3,2 / 1.0 -> 1 / 4.3.1 -> 4,3,1
|
||||||
|
QList<int> getLevel() const;
|
||||||
|
|
||||||
//! First level
|
//! First level
|
||||||
int getFirstLevel() const { return m_l1; }
|
int getFirstLevel() const { return m_l1; }
|
||||||
|
|
||||||
@@ -95,6 +99,12 @@ namespace BlackMisc
|
|||||||
//! Matching path?
|
//! Matching path?
|
||||||
bool matchesPath(const QString &path, Qt::CaseSensitivity cs);
|
bool matchesPath(const QString &path, Qt::CaseSensitivity cs);
|
||||||
|
|
||||||
|
//! Is matching the level, 0 ignored
|
||||||
|
bool matchesLevel(int l1, int l2 = 0, int l3 = 0) const;
|
||||||
|
|
||||||
|
//! Is matching the level, 0 ignored
|
||||||
|
bool matchesLevel(const QList<int> &level) const;
|
||||||
|
|
||||||
//! Assignable?
|
//! Assignable?
|
||||||
bool isAssignable() const { return m_assignable; }
|
bool isAssignable() const { return m_assignable; }
|
||||||
|
|
||||||
@@ -122,6 +132,9 @@ namespace BlackMisc
|
|||||||
//! Level compare
|
//! Level compare
|
||||||
int compareByLevel(const CAircraftCategory &other) const;
|
int compareByLevel(const CAircraftCategory &other) const;
|
||||||
|
|
||||||
|
//! Higher level?
|
||||||
|
bool isHigherLevel(const CAircraftCategory &other) const;
|
||||||
|
|
||||||
//! NULL object
|
//! NULL object
|
||||||
static const CAircraftCategory &null();
|
static const CAircraftCategory &null();
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
#include <QJsonObject>
|
#include <QJsonObject>
|
||||||
#include <QJsonValue>
|
#include <QJsonValue>
|
||||||
#include <Qt>
|
#include <Qt>
|
||||||
|
#include <QMap>
|
||||||
|
|
||||||
namespace BlackMisc
|
namespace BlackMisc
|
||||||
{
|
{
|
||||||
@@ -68,12 +69,57 @@ namespace BlackMisc
|
|||||||
return ll;
|
return ll;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CAircraftCategoryList CAircraftCategoryList::findHighestLevels(const CAircraftCategoryList &categories)
|
||||||
|
{
|
||||||
|
if (categories.isEmpty()) { return CAircraftCategoryList(); }
|
||||||
|
QMap<int, CAircraftCategory> highestLevels;
|
||||||
|
for (const CAircraftCategory &category : *this)
|
||||||
|
{
|
||||||
|
const int fl = category.getFirstLevel();
|
||||||
|
if (highestLevels.contains(fl))
|
||||||
|
{
|
||||||
|
if (highestLevels[fl].isHigherLevel(category))
|
||||||
|
{
|
||||||
|
highestLevels[fl] = category;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
highestLevels[fl] = category;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CAircraftCategoryList topLevels;
|
||||||
|
for (const CAircraftCategory &category : highestLevels.values())
|
||||||
|
{
|
||||||
|
topLevels.push_back(category);
|
||||||
|
}
|
||||||
|
return topLevels;
|
||||||
|
}
|
||||||
|
|
||||||
CAircraftCategoryList CAircraftCategoryList::findByFirstLevel(int level) const
|
CAircraftCategoryList CAircraftCategoryList::findByFirstLevel(int level) const
|
||||||
{
|
{
|
||||||
CAircraftCategoryList categories;
|
CAircraftCategoryList categories;
|
||||||
for (const CAircraftCategory &category : *this)
|
for (const CAircraftCategory &category : *this)
|
||||||
{
|
{
|
||||||
if (category.getFirstLevel() != level) { continue; }
|
if (category.getFirstLevel() == level)
|
||||||
|
{
|
||||||
|
categories.push_back(category);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return categories;
|
||||||
|
}
|
||||||
|
|
||||||
|
CAircraftCategoryList CAircraftCategoryList::findByLevel(const QList<int> &level) const
|
||||||
|
{
|
||||||
|
CAircraftCategoryList categories;
|
||||||
|
if (level.isEmpty()) { return categories; }
|
||||||
|
for (const CAircraftCategory &category : *this)
|
||||||
|
{
|
||||||
|
if (category.matchesLevel(level))
|
||||||
|
{
|
||||||
|
categories.push_back(category);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return categories;
|
return categories;
|
||||||
}
|
}
|
||||||
@@ -83,6 +129,45 @@ namespace BlackMisc
|
|||||||
return this->findBy(&CAircraftCategory::isFirstLevel, true);
|
return this->findBy(&CAircraftCategory::isFirstLevel, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CAircraftCategoryList CAircraftCategoryList::findSiblings(const CAircraftCategory &category) const
|
||||||
|
{
|
||||||
|
QList<int> levels = category.getLevel();
|
||||||
|
CAircraftCategoryList categories;
|
||||||
|
if (levels.size() < 2)
|
||||||
|
{
|
||||||
|
categories = this->findFirstLevels();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
levels.removeLast();
|
||||||
|
categories = this->findByLevel(levels);
|
||||||
|
}
|
||||||
|
categories.remove(category);
|
||||||
|
return categories;
|
||||||
|
}
|
||||||
|
|
||||||
|
int CAircraftCategoryList::removeIfLevel(const QList<int> &level)
|
||||||
|
{
|
||||||
|
if (level.isEmpty()) { return 0; }
|
||||||
|
const int c = this->size();
|
||||||
|
const CAircraftCategoryList removed = this->removedLevel(level);
|
||||||
|
const int delta = c - removed.size();
|
||||||
|
if (delta > 0) { *this = removed; }
|
||||||
|
return delta;
|
||||||
|
}
|
||||||
|
|
||||||
|
CAircraftCategoryList CAircraftCategoryList::removedLevel(const QList<int> &level) const
|
||||||
|
{
|
||||||
|
if (level.isEmpty()) { return *this; } // nothing removed
|
||||||
|
CAircraftCategoryList removed;
|
||||||
|
for (const CAircraftCategory &category : * this)
|
||||||
|
{
|
||||||
|
if (category.matchesLevel(level)) { continue; }
|
||||||
|
removed.push_back(category);
|
||||||
|
}
|
||||||
|
return removed;
|
||||||
|
}
|
||||||
|
|
||||||
CAircraftCategoryList CAircraftCategoryList::fromDatabaseJson(const QJsonArray &array)
|
CAircraftCategoryList CAircraftCategoryList::fromDatabaseJson(const QJsonArray &array)
|
||||||
{
|
{
|
||||||
CAircraftCategoryList categories;
|
CAircraftCategoryList categories;
|
||||||
|
|||||||
@@ -21,6 +21,7 @@
|
|||||||
#include <QJsonArray>
|
#include <QJsonArray>
|
||||||
#include <QMetaType>
|
#include <QMetaType>
|
||||||
#include <QSet>
|
#include <QSet>
|
||||||
|
#include <QList>
|
||||||
#include <tuple>
|
#include <tuple>
|
||||||
|
|
||||||
namespace BlackMisc
|
namespace BlackMisc
|
||||||
@@ -57,12 +58,28 @@ namespace BlackMisc
|
|||||||
//! All levels sorted
|
//! All levels sorted
|
||||||
QList<int> getFirstLevels() const;
|
QList<int> getFirstLevels() const;
|
||||||
|
|
||||||
|
//! Find highest (top) level of categories
|
||||||
|
CAircraftCategoryList findHighestLevels(const CAircraftCategoryList &categories);
|
||||||
|
|
||||||
//! Find by first level
|
//! Find by first level
|
||||||
CAircraftCategoryList findByFirstLevel(int level) const;
|
CAircraftCategoryList findByFirstLevel(int level) const;
|
||||||
|
|
||||||
|
//! Find by levels
|
||||||
|
CAircraftCategoryList findByLevel(const QList<int> &level) const;
|
||||||
|
|
||||||
//! Find first levels
|
//! Find first levels
|
||||||
CAircraftCategoryList findFirstLevels() const;
|
CAircraftCategoryList findFirstLevels() const;
|
||||||
|
|
||||||
|
//! Find siblings
|
||||||
|
//! \remark if level is 3.2, siblings are 3.1 and 3.3
|
||||||
|
CAircraftCategoryList findSiblings(const CAircraftCategory &category) const;
|
||||||
|
|
||||||
|
//! Remove by level
|
||||||
|
int removeIfLevel(const QList<int> &level);
|
||||||
|
|
||||||
|
//! With removed categories
|
||||||
|
CAircraftCategoryList removedLevel(const QList<int> &level) const;
|
||||||
|
|
||||||
//! From our database JSON format
|
//! From our database JSON format
|
||||||
static CAircraftCategoryList fromDatabaseJson(const QJsonArray &array);
|
static CAircraftCategoryList fromDatabaseJson(const QJsonArray &array);
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user