diff --git a/src/blackgui/components/dbdistributorselectorcomponent.cpp b/src/blackgui/components/dbdistributorselectorcomponent.cpp index 061cdb0de..0a5666493 100644 --- a/src/blackgui/components/dbdistributorselectorcomponent.cpp +++ b/src/blackgui/components/dbdistributorselectorcomponent.cpp @@ -51,9 +51,11 @@ namespace BlackGui this->setAcceptedMetaTypeIds({qMetaTypeId(), qMetaTypeId()}); ui->le_Distributor->setValidator(new CUpperCaseValidator(this)); - bool c = connect(ui->le_Distributor, &QLineEdit::returnPressed, this, &CDbDistributorSelectorComponent::onDataChanged); + bool c = connect(ui->le_Distributor, &QLineEdit::editingFinished, this, &CDbDistributorSelectorComponent::onDataChanged, Qt::QueuedConnection); Q_ASSERT_X(c, Q_FUNC_INFO, "Missing connect"); - c = connect(sApp->getWebDataServices(), &CWebDataServices::dataRead, this, &CDbDistributorSelectorComponent::onDistributorsRead); + // c = connect(ui->le_Distributor, &QLineEdit::returnPressed, this, &CDbDistributorSelectorComponent::returnPressed, Qt::QueuedConnection); + // Q_ASSERT_X(c, Q_FUNC_INFO, "Missing connect"); + c = connect(sApp->getWebDataServices(), &CWebDataServices::dataRead, this, &CDbDistributorSelectorComponent::onDistributorsRead, Qt::QueuedConnection); Q_ASSERT_X(c, Q_FUNC_INFO, "Missing connect"); Q_UNUSED(c); @@ -127,6 +129,7 @@ namespace BlackGui void CDbDistributorSelectorComponent::clear() { ui->le_Distributor->clear(); + m_currentDistributor = CDistributor(); } void CDbDistributorSelectorComponent::dragEnterEvent(QDragEnterEvent *event) @@ -197,11 +200,11 @@ namespace BlackGui void CDbDistributorSelectorComponent::onDataChanged() { - if (!sGui) { return; } - QString keyOrAlias(ui->le_Distributor->text().trimmed().toUpper()); + if (!sGui || sGui->isShuttingDown() || !sGui->getWebDataServices()) { return; } + const QString keyOrAlias(ui->le_Distributor->text().trimmed().toUpper()); if (keyOrAlias.isEmpty()) { return; } - CDistributor d(sGui->getWebDataServices()->getDistributors().findByKeyOrAlias(keyOrAlias)); - this->setDistributor(d); + const CDistributor distributor(sGui->getWebDataServices()->getDistributors().findByKeyOrAlias(keyOrAlias)); + this->setDistributor(distributor); } void CDbDistributorSelectorComponent::onCompleterActivated(const QString &distributorKeyOrAlias) diff --git a/src/blackgui/editors/airlineicaoform.cpp b/src/blackgui/editors/airlineicaoform.cpp index 7f8c9a798..6aeb082f0 100644 --- a/src/blackgui/editors/airlineicaoform.cpp +++ b/src/blackgui/editors/airlineicaoform.cpp @@ -63,8 +63,8 @@ namespace BlackGui void CAirlineIcaoForm::setValue(const CAirlineIcaoCode &icao) { - if (m_originalCode == icao) { return; } - m_originalCode = icao; + if (m_currentCode == icao) { return; } + m_currentCode = icao; ui->selector_AirlineDesignator->setAirlineIcao(icao); ui->selector_AirlineName->setAirlineIcao(icao); @@ -89,15 +89,15 @@ namespace BlackGui // sometimes artefacts when icon is displayed this->repaint(); - if (m_originalCode.hasCompleteData()) + if (m_currentCode.hasCompleteData()) { - emit airlineChanged(m_originalCode); + emit this->airlineChanged(m_currentCode); } } CAirlineIcaoCode CAirlineIcaoForm::getValue() const { - CAirlineIcaoCode code(m_originalCode); + CAirlineIcaoCode code(m_currentCode); code.setVirtualAirline(ui->cb_Va->isChecked()); code.setMilitary(ui->cb_Military->isChecked()); code.setCountry(ui->country_Selector->getCountry()); @@ -164,7 +164,7 @@ namespace BlackGui void CAirlineIcaoForm::resetValue() { - this->setValue(m_originalCode); + this->setValue(m_currentCode); } void CAirlineIcaoForm::jsonPasted(const QString &json) @@ -209,11 +209,7 @@ namespace BlackGui void CAirlineIcaoForm::onIdEntered() { - if (!sGui || !sGui->hasWebDataServices()) - { - ui->le_Id->undo(); - return; - } + if (!sGui || sGui->isShuttingDown() || !sGui->hasWebDataServices()) { return; } const int id = ui->le_Id->text().toInt(); const CAirlineIcaoCode icao = sGui->getWebDataServices()->getAirlineIcaoCodeForDbKey(id); @@ -224,5 +220,10 @@ namespace BlackGui } this->setValue(icao); } + + void CAirlineIcaoForm::emitAirlineChangedDigest() + { + emit this->airlineChangedDigest(m_currentCode); + } } // ns } // ns diff --git a/src/blackgui/editors/airlineicaoform.h b/src/blackgui/editors/airlineicaoform.h index 9531fae04..85139b446 100644 --- a/src/blackgui/editors/airlineicaoform.h +++ b/src/blackgui/editors/airlineicaoform.h @@ -15,14 +15,13 @@ #include "blackgui/blackguiexport.h" #include "blackgui/editors/form.h" #include "blackmisc/aviation/airlineicaocode.h" +#include "blackmisc/digestsignal.h" #include "blackmisc/statusmessagelist.h" #include "blackmisc/variant.h" #include #include -class QWidget; - namespace Ui { class CAirlineIcaoForm; } namespace BlackGui { @@ -71,6 +70,9 @@ namespace BlackGui //! Airline has been changed void airlineChanged(const BlackMisc::Aviation::CAirlineIcaoCode &airlineIcao); + //! Airline has been changed + void airlineChangedDigest(const BlackMisc::Aviation::CAirlineIcaoCode &airlineIcao); + protected: //! \copydoc CForm::jsonPasted virtual void jsonPasted(const QString &json) override; @@ -81,9 +83,13 @@ namespace BlackGui //! Id entered void onIdEntered(); + //! Emit the digest signal + void emitAirlineChangedDigest(); + private: QScopedPointer ui; - BlackMisc::Aviation::CAirlineIcaoCode m_originalCode; //!< object allowing to override values + BlackMisc::CDigestSignal m_digestChanges { this, &CAirlineIcaoForm::airlineChanged, &CAirlineIcaoForm::emitAirlineChangedDigest, 500, 3 }; + BlackMisc::Aviation::CAirlineIcaoCode m_currentCode; //!< object allowing to override values }; } // ns } //ns diff --git a/src/blackgui/editors/distributorform.cpp b/src/blackgui/editors/distributorform.cpp index c5417e98b..2465f46cd 100644 --- a/src/blackgui/editors/distributorform.cpp +++ b/src/blackgui/editors/distributorform.cpp @@ -34,14 +34,15 @@ namespace BlackGui ui(new Ui::CDistributorForm) { ui->setupUi(this); - this->setFocusProxy(ui->distributor_Selector); + this->setFocusProxy(ui->comp_DistributorSelector); ui->le_Updated->setReadOnly(true); - ui->distributor_Selector->withDistributorDescription(false); + ui->comp_DistributorSelector->withDistributorDescription(false); ui->lai_Id->set(CIcons::appDistributors16(), "Id:"); // drag and drop - connect(ui->drop_DropData, &CDropSite::droppedValueObject, this, &CDistributorForm::ps_droppedCode); - connect(ui->distributor_Selector, &CDbDistributorSelectorComponent::changedDistributor, this, &CDistributorForm::setValue); + connect(ui->drop_DropData, &CDropSite::droppedValueObject, this, &CDistributorForm::onDroppedCode); + connect(ui->comp_DistributorSelector, &CDbDistributorSelectorComponent::changedDistributor, this, &CDistributorForm::setValue); + // connect(ui->comp_DistributorSelector, &CDbDistributorSelectorComponent::returnPressed, this, &CDistributorForm::onReturnPressed); ui->drop_DropData->setInfoText(""); ui->drop_DropData->setAcceptedMetaTypeIds({ qMetaTypeId(), qMetaTypeId()}); } @@ -51,10 +52,10 @@ namespace BlackGui bool CDistributorForm::setValue(const BlackMisc::Simulation::CDistributor &distributor) { - const CDistributor currentDistributor(this->getValue()); - if (currentDistributor == distributor) { return false; } + if (m_currentDistributor == distributor) { return false; } + m_currentDistributor = distributor; - ui->distributor_Selector->setDistributor(distributor); + ui->comp_DistributorSelector->setDistributor(distributor); ui->le_Description->setText(distributor.getDescription()); ui->le_Alias1->setText(distributor.getAlias1()); ui->le_Alias2->setText(distributor.getAlias2()); @@ -69,7 +70,7 @@ namespace BlackGui CDistributor CDistributorForm::getValue() const { - CDistributor distributor(ui->distributor_Selector->getDistributor()); + CDistributor distributor(ui->comp_DistributorSelector->getDistributor()); distributor.setAlias1(ui->le_Alias1->text()); distributor.setAlias2(ui->le_Alias2->text()); distributor.setDescription(ui->le_Description->text()); @@ -105,7 +106,7 @@ namespace BlackGui ui->le_Alias1->setReadOnly(readOnly); ui->le_Alias2->setReadOnly(readOnly); ui->le_Description->setReadOnly(readOnly); - ui->distributor_Selector->setReadOnly(readOnly); + ui->comp_DistributorSelector->setReadOnly(readOnly); ui->drop_DropData->setVisible(!readOnly); this->forceStyleSheetUpdate(); } @@ -113,17 +114,18 @@ namespace BlackGui void CDistributorForm::setSelectOnly() { this->setReadOnly(true); - ui->distributor_Selector->setReadOnly(false); + ui->comp_DistributorSelector->setReadOnly(false); ui->drop_DropData->setVisible(true); } void CDistributorForm::clear() { - setValue(CDistributor()); - ui->distributor_Selector->setReadOnly(false); + this->setValue(CDistributor()); + ui->comp_DistributorSelector->clear(); + ui->comp_DistributorSelector->setReadOnly(false); } - void CDistributorForm::ps_droppedCode(const BlackMisc::CVariant &variantDropped) + void CDistributorForm::onDroppedCode(const BlackMisc::CVariant &variantDropped) { CDistributor distributor; if (variantDropped.canConvert()) @@ -142,5 +144,10 @@ namespace BlackGui } this->setValue(distributor); } + + bool CDistributorForm::hasAnyUiDetailsValues() const + { + return !(ui->le_Alias1->text().isEmpty() && ui->le_Alias2->text().isEmpty() && ui->le_Description->text().isEmpty() && ui->le_Updated->text().isEmpty()); + } } // ns } // ns diff --git a/src/blackgui/editors/distributorform.h b/src/blackgui/editors/distributorform.h index 515942fdb..d7a1f3807 100644 --- a/src/blackgui/editors/distributorform.h +++ b/src/blackgui/editors/distributorform.h @@ -21,7 +21,6 @@ #include #include -class QWidget; namespace Ui { class CDistributorForm; } namespace BlackGui { @@ -30,8 +29,7 @@ namespace BlackGui /*! * Distributor form */ - class BLACKGUI_EXPORT CDistributorForm : - public CForm + class BLACKGUI_EXPORT CDistributorForm : public CForm { Q_OBJECT @@ -61,7 +59,6 @@ namespace BlackGui //! Clear void clear(); - public slots: //! Set value bool setValue(const BlackMisc::Simulation::CDistributor &distributor = BlackMisc::Simulation::CDistributor()); @@ -69,12 +66,15 @@ namespace BlackGui //! \copydoc CForm::jsonPasted virtual void jsonPasted(const QString &json) override; - private slots: - //! Variant has been dropped - void ps_droppedCode(const BlackMisc::CVariant &variantDropped); - private: + //! Variant has been dropped + void onDroppedCode(const BlackMisc::CVariant &variantDropped); + + //! Any UI values in the details fields + bool hasAnyUiDetailsValues() const; + QScopedPointer ui; + BlackMisc::Simulation::CDistributor m_currentDistributor; bool m_readOnly = false; }; } // ns diff --git a/src/blackgui/editors/distributorform.ui b/src/blackgui/editors/distributorform.ui index e641d267e..180500b56 100644 --- a/src/blackgui/editors/distributorform.ui +++ b/src/blackgui/editors/distributorform.ui @@ -6,8 +6,8 @@ 0 0 - 297 - 200 + 254 + 185 @@ -114,7 +114,7 @@ - + 0 @@ -173,7 +173,7 @@ - distributor_Selector + comp_DistributorSelector le_Description le_Alias1 le_Alias2 diff --git a/src/blackgui/editors/liveryform.cpp b/src/blackgui/editors/liveryform.cpp index cc9fd75c7..876d63f8b 100644 --- a/src/blackgui/editors/liveryform.cpp +++ b/src/blackgui/editors/liveryform.cpp @@ -50,7 +50,7 @@ namespace BlackGui connect(ui->le_Id, &QLineEdit::returnPressed, this, &CLiveryForm::onIdEntered); // selector - connect(ui->comp_LiverySelector, &CDbLiverySelectorComponent::changedLivery, this, &CLiveryForm::setValue); + connect(ui->comp_LiverySelector, &CDbLiverySelectorComponent::changedLivery, this, &CLiveryForm::setValue, Qt::QueuedConnection); // drag and drop, paste connect(ui->tb_Paste, &QToolButton::clicked, this, &CLiveryForm::pasted); @@ -59,7 +59,7 @@ namespace BlackGui ui->drop_DropData->setAcceptedMetaTypeIds({ qMetaTypeId(), qMetaTypeId()}); // embedded form - connect(ui->editor_AirlineIcao, &CAirlineIcaoForm::airlineChanged, this, &CLiveryForm::onAirlineChanged); + connect(ui->editor_AirlineIcao, &CAirlineIcaoForm::airlineChangedDigest, this, &CLiveryForm::onAirlineChanged, Qt::QueuedConnection); // Set as temp.livery or search color connect(ui->pb_TempLivery, &QPushButton::pressed, this, &CLiveryForm::setTemporaryLivery); @@ -228,6 +228,7 @@ namespace BlackGui void CLiveryForm::onAirlineChanged(const CAirlineIcaoCode &code) { + if (!sGui || sGui->isShuttingDown() || !sGui->getWebDataServices()) { return; } if (!code.hasCompleteData()) { return; } if (!code.hasValidDbKey()) { return; }