diff --git a/src/blackgui/components/dbmappingcomponent.cpp b/src/blackgui/components/dbmappingcomponent.cpp index b4cd7f2ee..68de490f6 100644 --- a/src/blackgui/components/dbmappingcomponent.cpp +++ b/src/blackgui/components/dbmappingcomponent.cpp @@ -186,7 +186,7 @@ namespace BlackGui void CDbMappingComponent::ps_loadVPilotData() { - if (this->m_vPilotReader.readASync(true)) + if (this->m_vPilotReader.readInBackground(true)) { CLogMessage(this).info("Start loading vPilot rulesets"); this->ui->tvp_AircraftModelsForVPilot->showLoadIndicator(); diff --git a/src/blackgui/editors/aircrafticaoform.cpp b/src/blackgui/editors/aircrafticaoform.cpp index 4fb26de1b..d5d894afc 100644 --- a/src/blackgui/editors/aircrafticaoform.cpp +++ b/src/blackgui/editors/aircrafticaoform.cpp @@ -42,7 +42,6 @@ namespace BlackGui void CAircraftIcaoForm::setValue(const BlackMisc::Aviation::CAircraftIcaoCode &icao) { - this->m_aircraft = icao; this->ui->le_Id->setText(icao.getDbKeyAsString()); this->ui->aircraft_Selector->setAircraftIcao(icao); this->ui->le_Manufacturer->setText(icao.getManufacturer()); @@ -61,13 +60,9 @@ namespace BlackGui this->ui->le_Updated->setText(icao.getFormattedUtcTimestampYmdhms()); } - const CAircraftIcaoCode &CAircraftIcaoForm::getValue() const + CAircraftIcaoCode CAircraftIcaoForm::getValue() const { CAircraftIcaoCode icao(this->ui->aircraft_Selector->getAircraftIcao()); - if (icao.hasCompleteData()) - { - m_aircraft = icao; - } QString manufacturer(this->ui->le_Manufacturer->text().trimmed().toUpper()); QString modelDescription(this->ui->le_ModelDescription->text()); QString wtc(ui->cb_Wtc->currentText().left(1)); @@ -78,13 +73,13 @@ namespace BlackGui bool legacy = this->ui->cb_Legacy->isChecked(); bool military = this->ui->cb_Military->isChecked(); bool realWorld = this->ui->cb_RealWorld->isChecked(); - m_aircraft.setManufacturer(manufacturer); - m_aircraft.setModelDescription(modelDescription); - m_aircraft.setWtc(wtc); - m_aircraft.setCodeFlags(military, legacy, realWorld); - m_aircraft.setRank(rank); - m_aircraft.setCombinedType(combined); - return m_aircraft; + icao.setManufacturer(manufacturer); + icao.setModelDescription(modelDescription); + icao.setWtc(wtc); + icao.setCodeFlags(military, legacy, realWorld); + icao.setRank(rank); + icao.setCombinedType(combined); + return icao; } CStatusMessageList CAircraftIcaoForm::validate() const diff --git a/src/blackgui/editors/aircrafticaoform.h b/src/blackgui/editors/aircrafticaoform.h index bedd4e360..f5dd7e7cd 100644 --- a/src/blackgui/editors/aircrafticaoform.h +++ b/src/blackgui/editors/aircrafticaoform.h @@ -41,7 +41,7 @@ namespace BlackGui ~CAircraftIcaoForm(); //! Get value - const BlackMisc::Aviation::CAircraftIcaoCode &getValue() const; + BlackMisc::Aviation::CAircraftIcaoCode getValue() const; //! Validate, empty list means OK BlackMisc::CStatusMessageList validate() const; @@ -74,7 +74,6 @@ namespace BlackGui private: QScopedPointer ui; - mutable BlackMisc::Aviation::CAircraftIcaoCode m_aircraft; }; } // ns diff --git a/src/blackgui/editors/airlineicaoform.cpp b/src/blackgui/editors/airlineicaoform.cpp index c3ae3b9ca..74ac3c77a 100644 --- a/src/blackgui/editors/airlineicaoform.cpp +++ b/src/blackgui/editors/airlineicaoform.cpp @@ -44,7 +44,7 @@ namespace BlackGui void CAirlineIcaoForm::setValue(const BlackMisc::Aviation::CAirlineIcaoCode &icao) { - this->m_airline = icao; + this->m_originalCode = icao; this->ui->airline_Selector->setAirlineIcao(icao); this->ui->le_Id->setText(icao.getDbKeyAsString()); this->ui->le_TelephonyDesignator->setText(icao.getTelephonyDesignator()); @@ -55,13 +55,14 @@ namespace BlackGui this->ui->lbl_AirlineIcon->setPixmap(icao.toPixmap()); } - const CAirlineIcaoCode &CAirlineIcaoForm::getValue() const + CAirlineIcaoCode CAirlineIcaoForm::getValue() const { - m_airline.setVirtualAirline(this->ui->cb_Va->isChecked()); - m_airline.setCountry(this->ui->country_Selector->getCountry()); - m_airline.setName(this->ui->le_Name->text()); - m_airline.setTelephonyDesignator(this->ui->le_TelephonyDesignator->text()); - return m_airline; + CAirlineIcaoCode code(m_originalCode); + code.setVirtualAirline(this->ui->cb_Va->isChecked()); + code.setCountry(this->ui->country_Selector->getCountry()); + code.setName(this->ui->le_Name->text()); + code.setTelephonyDesignator(this->ui->le_TelephonyDesignator->text()); + return code; } CStatusMessageList CAirlineIcaoForm::validate() const diff --git a/src/blackgui/editors/airlineicaoform.h b/src/blackgui/editors/airlineicaoform.h index f462869e1..9b011ad6a 100644 --- a/src/blackgui/editors/airlineicaoform.h +++ b/src/blackgui/editors/airlineicaoform.h @@ -44,7 +44,7 @@ namespace BlackGui void setValue(const BlackMisc::Aviation::CAirlineIcaoCode &icao = BlackMisc::Aviation::CAirlineIcaoCode()); //! Get value - const BlackMisc::Aviation::CAirlineIcaoCode &getValue() const; + BlackMisc::Aviation::CAirlineIcaoCode getValue() const; //! Validate, empty list means OK BlackMisc::CStatusMessageList validate() const; @@ -69,8 +69,8 @@ namespace BlackGui void ps_droppedCode(const BlackMisc::CVariant &variantDropped); private: - QScopedPointer ui; - mutable BlackMisc::Aviation::CAirlineIcaoCode m_airline; // object allowing to override values + QScopedPointer ui; + BlackMisc::Aviation::CAirlineIcaoCode m_originalCode; //!< object allowing to override values }; } // ns diff --git a/src/blackgui/editors/distributorform.cpp b/src/blackgui/editors/distributorform.cpp index 9efe0f820..adcf11fa4 100644 --- a/src/blackgui/editors/distributorform.cpp +++ b/src/blackgui/editors/distributorform.cpp @@ -42,7 +42,6 @@ namespace BlackGui void CDistributorForm::setValue(const BlackMisc::Simulation::CDistributor &distributor) { - this->m_distributor = distributor; this->ui->distributor_Selector->setDistributor(distributor); this->ui->le_Description->setText(distributor.getDescription()); this->ui->le_Alias1->setText(distributor.getAlias1()); @@ -50,15 +49,13 @@ namespace BlackGui this->ui->le_Updated->setText(distributor.getFormattedUtcTimestampYmdhms()); } - const CDistributor &CDistributorForm::getValue() const + CDistributor CDistributorForm::getValue() const { - CDistributor d(ui->distributor_Selector->getDistributor()); - if (d.hasCompleteData()) { this->m_distributor = d;} - - m_distributor.setAlias1(this->ui->le_Alias1->text()); - m_distributor.setAlias2(this->ui->le_Alias2->text()); - m_distributor.setDescription(this->ui->le_Description->text()); - return m_distributor; + CDistributor distributor(ui->distributor_Selector->getDistributor()); + distributor.setAlias1(this->ui->le_Alias1->text()); + distributor.setAlias2(this->ui->le_Alias2->text()); + distributor.setDescription(this->ui->le_Description->text()); + return distributor; } CStatusMessageList CDistributorForm::validate() const diff --git a/src/blackgui/editors/distributorform.h b/src/blackgui/editors/distributorform.h index de9b2d3a5..31ee81405 100644 --- a/src/blackgui/editors/distributorform.h +++ b/src/blackgui/editors/distributorform.h @@ -41,7 +41,7 @@ namespace BlackGui ~CDistributorForm(); //! Get value - const BlackMisc::Simulation::CDistributor &getValue() const; + BlackMisc::Simulation::CDistributor getValue() const; //! Validate, empty list means OK BlackMisc::CStatusMessageList validate() const; @@ -74,7 +74,6 @@ namespace BlackGui private: QScopedPointer ui; - mutable BlackMisc::Simulation::CDistributor m_distributor; // object allowing to override values bool m_readOnly = false; }; diff --git a/src/blackgui/editors/liveryform.cpp b/src/blackgui/editors/liveryform.cpp index f81419c55..8b50303d6 100644 --- a/src/blackgui/editors/liveryform.cpp +++ b/src/blackgui/editors/liveryform.cpp @@ -41,18 +41,19 @@ namespace BlackGui this->ui->editor_AirlineIcao->setProvider(provider); } - const CLivery &CLiveryForm::getValue() const + CLivery CLiveryForm::getValue() const { + CLivery livery(this->m_originalLivery); CAirlineIcaoCode airline(this->ui->editor_AirlineIcao->getValue()); - this->m_livery.setCombinedCode(this->ui->le_Code->text()); - this->m_livery.setAirlineIcaoCode(airline); - this->m_livery.setDescription(this->ui->le_Description->text()); - return m_livery; + livery.setAirlineIcaoCode(airline); + livery.setCombinedCode(this->ui->le_Code->text()); + livery.setDescription(this->ui->le_Description->text()); + return livery; } void CLiveryForm::setValue(const CLivery &livery) { - this->m_livery = livery; + this->m_originalLivery = livery; this->ui->le_Id->setText(livery.getDbKeyAsString()); this->ui->le_Code->setText(livery.getCombinedCode()); this->ui->le_Description->setText(livery.getDescription()); diff --git a/src/blackgui/editors/liveryform.h b/src/blackgui/editors/liveryform.h index 7d7fbac67..2f8f5e10b 100644 --- a/src/blackgui/editors/liveryform.h +++ b/src/blackgui/editors/liveryform.h @@ -43,7 +43,7 @@ namespace BlackGui virtual void setProvider(BlackMisc::Network::IWebDataServicesProvider *provider) override; //! Value - const BlackMisc::Aviation::CLivery &getValue() const; + BlackMisc::Aviation::CLivery getValue() const; //! Value void setValue(const BlackMisc::Aviation::CLivery &livery); @@ -72,7 +72,7 @@ namespace BlackGui private: QScopedPointer ui; - mutable BlackMisc::Aviation::CLivery m_livery; //!< object whose values will be overridden + BlackMisc::Aviation::CLivery m_originalLivery; //!< object whose values will be overridden }; } // ns diff --git a/src/blackgui/editors/modelmappingform.cpp b/src/blackgui/editors/modelmappingform.cpp index da1c07bd1..a74734c9f 100644 --- a/src/blackgui/editors/modelmappingform.cpp +++ b/src/blackgui/editors/modelmappingform.cpp @@ -31,13 +31,14 @@ namespace BlackGui CModelMappingForm::~CModelMappingForm() { } - const BlackMisc::Simulation::CAircraftModel &CModelMappingForm::getValue() const + BlackMisc::Simulation::CAircraftModel CModelMappingForm::getValue() const { - m_model.setSimulatorInfo(this->ui->selector_Simulator->getValue()); - m_model.setDescription(this->ui->le_Description->text()); - m_model.setModelString(this->ui->le_ModelKey->text()); - m_model.setName(this->ui->le_Name->text()); - return m_model; + CAircraftModel model(m_originalModel); + model.setSimulatorInfo(this->ui->selector_Simulator->getValue()); + model.setDescription(this->ui->le_Description->text()); + model.setModelString(this->ui->le_ModelKey->text()); + model.setName(this->ui->le_Name->text()); + return model; } CStatusMessageList CModelMappingForm::validate(bool withNestedForms) const @@ -63,6 +64,7 @@ namespace BlackGui ui->le_Description->setText(model.getDescription()); ui->le_Name->setText(model.getName()); ui->selector_Simulator->setValue(model.getSimulatorInfo()); + m_originalModel = model; } } // ns } // ns diff --git a/src/blackgui/editors/modelmappingform.h b/src/blackgui/editors/modelmappingform.h index 4c0b798d9..f90d27310 100644 --- a/src/blackgui/editors/modelmappingform.h +++ b/src/blackgui/editors/modelmappingform.h @@ -37,7 +37,7 @@ namespace BlackGui ~CModelMappingForm(); //! Value - const BlackMisc::Simulation::CAircraftModel &getValue() const; + BlackMisc::Simulation::CAircraftModel getValue() const; //! Validate BlackMisc::CStatusMessageList validate(bool withNestedForms) const; @@ -58,7 +58,7 @@ namespace BlackGui private: QScopedPointer ui; - mutable BlackMisc::Simulation::CAircraftModel m_model; //!< cached last value + BlackMisc::Simulation::CAircraftModel m_originalModel; }; } // ns diff --git a/src/blackmisc/simulation/fscommon/modelmappingsprovidervpilot.cpp b/src/blackmisc/simulation/fscommon/modelmappingsprovidervpilot.cpp index ba3997fbc..9cad53ef9 100644 --- a/src/blackmisc/simulation/fscommon/modelmappingsprovidervpilot.cpp +++ b/src/blackmisc/simulation/fscommon/modelmappingsprovidervpilot.cpp @@ -34,7 +34,7 @@ namespace BlackMisc bool success = this->m_vPilotReader->read(false); if (success) { - this->m_datastoreModels = this->m_vPilotReader->getRules().toAircraftModels(); + this->m_datastoreModels = this->m_vPilotReader->getAsModels(); } return success; } diff --git a/src/blackmisc/simulation/fscommon/vpilotmodelruleset.h b/src/blackmisc/simulation/fscommon/vpilotmodelruleset.h index 551dd297b..134f77260 100644 --- a/src/blackmisc/simulation/fscommon/vpilotmodelruleset.h +++ b/src/blackmisc/simulation/fscommon/vpilotmodelruleset.h @@ -60,6 +60,7 @@ namespace BlackMisc int keepModels(const QStringList &modelsToBeKept); //! To aircraft models + //! \note slow operation, can take a while BlackMisc::Simulation::CAircraftModelList toAircraftModels() const; private: diff --git a/src/blackmisc/simulation/fscommon/vpilotrulesreader.cpp b/src/blackmisc/simulation/fscommon/vpilotrulesreader.cpp index 497457d23..40621ce59 100644 --- a/src/blackmisc/simulation/fscommon/vpilotrulesreader.cpp +++ b/src/blackmisc/simulation/fscommon/vpilotrulesreader.cpp @@ -82,12 +82,12 @@ namespace BlackMisc // already cached? { QReadLocker l(&m_lockData); - if (!m_models.isEmpty() || m_rules.isEmpty()) return m_models; + if (!m_models.isEmpty() || m_rules.isEmpty()) { return m_models; } + if (m_shutdown) { return CAircraftModelList(); } } // important: that can take a while and should normally // run in background - if (m_shutdown) { return CAircraftModelList(); } CVPilotModelRuleSet rules(getRules()); // thread safe copy CAircraftModelList models(rules.toAircraftModels()); // long lasting operation QWriteLocker l(&m_lockData); @@ -103,6 +103,7 @@ namespace BlackMisc void CVPilotRulesReader::gracefulShutdown() { + QWriteLocker l(&m_lockData); m_shutdown = true; } @@ -151,23 +152,23 @@ namespace BlackMisc return success; } - CWorker *CVPilotRulesReader::readASync(bool convertToModels) + CWorker *CVPilotRulesReader::readInBackground(bool convertToModels) { // set a thread safe flag { QWriteLocker l(&m_lockData); - if (m_asyncLoadInProgress) { return nullptr; } + if (m_asyncLoadInProgress || m_shutdown) { return nullptr; } m_asyncLoadInProgress = true; } BlackMisc::CWorker *worker = BlackMisc::CWorker::fromTask(this, "CVPilotRulesReader", [this, convertToModels]() { this->read(convertToModels); }); - worker->then(this, &CVPilotRulesReader::ps_readASyncFinished); + worker->then(this, &CVPilotRulesReader::ps_readInBackgroundFinished); return worker; } - void CVPilotRulesReader::ps_readASyncFinished() + void CVPilotRulesReader::ps_readInBackgroundFinished() { QWriteLocker l(&m_lockData); m_asyncLoadInProgress = false; diff --git a/src/blackmisc/simulation/fscommon/vpilotrulesreader.h b/src/blackmisc/simulation/fscommon/vpilotrulesreader.h index 906be6940..bab5b95a7 100644 --- a/src/blackmisc/simulation/fscommon/vpilotrulesreader.h +++ b/src/blackmisc/simulation/fscommon/vpilotrulesreader.h @@ -71,6 +71,7 @@ namespace BlackMisc int countRulesLoaded() const; //! Graceful shutdown + //! \threadsafe void gracefulShutdown(); //! The standard directory for vPilot mappings @@ -87,11 +88,12 @@ namespace BlackMisc //! Load data in background thread //! \threadsafe - BlackMisc::CWorker *readASync(bool convertToModels); + BlackMisc::CWorker *readInBackground(bool convertToModels); private slots: //! Asyncronous read finished - void ps_readASyncFinished(); + //! \threadsafe + void ps_readInBackgroundFinished(); private: QStringList m_fileList; //!< list of file names