refs #768, improved selectors

* added focus proxy
* using &QLineEdit::editingFinished as signal (changes value also when focus is lost)
* use enum to set how values are displayed
* search for DB values by leveraging the smart selector functions
* added isSet functions
* minor renamings/formatting
This commit is contained in:
Klaus Basan
2016-10-17 02:39:26 +02:00
parent ac331d1d4f
commit 93f0e6582b
10 changed files with 139 additions and 49 deletions

View File

@@ -45,10 +45,11 @@ namespace BlackGui
ui(new Ui::CDbAircraftIcaoSelectorComponent) ui(new Ui::CDbAircraftIcaoSelectorComponent)
{ {
ui->setupUi(this); ui->setupUi(this);
this->setFocusProxy(ui->le_Aircraft);
this->setAcceptDrops(true); this->setAcceptDrops(true);
this->setAcceptedMetaTypeIds({qMetaTypeId<CAircraftIcaoCode>(), qMetaTypeId<CAircraftIcaoCodeList>()}); this->setAcceptedMetaTypeIds({qMetaTypeId<CAircraftIcaoCode>(), qMetaTypeId<CAircraftIcaoCodeList>()});
ui->le_Aircraft->setValidator(new CUpperCaseValidator(this)); ui->le_Aircraft->setValidator(new CUpperCaseValidator(this));
connect(ui->le_Aircraft, &QLineEdit::returnPressed, this, &CDbAircraftIcaoSelectorComponent::ps_dataChanged); connect(ui->le_Aircraft, &QLineEdit::editingFinished, this, &CDbAircraftIcaoSelectorComponent::ps_dataChanged);
connect(sApp->getWebDataServices(), &CWebDataServices::dataRead, this, &CDbAircraftIcaoSelectorComponent::ps_codesRead); connect(sApp->getWebDataServices(), &CWebDataServices::dataRead, this, &CDbAircraftIcaoSelectorComponent::ps_codesRead);
this->ps_codesRead(CEntityFlags::AircraftIcaoEntity, CEntityFlags::ReadFinished, sApp->getWebDataServices()->getAircraftIcaoCodesCount()); this->ps_codesRead(CEntityFlags::AircraftIcaoEntity, CEntityFlags::ReadFinished, sApp->getWebDataServices()->getAircraftIcaoCodesCount());
} }
@@ -58,19 +59,26 @@ namespace BlackGui
void CDbAircraftIcaoSelectorComponent::setAircraftIcao(const CAircraftIcaoCode &icao) void CDbAircraftIcaoSelectorComponent::setAircraftIcao(const CAircraftIcaoCode &icao)
{ {
QString icaoStr(icao.getDesignator()); CAircraftIcaoCode setIcao(icao);
ui->le_Aircraft->setText(icaoStr); if (!icao.isLoadedFromDb())
ui->lbl_Description->setText(icao.getManufacturer());
if (icao != m_currentIcao)
{ {
m_currentIcao = icao; // resolve against DB
emit changedAircraftIcao(icao); setIcao = sGui->getWebDataServices()->smartAircraftIcaoSelector(icao);
}
const QString icaoStr(this->m_display == DisplayIcaoAndId ? setIcao.getDesignatorDbKey() : setIcao.getCombinedIcaoStringWithKey());
ui->le_Aircraft->setText(icaoStr);
ui->lbl_Description->setText(setIcao.getManufacturer());
if (setIcao != m_currentIcao)
{
m_currentIcao = setIcao;
emit changedAircraftIcao(setIcao);
} }
} }
void CDbAircraftIcaoSelectorComponent::setAircraftIcao(int key) void CDbAircraftIcaoSelectorComponent::setAircraftIcao(int key)
{ {
CAircraftIcaoCode icao(sGui->getWebDataServices()->getAircraftIcaoCodeForDbKey(key)); const CAircraftIcaoCode icao(sGui->getWebDataServices()->getAircraftIcaoCodeForDbKey(key));
ui->lbl_Description->setText(""); ui->lbl_Description->setText("");
if (icao.hasCompleteData()) if (icao.hasCompleteData())
{ {
@@ -84,6 +92,7 @@ namespace BlackGui
int key = CDatastoreUtility::extractIntegerKey(text); int key = CDatastoreUtility::extractIntegerKey(text);
if (key < 0) if (key < 0)
{ {
if (this->m_currentIcao.getDesignator() == text) { return this->m_currentIcao; }
return CAircraftIcaoCode(text); return CAircraftIcaoCode(text);
} }
CAircraftIcaoCode icao(sGui->getWebDataServices()->getAircraftIcaoCodeForDbKey(key)); CAircraftIcaoCode icao(sGui->getWebDataServices()->getAircraftIcaoCodeForDbKey(key));
@@ -100,14 +109,15 @@ namespace BlackGui
return stripDesignatorFromCompleterString(ui->le_Aircraft->text()); return stripDesignatorFromCompleterString(ui->le_Aircraft->text());
} }
void CDbAircraftIcaoSelectorComponent::withIcaoDescription(bool description) void CDbAircraftIcaoSelectorComponent::displayWithIcaoDescription(bool description)
{ {
ui->lbl_Description->setVisible(description); ui->lbl_Description->setVisible(description);
} }
bool CDbAircraftIcaoSelectorComponent::isSet() const bool CDbAircraftIcaoSelectorComponent::isSet() const
{ {
return this->getAircraftIcao().hasCompleteData(); const CAircraftIcaoCode icao(this->getAircraftIcao());
return icao.isLoadedFromDb() || icao.hasCompleteData();
} }
void CDbAircraftIcaoSelectorComponent::clear() void CDbAircraftIcaoSelectorComponent::clear()
@@ -155,17 +165,27 @@ namespace BlackGui
} }
} }
const QStringList &CDbAircraftIcaoSelectorComponent::completerStrings()
{
// done for performance reasons
// init only once, future instance can share thte list
// only to be called when data are read!
static const QStringList cs(sGui->getWebDataServices()->getAircraftIcaoCodes().toCompleterStrings(true, true, true));
return cs;
}
void CDbAircraftIcaoSelectorComponent::ps_codesRead(CEntityFlags::Entity entity, CEntityFlags::ReadState readState, int count) void CDbAircraftIcaoSelectorComponent::ps_codesRead(CEntityFlags::Entity entity, CEntityFlags::ReadState readState, int count)
{ {
if (!sGui) { return; } if (!sGui || !sGui->hasWebDataServices()) { return; }
if (entity.testFlag(CEntityFlags::AircraftIcaoEntity) && readState == CEntityFlags::ReadFinished) if (entity.testFlag(CEntityFlags::AircraftIcaoEntity) && readState == CEntityFlags::ReadFinished)
{ {
if (count > 0) if (count > 0)
{ {
QCompleter *c = new QCompleter(sGui->getWebDataServices()->getAircraftIcaoCodes().toCompleterStrings(true, true, true), this); QCompleter *c = new QCompleter(completerStrings(), this);
c->setCaseSensitivity(Qt::CaseInsensitive); c->setCaseSensitivity(Qt::CaseInsensitive);
c->setCompletionMode(QCompleter::PopupCompletion); c->setCompletionMode(QCompleter::PopupCompletion);
c->setMaxVisibleItems(10); c->setMaxVisibleItems(10);
c->popup()->setMinimumWidth(175);
this->connect(c, static_cast<void (QCompleter::*)(const QString &)>(&QCompleter::activated), this, &CDbAircraftIcaoSelectorComponent::ps_completerActivated); this->connect(c, static_cast<void (QCompleter::*)(const QString &)>(&QCompleter::activated), this, &CDbAircraftIcaoSelectorComponent::ps_completerActivated);
ui->le_Aircraft->setCompleter(c); ui->le_Aircraft->setCompleter(c);
@@ -182,18 +202,27 @@ namespace BlackGui
void CDbAircraftIcaoSelectorComponent::ps_dataChanged() void CDbAircraftIcaoSelectorComponent::ps_dataChanged()
{ {
if (!sGui) { return; } if (!sGui || !sGui->hasWebDataServices()) { return; }
int key = CDatastoreUtility::extractIntegerKey(ui->le_Aircraft->text()); const int key = CDatastoreUtility::extractIntegerKey(ui->le_Aircraft->text());
CAircraftIcaoCode icao(sGui->getWebDataServices()->getAircraftIcaoCodeForDbKey(key)); CAircraftIcaoCode icao;
if (key >= 0)
{
// with valid key
icao = sGui->getWebDataServices()->getAircraftIcaoCodeForDbKey(key);
}
else
{
const QString designator(this->getRawDesignator());
icao = sGui->getWebDataServices()->smartAircraftIcaoSelector(CAircraftIcaoCode(designator));
}
this->setAircraftIcao(icao); this->setAircraftIcao(icao);
} }
void CDbAircraftIcaoSelectorComponent::ps_completerActivated(const QString &icaoString) void CDbAircraftIcaoSelectorComponent::ps_completerActivated(const QString &icaoString)
{ {
int dbKey = CDatastoreUtility::extractIntegerKey(icaoString); const int dbKey = CDatastoreUtility::extractIntegerKey(icaoString);
if (dbKey < 0) { return; } if (dbKey < 0) { return; }
this->setAircraftIcao(dbKey); this->setAircraftIcao(dbKey);
} }
}// class }// class
} // ns } // ns

View File

@@ -30,7 +30,6 @@ class QDropEvent;
class QWidget; class QWidget;
namespace Ui { class CDbAircraftIcaoSelectorComponent; } namespace Ui { class CDbAircraftIcaoSelectorComponent; }
namespace BlackGui namespace BlackGui
{ {
namespace Components namespace Components
@@ -45,6 +44,13 @@ namespace BlackGui
Q_OBJECT Q_OBJECT
public: public:
//! How to display the info
enum Display
{
DisplayIcaoAndId,
DisplayCompleterString
};
//! Constructor //! Constructor
explicit CDbAircraftIcaoSelectorComponent(QWidget *parent = nullptr); explicit CDbAircraftIcaoSelectorComponent(QWidget *parent = nullptr);
@@ -67,7 +73,10 @@ namespace BlackGui
void setReadOnly(bool readOnly); void setReadOnly(bool readOnly);
//! Display distributor description //! Display distributor description
void withIcaoDescription(bool description); void displayWithIcaoDescription(bool description);
//! How to display string in text field
void displayMode(Display mode) { m_display = mode; }
//! Set with valid Distributor //! Set with valid Distributor
bool isSet() const; bool isSet() const;
@@ -106,7 +115,12 @@ namespace BlackGui
QScopedPointer<Ui::CDbAircraftIcaoSelectorComponent> ui; QScopedPointer<Ui::CDbAircraftIcaoSelectorComponent> ui;
QScopedPointer<QCompleter> m_completerIcaoDescription; QScopedPointer<QCompleter> m_completerIcaoDescription;
BlackMisc::Aviation::CAircraftIcaoCode m_currentIcao; BlackMisc::Aviation::CAircraftIcaoCode m_currentIcao;
Display m_display = DisplayIcaoAndId;
//! Get the completer strings
//! \remark shared for performance reasons
static const QStringList &completerStrings();
}; };
} } // ns
} } // ns
#endif // guard #endif // guard

View File

@@ -7,7 +7,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>189</width> <width>189</width>
<height>22</height> <height>24</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@@ -57,6 +57,9 @@
</item> </item>
</layout> </layout>
</widget> </widget>
<tabstops>
<tabstop>le_Aircraft</tabstop>
</tabstops>
<resources/> <resources/>
<connections/> <connections/>
</ui> </ui>

View File

@@ -61,8 +61,15 @@ namespace BlackGui
bool CDbAirlineIcaoSelectorBase::setAirlineIcao(const CAirlineIcaoCode &icao) bool CDbAirlineIcaoSelectorBase::setAirlineIcao(const CAirlineIcaoCode &icao)
{ {
if (icao == m_currentIcao) { return false; } if (icao == m_currentIcao) { return false; }
m_currentIcao = icao; if (icao.isLoadedFromDb())
emit changedAirlineIcao(icao); {
this->m_currentIcao = icao;
}
else
{
this->m_currentIcao = sGui->getWebDataServices()->smartAirlineIcaoSelector(icao);
}
emit changedAirlineIcao(this->m_currentIcao);
return true; return true;
} }
@@ -80,6 +87,12 @@ namespace BlackGui
} }
} }
bool CDbAirlineIcaoSelectorBase::isSet() const
{
const CAirlineIcaoCode icao(this->getAirlineIcao());
return icao.isLoadedFromDb() || icao.hasCompleteData();
}
void CDbAirlineIcaoSelectorBase::dragEnterEvent(QDragEnterEvent *event) void CDbAirlineIcaoSelectorBase::dragEnterEvent(QDragEnterEvent *event)
{ {
if (!event || !acceptDrop(event->mimeData())) { return; } if (!event || !acceptDrop(event->mimeData())) { return; }

View File

@@ -61,6 +61,9 @@ namespace BlackGui
//! Clear selection //! Clear selection
virtual void clear() = 0; virtual void clear() = 0;
//! Set with valid value
bool isSet() const;
signals: signals:
//! ICAO was changed //! ICAO was changed
void changedAirlineIcao(const BlackMisc::Aviation::CAirlineIcaoCode &icao); void changedAirlineIcao(const BlackMisc::Aviation::CAirlineIcaoCode &icao);

View File

@@ -36,14 +36,13 @@ namespace BlackGui
ui(new Ui::CDbAirlineIcaoSelectorComponent) ui(new Ui::CDbAirlineIcaoSelectorComponent)
{ {
ui->setupUi(this); ui->setupUi(this);
this->setFocusProxy(ui->le_Airline);
ui->le_Airline->setValidator(new CUpperCaseValidator(this)); ui->le_Airline->setValidator(new CUpperCaseValidator(this));
connect(ui->le_Airline, &QLineEdit::returnPressed, this, &CDbAirlineIcaoSelectorComponent::ps_dataChanged); connect(ui->le_Airline, &QLineEdit::editingFinished, this, &CDbAirlineIcaoSelectorComponent::ps_dataChanged);
} }
CDbAirlineIcaoSelectorComponent::~CDbAirlineIcaoSelectorComponent() CDbAirlineIcaoSelectorComponent::~CDbAirlineIcaoSelectorComponent()
{ { }
// no inline destructor, read QScopedPointer Forward Declared Pointers
}
void CDbAirlineIcaoSelectorComponent::setReadOnly(bool readOnly) void CDbAirlineIcaoSelectorComponent::setReadOnly(bool readOnly)
{ {
@@ -52,14 +51,16 @@ namespace BlackGui
bool CDbAirlineIcaoSelectorComponent::setAirlineIcao(const CAirlineIcaoCode &icao) bool CDbAirlineIcaoSelectorComponent::setAirlineIcao(const CAirlineIcaoCode &icao)
{ {
if (!CDbAirlineIcaoSelectorBase::setAirlineIcao(icao)) { return false; } const bool changed = CDbAirlineIcaoSelectorBase::setAirlineIcao(icao);
const QString icaoStr(icao.getVDesignator());
// Always update GUI regardless of changed because of formattimg
const QString icaoStr(m_display == DisplayVDesignatorAndId ? this->m_currentIcao.getVDesignatorDbKey() : this->m_currentIcao.getCombinedStringWithKey());
ui->le_Airline->setText(icaoStr); ui->le_Airline->setText(icaoStr);
ui->lbl_Description->setText(icao.getName()); ui->lbl_Description->setText(this->m_currentIcao.getName());
return true; return changed;
} }
void CDbAirlineIcaoSelectorComponent::withIcaoDescription(bool description) void CDbAirlineIcaoSelectorComponent::displayWithIcaoDescription(bool description)
{ {
ui->lbl_Description->setVisible(description); ui->lbl_Description->setVisible(description);
} }
@@ -75,12 +76,22 @@ namespace BlackGui
return stripDesignatorFromCompleterString(ui->le_Airline->text()); return stripDesignatorFromCompleterString(ui->le_Airline->text());
} }
const QStringList &CDbAirlineIcaoSelectorComponent::completerStrings()
{
// done for performance reasons
// init only once, future instance can share thte list
// only to be called when data are read!
static const QStringList cs(sGui->getWebDataServices()->getAirlineIcaoCodes().toIcaoDesignatorCompleterStrings(true, true));
return cs;
}
QCompleter *CDbAirlineIcaoSelectorComponent::createCompleter() QCompleter *CDbAirlineIcaoSelectorComponent::createCompleter()
{ {
QCompleter *c = new QCompleter(sGui->getWebDataServices()->getAirlineIcaoCodes().toIcaoDesignatorCompleterStrings(true, true), this); QCompleter *c = new QCompleter(completerStrings(), this);
c->setCaseSensitivity(Qt::CaseInsensitive); c->setCaseSensitivity(Qt::CaseInsensitive);
c->setCompletionMode(QCompleter::PopupCompletion); c->setCompletionMode(QCompleter::PopupCompletion);
c->setMaxVisibleItems(10); c->setMaxVisibleItems(10);
c->popup()->setMinimumWidth(175);
ui->le_Airline->setCompleter(c); ui->le_Airline->setCompleter(c);
return c; return c;
} }
@@ -90,12 +101,18 @@ namespace BlackGui
if (!sGui) { return; } if (!sGui) { return; }
QString s(ui->le_Airline->text()); QString s(ui->le_Airline->text());
if (s.isEmpty()) { return; } if (s.isEmpty()) { return; }
CAirlineIcaoCode icao;
int dbKey = CDatastoreUtility::extractIntegerKey(s); int dbKey = CDatastoreUtility::extractIntegerKey(s);
if (dbKey >= 0) if (dbKey >= 0)
{ {
CAirlineIcaoCode icao(sGui->getWebDataServices()->getAirlineIcaoCodeForDbKey(dbKey)); icao = sGui->getWebDataServices()->getAirlineIcaoCodeForDbKey(dbKey);
this->setAirlineIcao(icao);
} }
else
{
const QString designator = this->getRawDesignator();
icao = sGui->getWebDataServices()->smartAirlineIcaoSelector(CAirlineIcaoCode(designator));
}
this->setAirlineIcao(icao);
} }
}// class }// class
} // ns } // ns

View File

@@ -19,12 +19,12 @@
#include <QObject> #include <QObject>
#include <QScopedPointer> #include <QScopedPointer>
#include <QString> #include <QString>
#include <QScopedPointer>
class QCompleter; class QCompleter;
class QWidget; class QWidget;
namespace Ui { class CDbAirlineIcaoSelectorComponent; } namespace Ui { class CDbAirlineIcaoSelectorComponent; }
namespace BlackGui namespace BlackGui
{ {
namespace Components namespace Components
@@ -37,6 +37,13 @@ namespace BlackGui
Q_OBJECT Q_OBJECT
public: public:
//! How to display the info
enum Display
{
DisplayVDesignatorAndId,
DisplayCompleterString
};
//! Constructor //! Constructor
explicit CDbAirlineIcaoSelectorComponent(QWidget *parent = nullptr); explicit CDbAirlineIcaoSelectorComponent(QWidget *parent = nullptr);
@@ -55,7 +62,10 @@ namespace BlackGui
QString getRawDesignator() const; QString getRawDesignator() const;
//! Display ICAO description //! Display ICAO description
void withIcaoDescription(bool description); void displayWithIcaoDescription(bool description);
//! Display mode
void displayMode(Display mode) { this->m_display = mode; }
protected: protected:
//! \copydoc CDbAirlineIcaoSelectorBase::createCompleter //! \copydoc CDbAirlineIcaoSelectorBase::createCompleter
@@ -67,7 +77,12 @@ namespace BlackGui
private: private:
QScopedPointer<Ui::CDbAirlineIcaoSelectorComponent> ui; QScopedPointer<Ui::CDbAirlineIcaoSelectorComponent> ui;
Display m_display = DisplayVDesignatorAndId;
//! Get the completer strings
//! \remark shared for performance reasons
static const QStringList &completerStrings();
}; };
} } // ns
} // ns } // ns
#endif // guard #endif // guard

View File

@@ -33,7 +33,8 @@ namespace BlackGui
ui(new Ui::CDbAirlineNameSelectorComponent) ui(new Ui::CDbAirlineNameSelectorComponent)
{ {
ui->setupUi(this); ui->setupUi(this);
connect(ui->le_AirlineName, &QLineEdit::returnPressed, this, &CDbAirlineNameSelectorComponent::ps_dataChanged); this->setFocusProxy(ui->le_AirlineName);
connect(ui->le_AirlineName, &QLineEdit::editingFinished, this, &CDbAirlineNameSelectorComponent::ps_dataChanged);
} }
CDbAirlineNameSelectorComponent::~CDbAirlineNameSelectorComponent() CDbAirlineNameSelectorComponent::~CDbAirlineNameSelectorComponent()
@@ -44,7 +45,7 @@ namespace BlackGui
bool CDbAirlineNameSelectorComponent::setAirlineIcao(const CAirlineIcaoCode &icao) bool CDbAirlineNameSelectorComponent::setAirlineIcao(const CAirlineIcaoCode &icao)
{ {
if (!CDbAirlineIcaoSelectorBase::setAirlineIcao(icao)) { return false; } if (!CDbAirlineIcaoSelectorBase::setAirlineIcao(icao)) { return false; }
QString name(icao.getName()); const QString name(icao.getName());
ui->le_AirlineName->setText(name); ui->le_AirlineName->setText(name);
return true; return true;
} }
@@ -65,6 +66,7 @@ namespace BlackGui
c->setCaseSensitivity(Qt::CaseInsensitive); c->setCaseSensitivity(Qt::CaseInsensitive);
c->setCompletionMode(QCompleter::PopupCompletion); c->setCompletionMode(QCompleter::PopupCompletion);
c->setMaxVisibleItems(10); c->setMaxVisibleItems(10);
c->popup()->setMinimumWidth(175);
ui->le_AirlineName->setCompleter(c); ui->le_AirlineName->setCompleter(c);
return c; return c;
} }
@@ -80,14 +82,6 @@ namespace BlackGui
CAirlineIcaoCode icao(sGui->getWebDataServices()->getAirlineIcaoCodeForDbKey(dbKey)); CAirlineIcaoCode icao(sGui->getWebDataServices()->getAirlineIcaoCodeForDbKey(dbKey));
this->setAirlineIcao(icao); this->setAirlineIcao(icao);
} }
else
{
// second choice, first object found by designator
// for name
// CAirlineIcaoCode icao(getAirlineIcao));
// this->setAirlineIcao(icao);
}
} }
} // ns } // ns
} // ns } // ns

View File

@@ -42,6 +42,7 @@ namespace BlackGui
ui(new Ui::CDbCountrySelectorComponent) ui(new Ui::CDbCountrySelectorComponent)
{ {
ui->setupUi(this); ui->setupUi(this);
this->setFocusProxy(ui->le_CountryIso);
this->setAcceptDrops(true); this->setAcceptDrops(true);
this->setAcceptedMetaTypeIds({qMetaTypeId<CCountry>(), qMetaTypeId<CCountryList>()}); this->setAcceptedMetaTypeIds({qMetaTypeId<CCountry>(), qMetaTypeId<CCountryList>()});

View File

@@ -46,6 +46,7 @@ namespace BlackGui
{ {
Q_ASSERT_X(sGui, Q_FUNC_INFO, "Missing sGui"); Q_ASSERT_X(sGui, Q_FUNC_INFO, "Missing sGui");
ui->setupUi(this); ui->setupUi(this);
this->setFocusProxy(ui->le_Distributor);
this->setAcceptDrops(true); this->setAcceptDrops(true);
this->setAcceptedMetaTypeIds({qMetaTypeId<CDistributor>(), qMetaTypeId<CDistributorList>()}); this->setAcceptedMetaTypeIds({qMetaTypeId<CDistributor>(), qMetaTypeId<CDistributorList>()});
ui->le_Distributor->setValidator(new CUpperCaseValidator(this)); ui->le_Distributor->setValidator(new CUpperCaseValidator(this));