Better performance for filter

* valid filter flag only calculated once
* Better removal detection of filter dialog
This commit is contained in:
Klaus Basan
2016-04-08 13:57:39 +02:00
parent 5254d0ff71
commit e877c6dba5
17 changed files with 56 additions and 57 deletions

View File

@@ -11,6 +11,7 @@
#include "ui_aircraftmodelfilterdialog.h" #include "ui_aircraftmodelfilterdialog.h"
using namespace BlackGui::Models; using namespace BlackGui::Models;
using namespace BlackGui::Filters;
using namespace BlackMisc::Simulation; using namespace BlackMisc::Simulation;
using namespace BlackMisc::Network; using namespace BlackMisc::Network;
@@ -25,6 +26,7 @@ namespace BlackGui
ui->setupUi(this); ui->setupUi(this);
this->setWindowTitle("Filter models"); this->setWindowTitle("Filter models");
this->resize(640, 100); this->resize(640, 100);
connect(ui->filter_Models, &CAircraftModelFilterBar::rejectDialog, this, &CAircraftModelFilterDialog::reject);
} }
CAircraftModelFilterDialog::~CAircraftModelFilterDialog() CAircraftModelFilterDialog::~CAircraftModelFilterDialog()

View File

@@ -12,8 +12,8 @@
#ifndef BLACKGUI_FILTERS_AIRCRAFTMODELFILTERFORM_H #ifndef BLACKGUI_FILTERS_AIRCRAFTMODELFILTERFORM_H
#define BLACKGUI_FILTERS_AIRCRAFTMODELFILTERFORM_H #define BLACKGUI_FILTERS_AIRCRAFTMODELFILTERFORM_H
#include "blackgui/blackguiexport.h"
#include "filterdialog.h" #include "filterdialog.h"
#include "blackgui/blackguiexport.h"
#include "blackgui/models/aircraftmodelfilter.h" #include "blackgui/models/aircraftmodelfilter.h"
#include <QDialog> #include <QDialog>
#include <QScopedPointer> #include <QScopedPointer>

View File

@@ -55,6 +55,7 @@ namespace BlackGui
break; break;
case CFilterBarButtons::RemoveFilter: case CFilterBarButtons::RemoveFilter:
emit changeFilter(false); emit changeFilter(false);
emit rejectDialog();
break; break;
case CFilterBarButtons::ClearForm: case CFilterBarButtons::ClearForm:
clearForm(); clearForm();

View File

@@ -43,6 +43,9 @@ namespace BlackGui
//! Change the filter by enabling or disabling it //! Change the filter by enabling or disabling it
void changeFilter(bool enable); void changeFilter(bool enable);
//! A filter dialog is supposed to close
void rejectDialog();
protected: protected:
//! Set and connect filter bar buttonsd //! Set and connect filter bar buttonsd
void setButtonsAndCount(CFilterBarButtons *buttons); void setButtonsAndCount(CFilterBarButtons *buttons);

View File

@@ -21,7 +21,10 @@ namespace BlackGui
const QString &description, const QString &combinedType) : const QString &description, const QString &combinedType) :
m_designator(designator.trimmed().toUpper()), m_manufacturer(name.trimmed()), m_designator(designator.trimmed().toUpper()), m_manufacturer(name.trimmed()),
m_description(description.trimmed()), m_combinedType(combinedType.trimmed().toUpper()) m_description(description.trimmed()), m_combinedType(combinedType.trimmed().toUpper())
{ } {
this->m_valid = !(this->m_combinedType.isEmpty() && this->m_designator.isEmpty() &&
this->m_description.isEmpty() && this->m_manufacturer.isEmpty());
}
CAircraftIcaoCodeList CAircraftIcaoFilter::filter(const CAircraftIcaoCodeList &inContainer) const CAircraftIcaoCodeList CAircraftIcaoFilter::filter(const CAircraftIcaoCodeList &inContainer) const
{ {
@@ -51,12 +54,5 @@ namespace BlackGui
} }
return outContainer; return outContainer;
} }
bool CAircraftIcaoFilter::isValid() const
{
return !(this->m_combinedType.isEmpty() && this->m_designator.isEmpty() &&
this->m_description.isEmpty() && this->m_manufacturer.isEmpty());
}
} // namespace } // namespace
} // namespace } // namespace

View File

@@ -35,9 +35,6 @@ namespace BlackGui
//! \copydoc IModelFilter::filter //! \copydoc IModelFilter::filter
virtual BlackMisc::Aviation::CAircraftIcaoCodeList filter(const BlackMisc::Aviation::CAircraftIcaoCodeList &inContainer) const override; virtual BlackMisc::Aviation::CAircraftIcaoCodeList filter(const BlackMisc::Aviation::CAircraftIcaoCodeList &inContainer) const override;
//! \copydoc IModelFilter::isValid
virtual bool isValid() const override;
private: private:
QString m_designator; QString m_designator;
QString m_manufacturer; QString m_manufacturer;

View File

@@ -28,7 +28,9 @@ namespace BlackGui
m_liveryCode(liveryCode.trimmed().toUpper()), m_liveryCode(liveryCode.trimmed().toUpper()),
m_simulatorInfo(simInfo), m_simulatorInfo(simInfo),
m_distributor(distributor) m_distributor(distributor)
{ } {
m_valid = valid();
}
BlackMisc::Simulation::CAircraftModelList CAircraftModelFilter::filter(const CAircraftModelList &inContainer) const BlackMisc::Simulation::CAircraftModelList CAircraftModelFilter::filter(const CAircraftModelList &inContainer) const
{ {
@@ -91,16 +93,19 @@ namespace BlackGui
return outContainer; return outContainer;
} }
bool CAircraftModelFilter::isValid() const
bool CAircraftModelFilter::valid() const
{ {
return !(this->m_modelKey.isEmpty() && this->m_description.isEmpty() && const bool allEmpty = this->m_modelKey.isEmpty() && this->m_description.isEmpty() &&
(this->m_modelMode != CAircraftModel::Undefined && this->m_modelMode != CAircraftModel::All) && this->m_aircraftManufacturer.isEmpty() && this->m_aircraftIcao.isEmpty() &&
this->m_aircraftManufacturer.isEmpty() && this->m_aircraftIcao.isEmpty() && this->m_airlineIcao.isEmpty() && this->m_airlineName.isEmpty() &&
this->m_airlineIcao.isEmpty() && this->m_airlineName.isEmpty() && this->m_liveryCode.isEmpty();
this->m_liveryCode.isEmpty() && if (!allEmpty) { return true; }
!this->m_distributor.hasValidDbKey() && const bool noSim = this->m_simulatorInfo.isNoSimulator() || this->m_simulatorInfo.isAllSimulators();
(this->m_simulatorInfo.isNoSimulator() || this->m_simulatorInfo.isAllSimulators()) const bool noMode = this->m_modelMode == CAircraftModel::Undefined || this->m_modelMode == CAircraftModel::All;
); const bool noKey = !this->m_distributor.hasValidDbKey();
return !(noSim && noMode && noKey);
} }
} // namespace } // namespace

View File

@@ -36,9 +36,6 @@ namespace BlackGui
//! \copydoc IModelFilter::filter //! \copydoc IModelFilter::filter
virtual BlackMisc::Simulation::CAircraftModelList filter(const BlackMisc::Simulation::CAircraftModelList &inContainer) const override; virtual BlackMisc::Simulation::CAircraftModelList filter(const BlackMisc::Simulation::CAircraftModelList &inContainer) const override;
//! \copydoc IModelFilter::isValid
virtual bool isValid() const override;
private: private:
QString m_modelKey; QString m_modelKey;
QString m_description; QString m_description;
@@ -49,9 +46,9 @@ namespace BlackGui
QString m_airlineName; QString m_airlineName;
QString m_liveryCode; QString m_liveryCode;
BlackMisc::Simulation::CSimulatorInfo m_simulatorInfo; BlackMisc::Simulation::CSimulatorInfo m_simulatorInfo;
BlackMisc::Simulation::CDistributor m_distributor; BlackMisc::Simulation::CDistributor m_distributor;
bool valid() const;
}; };
} // namespace } // namespace
} // namespace } // namespace

View File

@@ -20,7 +20,11 @@ namespace BlackGui
const QString &countryIso, bool isReal, bool isVa) : const QString &countryIso, bool isReal, bool isVa) :
m_vDesignator(vDesignator.trimmed().toUpper()), m_name(name.trimmed()), m_vDesignator(vDesignator.trimmed().toUpper()), m_name(name.trimmed()),
m_countryIso(countryIso.trimmed().toUpper()), m_real(isReal), m_va(isVa) m_countryIso(countryIso.trimmed().toUpper()), m_real(isReal), m_va(isVa)
{ } {
this->m_valid = !(this->m_countryIso.isEmpty() && this->m_vDesignator.isEmpty() &&
this->m_name.isEmpty() &&
!m_va && !m_real);
}
CAirlineIcaoCodeList CAirlineIcaoFilter::filter(const CAirlineIcaoCodeList &inContainer) const CAirlineIcaoCodeList CAirlineIcaoFilter::filter(const CAirlineIcaoCodeList &inContainer) const
{ {
@@ -59,13 +63,5 @@ namespace BlackGui
} }
return outContainer; return outContainer;
} }
bool CAirlineIcaoFilter::isValid() const
{
return !(this->m_countryIso.isEmpty() && this->m_vDesignator.isEmpty() &&
this->m_name.isEmpty() &&
!m_va && !m_real);
}
} // namespace } // namespace
} // namespace } // namespace

View File

@@ -31,9 +31,6 @@ namespace BlackGui
//! \copydoc IModelFilter::filter //! \copydoc IModelFilter::filter
virtual BlackMisc::Aviation::CAirlineIcaoCodeList filter(const BlackMisc::Aviation::CAirlineIcaoCodeList &inContainer) const override; virtual BlackMisc::Aviation::CAirlineIcaoCodeList filter(const BlackMisc::Aviation::CAirlineIcaoCodeList &inContainer) const override;
//! \copydoc IModelFilter::isValid
virtual bool isValid() const override;
private: private:
QString m_vDesignator; QString m_vDesignator;
QString m_name; QString m_name;

View File

@@ -18,7 +18,9 @@ namespace BlackGui
{ {
CCountryFilter::CCountryFilter(const QString &isoCode, const QString &name) : CCountryFilter::CCountryFilter(const QString &isoCode, const QString &name) :
m_isoCode(isoCode.trimmed().toUpper()), m_name(name.trimmed()) m_isoCode(isoCode.trimmed().toUpper()), m_name(name.trimmed())
{ } {
this->m_valid = !(this->m_isoCode.isEmpty() && this->m_name.isEmpty());
}
CCountryList CCountryFilter::filter(const CCountryList &inContainer) const CCountryList CCountryFilter::filter(const CCountryList &inContainer) const
{ {
@@ -43,11 +45,5 @@ namespace BlackGui
} }
return outContainer; return outContainer;
} }
bool CCountryFilter::isValid() const
{
return !(this->m_isoCode.isEmpty() && this->m_name.isEmpty());
}
} // namespace } // namespace
} // namespace } // namespace

View File

@@ -30,9 +30,6 @@ namespace BlackGui
//! \copydoc IModelFilter::filter //! \copydoc IModelFilter::filter
virtual BlackMisc::CCountryList filter(const BlackMisc::CCountryList &inContainer) const override; virtual BlackMisc::CCountryList filter(const BlackMisc::CCountryList &inContainer) const override;
//! \copydoc IModelFilter::isValid
virtual bool isValid() const override;
private: private:
QString m_isoCode; QString m_isoCode;
QString m_name; QString m_name;

View File

@@ -350,7 +350,8 @@ namespace BlackGui
template <typename ObjectType, typename ContainerType, bool UseCompare> template <typename ObjectType, typename ContainerType, bool UseCompare>
bool CListModelBase<ObjectType, ContainerType, UseCompare>::hasFilter() const bool CListModelBase<ObjectType, ContainerType, UseCompare>::hasFilter() const
{ {
return m_filter && m_filter->isValid() ? true : false; const bool f = m_filter && m_filter->isValid();
return f;
} }
template <typename ObjectType, typename ContainerType, bool UseCompare> template <typename ObjectType, typename ContainerType, bool UseCompare>

View File

@@ -23,7 +23,9 @@ namespace BlackGui
m_airlineIcaoDesignator(airlineDesignator.trimmed().toUpper()), m_airlineIcaoDesignator(airlineDesignator.trimmed().toUpper()),
m_fuselageColor(fuselageColor), m_tailColor(tailColor), m_maxColorDistance(maxColorDistance), m_fuselageColor(fuselageColor), m_tailColor(tailColor), m_maxColorDistance(maxColorDistance),
m_colorLiveries(colorLiveries), m_airlineLiveries(airlineLiveries) m_colorLiveries(colorLiveries), m_airlineLiveries(airlineLiveries)
{ } {
this->m_valid = valid();
}
CLiveryList CLiveryFilter::filter(const CLiveryList &inContainer) const CLiveryList CLiveryFilter::filter(const CLiveryList &inContainer) const
{ {
@@ -63,7 +65,7 @@ namespace BlackGui
return outContainer; return outContainer;
} }
bool CLiveryFilter::isValid() const bool CLiveryFilter::valid() const
{ {
if (filterByLiveryType()) { return true; } if (filterByLiveryType()) { return true; }
if (m_fuselageColor.isValid() || m_tailColor.isValid()) { return true; } if (m_fuselageColor.isValid() || m_tailColor.isValid()) { return true; }

View File

@@ -39,9 +39,6 @@ namespace BlackGui
//! \copydoc IModelFilter::filter //! \copydoc IModelFilter::filter
virtual BlackMisc::Aviation::CLiveryList filter(const BlackMisc::Aviation::CLiveryList &inContainer) const override; virtual BlackMisc::Aviation::CLiveryList filter(const BlackMisc::Aviation::CLiveryList &inContainer) const override;
//! \copydoc IModelFilter::isValid
virtual bool isValid() const override;
private: private:
QString m_combinedCode; QString m_combinedCode;
QString m_description; QString m_description;
@@ -54,6 +51,9 @@ namespace BlackGui
//! Filter by livery type such as color or airline liveries //! Filter by livery type such as color or airline liveries
bool filterByLiveryType() const; bool filterByLiveryType() const;
//! Valid filter?
bool valid() const;
}; };
} // namespace } // namespace

View File

@@ -34,7 +34,7 @@ namespace BlackGui
virtual ContainerType filter(const ContainerType &container) const = 0; virtual ContainerType filter(const ContainerType &container) const = 0;
//! Anything to do? //! Anything to do?
virtual bool isValid() const = 0; bool isValid() const { return this->m_valid; }
//! Enabled? //! Enabled?
virtual bool isEnabled() const { return m_enabled && isValid(); } virtual bool isEnabled() const { return m_enabled && isValid(); }
@@ -49,6 +49,8 @@ namespace BlackGui
//! Remove the * wildcards //! Remove the * wildcards
QString stripWildcard(const QString &value) const; QString stripWildcard(const QString &value) const;
bool m_valid = false; //!< is filter valid
private: private:
bool m_enabled = true; bool m_enabled = true;
}; };

View File

@@ -1094,7 +1094,14 @@ namespace BlackGui
Q_ASSERT_X(provider, Q_FUNC_INFO, "Filter widget does not provide interface"); Q_ASSERT_X(provider, Q_FUNC_INFO, "Filter widget does not provide interface");
if (!provider) { return false; } if (!provider) { return false; }
std::unique_ptr<IModelFilter<ContainerType>> f(provider->createModelFilter()); std::unique_ptr<IModelFilter<ContainerType>> f(provider->createModelFilter());
this->takeFilterOwnership(f); if (f->isValid())
{
this->takeFilterOwnership(f);
}
else
{
this->removeFilter();
}
} }
} }
else else