diff --git a/src/blackgui/filters/aircrafticaofilterbar.cpp b/src/blackgui/filters/aircrafticaofilterbar.cpp index c1e292d8d..00badd445 100644 --- a/src/blackgui/filters/aircrafticaofilterbar.cpp +++ b/src/blackgui/filters/aircrafticaofilterbar.cpp @@ -12,16 +12,20 @@ #include "blackgui/filters/filterbarbuttons.h" #include "blackgui/models/aircrafticaofilter.h" #include "blackgui/uppercasevalidator.h" +#include "blackgui/guiapplication.h" +#include "blackcore/webdataservices.h" #include "blackmisc/aviation/aircrafticaocode.h" #include "blackmisc/aviation/aircrafticaocodelist.h" #include "ui_aircrafticaofilterbar.h" #include #include +#include using namespace BlackMisc::Aviation; using namespace BlackGui; using namespace BlackGui::Models; +using namespace BlackCore; namespace BlackGui { @@ -37,11 +41,19 @@ namespace BlackGui connect(ui->le_Manufacturer, &QLineEdit::returnPressed, this, &CFilterWidget::triggerFilter); connect(ui->le_Description, &QLineEdit::returnPressed, this, &CFilterWidget::triggerFilter); connect(ui->le_Id, &QLineEdit::returnPressed, this, &CFilterWidget::triggerFilter); + connect(ui->le_Family, &QLineEdit::returnPressed, this, &CFilterWidget::triggerFilter); ui->le_Designator->setValidator(new CUpperCaseValidator(ui->le_Designator)); + ui->le_Family->setValidator(new CUpperCaseValidator(ui->le_Family)); ui->le_Manufacturer->setValidator(new CUpperCaseValidator(ui->le_Manufacturer)); ui->le_Id->setValidator(new QIntValidator(ui->le_Id)); + if (sGui && sGui->hasWebDataServices()) + { + connect(sGui->getWebDataServices(), &CWebDataServices::swiftDbAircraftIcaoRead, this, &CAircraftIcaoFilterBar::initCompleters); + this->initCompleters(); + } + // reset form this->clearForm(); } @@ -54,6 +66,7 @@ namespace BlackGui return std::make_unique( convertDbId(ui->le_Id->text()), ui->le_Designator->text(), + ui->le_Family->text(), ui->le_Manufacturer->text(), ui->le_Description->text(), ui->combinedType_Selector->getCombinedType() @@ -107,5 +120,21 @@ namespace BlackGui ui->le_Description->clear(); ui->combinedType_Selector->clear(); } + + void CAircraftIcaoFilterBar::initCompleters() + { + if (m_hasCompleters) { return; } + if (!sGui || !sGui->hasWebDataServices()) { return; } + + if (sGui->getWebDataServices()->getAircraftIcaoCodesCount() < 1) { return; } + m_hasCompleters = true; + const CAircraftIcaoCodeList codes = sGui->getWebDataServices()->getAircraftIcaoCodes(); + const QStringList designators = codes.allIcaoCodes().toList(); + ui->le_Designator->setCompleter(new QCompleter(designators, ui->le_Designator)); + const QStringList families = codes.allFamilies().toList(); + ui->le_Family->setCompleter(new QCompleter(families, ui->le_Family)); + const QStringList manufacturers = codes.allManufacturers().toList(); + ui->le_Manufacturer->setCompleter(new QCompleter(manufacturers, ui->le_Manufacturer)); + } } // ns } // nss diff --git a/src/blackgui/filters/aircrafticaofilterbar.h b/src/blackgui/filters/aircrafticaofilterbar.h index a7941e857..751637e04 100644 --- a/src/blackgui/filters/aircrafticaofilterbar.h +++ b/src/blackgui/filters/aircrafticaofilterbar.h @@ -31,7 +31,6 @@ namespace BlackMisc } } namespace Ui { class CAircraftIcaoFilterBar; } - namespace BlackGui { namespace Filters @@ -50,7 +49,7 @@ namespace BlackGui explicit CAircraftIcaoFilterBar(QWidget *parent = nullptr); //! Destructor - ~CAircraftIcaoFilterBar(); + virtual ~CAircraftIcaoFilterBar(); //! \copydoc Models::IModelFilterProvider::createModelFilter std::unique_ptr > createModelFilter() const override; @@ -71,8 +70,11 @@ namespace BlackGui private: QScopedPointer ui; - }; + bool m_hasCompleters = false; + //! Set the completers + void initCompleters(); + }; } // ns } // ns diff --git a/src/blackgui/filters/aircrafticaofilterbar.ui b/src/blackgui/filters/aircrafticaofilterbar.ui index 91e5e4b69..bac9ea7bc 100644 --- a/src/blackgui/filters/aircrafticaofilterbar.ui +++ b/src/blackgui/filters/aircrafticaofilterbar.ui @@ -78,7 +78,7 @@ - 50 + 75 16777215 @@ -172,7 +172,7 @@ - + @@ -188,13 +188,36 @@ - + Combined: + + + + Family: + + + + + + + + 75 + 16777215 + + + + 10 + + + Family + + + diff --git a/src/blackgui/models/aircrafticaofilter.cpp b/src/blackgui/models/aircrafticaofilter.cpp index 8e7423b3d..0e43ae2dc 100644 --- a/src/blackgui/models/aircrafticaofilter.cpp +++ b/src/blackgui/models/aircrafticaofilter.cpp @@ -18,21 +18,24 @@ namespace BlackGui { CAircraftIcaoFilter::CAircraftIcaoFilter( int id, - const QString &designator, const QString &name, + const QString &designator, const QString &family, const QString &manufacturer, const QString &description, const QString &combinedType) : m_id(id), - m_designator(designator.trimmed().toUpper()), m_manufacturer(name.trimmed()), - m_description(description.trimmed()), m_combinedType(combinedType.trimmed().toUpper()) + m_designator(designator.trimmed().toUpper()), + m_family(family.trimmed().toUpper()), + m_manufacturer(manufacturer.trimmed()), + m_description(description.trimmed()), + m_combinedType(combinedType.trimmed().toUpper()) { this->m_valid = !(this->m_id < 0 && this->m_combinedType.isEmpty() && this->m_designator.isEmpty() && - this->m_description.isEmpty() && this->m_manufacturer.isEmpty()); + this->m_family.isEmpty() && this->m_description.isEmpty() && this->m_manufacturer.isEmpty()); } CAircraftIcaoCodeList CAircraftIcaoFilter::filter(const CAircraftIcaoCodeList &inContainer) const { if (!this->isValid()) { return inContainer; } CAircraftIcaoCodeList outContainer; - bool filterCombinedCode = !this->m_combinedType.isEmpty() && !this->m_combinedType.contains('-') && CAircraftIcaoCode::isValidCombinedType(this->m_combinedType); + const bool filterCombinedCode = !this->m_combinedType.isEmpty() && !this->m_combinedType.contains('-') && CAircraftIcaoCode::isValidCombinedType(this->m_combinedType); for (const CAircraftIcaoCode &icao : inContainer) { @@ -50,13 +53,21 @@ namespace BlackGui { if (!this->stringMatchesFilterExpression(icao.getDesignator(), m_designator)) { continue; } } + if (!m_family.isEmpty()) + { + if (!this->stringMatchesFilterExpression(icao.getFamily(), m_family)) { continue; } + } if (!m_manufacturer.isEmpty()) { if (!this->stringMatchesFilterExpression(icao.getManufacturer(), m_manufacturer)) { continue; } } if (!m_description.isEmpty()) { - if (!this->stringMatchesFilterExpression(icao.getModelDescription(), m_description)) { continue; } + const bool ignore = + !this->stringMatchesFilterExpression(icao.getModelDescription(), m_description) && + !this->stringMatchesFilterExpression(icao.getModelSwiftDescription(), m_description) && + !this->stringMatchesFilterExpression(icao.getModelIataDescription(), m_description); + if (ignore) { continue; } } if (filterCombinedCode) { diff --git a/src/blackgui/models/aircrafticaofilter.h b/src/blackgui/models/aircrafticaofilter.h index 8a5d25711..e48e8e058 100644 --- a/src/blackgui/models/aircrafticaofilter.h +++ b/src/blackgui/models/aircrafticaofilter.h @@ -22,7 +22,6 @@ namespace BlackGui { namespace Models { - //! Filter for aircraft ICAO data class BLACKGUI_EXPORT CAircraftIcaoFilter : public IModelFilter @@ -31,6 +30,7 @@ namespace BlackGui //! Constructor CAircraftIcaoFilter(int id, const QString &designator, + const QString &family, const QString &manufacturer, const QString &description, const QString &combinedType); @@ -41,11 +41,11 @@ namespace BlackGui private: int m_id = -1; QString m_designator; + QString m_family; QString m_manufacturer; QString m_description; QString m_combinedType; }; - } // namespace } // namespace diff --git a/src/blackgui/models/aircrafticaolistmodel.cpp b/src/blackgui/models/aircrafticaolistmodel.cpp index 2e4e0fa8f..79fe64034 100644 --- a/src/blackgui/models/aircrafticaolistmodel.cpp +++ b/src/blackgui/models/aircrafticaolistmodel.cpp @@ -32,12 +32,13 @@ namespace BlackGui this->m_columns.addColumn(CColumn::standardValueObject("rank", CAircraftIcaoCode::IndexRank, CDefaultFormatter::alignRightVCenter())); this->m_columns.addColumn(CColumn::standardString("manufacturer", CAircraftIcaoCode::IndexManufacturer)); this->m_columns.addColumn(CColumn::standardString("family", CAircraftIcaoCode::IndexFamily)); - this->m_columns.addColumn(CColumn::standardString("desc.", "description", CAircraftIcaoCode::IndexModelDescription)); - this->m_columns.addColumn(CColumn::standardString("code", "combined code", CAircraftIcaoCode::IndexCombinedAircraftType)); + this->m_columns.addColumn(CColumn::standardString("ICAO desc.", "ICAO description", CAircraftIcaoCode::IndexModelDescription)); + this->m_columns.addColumn(CColumn::standardString("IATA desc.", "IATA description", CAircraftIcaoCode::IndexModelIataDescription)); + this->m_columns.addColumn(CColumn::standardString("swift desc.", "swift description", CAircraftIcaoCode::IndexModelSwiftDescription)); + this->m_columns.addColumn(CColumn::standardString("type", "combined type", CAircraftIcaoCode::IndexCombinedAircraftType)); this->m_columns.addColumn(CColumn::standardString("WTC", "wake turbulence category", CAircraftIcaoCode::IndexWtc)); this->m_columns.addColumn(CColumn("mil.", "military", CAircraftIcaoCode::IndexIsMilitary, new CBoolIconFormatter("military", "civil"))); - this->m_columns.addColumn(CColumn("VTOL", "vertical take-off and landing", CAircraftIcaoCode::IndexIsVtol, new CBoolIconFormatter("VTOL", "non VTOL"))); - this->m_columns.addColumn(CColumn("leg.", "legacy", CAircraftIcaoCode::IndexIsLegacy, new CBoolIconFormatter("legacy", "operating"))); + this->m_columns.addColumn(CColumn("VTOL", "vertical take-off and landing", CAircraftIcaoCode::IndexIsVtol, new CBoolIconFormatter("VTOL", "non VTOL"))); this->m_columns.addColumn(CColumn("leg.", "legacy", CAircraftIcaoCode::IndexIsLegacy, new CBoolIconFormatter("legacy", "operating"))); this->m_columns.addColumn(CColumn("real.", "real world aircraft", CAircraftIcaoCode::IndexIsRealworld, new CBoolIconFormatter("real", "non real"))); this->m_columns.addColumn(CColumn::standardString("changed", CAircraftIcaoCode::IndexUtcTimestampFormattedYmdhms));