diff --git a/src/blackcore/progress.h b/src/blackcore/progress.h index e0883c831..aa952d9f9 100644 --- a/src/blackcore/progress.h +++ b/src/blackcore/progress.h @@ -24,6 +24,9 @@ namespace BlackCore //! Update the progress indicator 0..100 virtual void updateProgressIndicator(int percentage) = 0; + //! Dtor + virtual ~IProgressIndicator() {} + //! Same as updateProgressIndicator but processing events void updateProgressIndicatorAndProcessEvents(int percentage) { diff --git a/src/blackgui/components/dbownmodelsetcomponent.cpp b/src/blackgui/components/dbownmodelsetcomponent.cpp index 7a6c213af..83e6bd41e 100644 --- a/src/blackgui/components/dbownmodelsetcomponent.cpp +++ b/src/blackgui/components/dbownmodelsetcomponent.cpp @@ -306,13 +306,15 @@ namespace BlackGui CAircraftModelList models = ui->tvp_OwnModelSet->containerOrFilteredContainer(); const CSimulatorInfo simulator = this->getModelSetSimulator(); m_reduceModelsDialog->setModels(models, simulator); - QDialog::DialogCode ret = static_cast(m_reduceModelsDialog->exec()); + const QDialog::DialogCode ret = static_cast(m_reduceModelsDialog->exec()); if (ret != QDialog::Accepted) { return; } const CAircraftModelList removeModels = m_reduceModelsDialog->getRemoveCandidates(); const CSimulatorInfo removeSimulator = m_reduceModelsDialog->getSimulator(); if (removeModels.isEmpty()) { return; } - const QSet keys = removeModels.toDbKeySet(); - models.removeObjectsWithKeys(keys); + // const QSet keys = removeModels.toDbKeySet(); + // models.removeObjectsWithKeys(keys); + const QStringList modelStrings = removeModels.getModelStringList(false); + models.removeModelsWithString(modelStrings, Qt::CaseInsensitive); // by strings also removes if id is missing this->setModelSet(models, removeSimulator); } diff --git a/src/blackgui/components/dbreducemodelduplicates.cpp b/src/blackgui/components/dbreducemodelduplicates.cpp index 84817aa94..ea644d3ea 100644 --- a/src/blackgui/components/dbreducemodelduplicates.cpp +++ b/src/blackgui/components/dbreducemodelduplicates.cpp @@ -32,12 +32,15 @@ namespace BlackGui ui(new Ui::CDbReduceModelDuplicates) { ui->setupUi(this); + this->clearProgressBar(); + this->setWindowFlags(this->windowFlags() & ~Qt::WindowContextHelpButtonHint); ui->tvp_RemoveModels->menuAddItems(CAircraftModelView::MenuRemoveSelectedRows); ui->tvp_RemoveModels->setAircraftModelMode(CAircraftModelListModel::OwnModelSet); ui->le_Distributor->setValidator(new CUpperCaseValidator(ui->le_Distributor)); connect(ui->pb_Run, &QPushButton::clicked, this, &CDbReduceModelDuplicates::process); + connect(ui->pb_Stop, &QPushButton::clicked, this, &CDbReduceModelDuplicates::stop); } CDbReduceModelDuplicates::~CDbReduceModelDuplicates() @@ -45,6 +48,8 @@ namespace BlackGui void CDbReduceModelDuplicates::setModels(const CAircraftModelList &models, const CSimulatorInfo &simulator) { + this->clearProgressBar(); + const bool changedSim = (m_simulator != simulator); if (changedSim) { @@ -71,6 +76,10 @@ namespace BlackGui void CDbReduceModelDuplicates::process() { if (!sGui || sGui->isShuttingDown()) { return; } + + this->clearProgressBar(); + m_stop = false; + if (m_models.isEmpty()) { const CStatusMessage m = CStatusMessage(this).validationError("No models"); @@ -103,32 +112,60 @@ namespace BlackGui } const CAircraftModelList distributorModels = m_models.findByDistributor(distributor); - CAircraftModelList nonDistributorModels = m_models; - nonDistributorModels.removeByDistributor(distributor); // all models of other distrbutors + CAircraftModelList otherDistributorsModels = m_models; + otherDistributorsModels.removeByDistributor(distributor); // all models of other distrbutors CAircraftModelList removeModels; + ui->pb_Progress->setMaximum(distributorModels.sizeInt()); + ui->pb_Progress->setValue(0); + + int mc = 0; for (const CAircraftModel &distributorModel : distributorModels) { + if (m_stop) { break; } if (!distributorModel.getLivery().isAirlineLivery()) { continue; } if (!distributorModel.getAircraftIcaoCode().hasValidDbKey()) { continue; } if (ui->rb_SameLiveryAndAircraft->isChecked()) { - removeModels.replaceOrAddModelsWithString(nonDistributorModels.findByAircraftAndLivery(distributorModel.getAircraftIcaoCode(), distributorModel.getLivery()), Qt::CaseInsensitive); + removeModels.replaceOrAddModelsWithString(otherDistributorsModels.findByAircraftAndLivery(distributorModel.getAircraftIcaoCode(), distributorModel.getLivery()), Qt::CaseInsensitive); } else if (ui->rb_SameAirlineAndAircraft->isChecked()) { - removeModels.replaceOrAddModelsWithString(nonDistributorModels.findByAircraftAndAirline(distributorModel.getAircraftIcaoCode(), distributorModel.getAirlineIcaoCode()), Qt::CaseInsensitive); + removeModels.replaceOrAddModelsWithString(otherDistributorsModels.findByAircraftAndAirline(distributorModel.getAircraftIcaoCode(), distributorModel.getAirlineIcaoCode()), Qt::CaseInsensitive); } + + if (mc % 50 == 0) { ui->pb_Progress->setValue(mc); } + if (mc % 100 == 0) { CGuiApplication::processEventsFor(10); } + mc++; } + if (!m_stop) { ui->pb_Progress->setValue(distributorModels.sizeInt()); } ui->tvp_RemoveModels->updateContainerMaybeAsync(removeModels); m_removeCandidates = removeModels; + m_stop = false; const QString distKeys = removeModels.getDistributors().dbKeysAsString(", "); - const CStatusMessage m = removeModels.isEmpty() ? - CStatusMessage(this).info("No duplicates to be removed!") : - CStatusMessage(this).info("You can remove %1 models of the following distributors: '%2'.") << removeModels.size() << distKeys; - ui->fr_Overlay->showOverlayHTMLMessage(m, 5000); + const CStatusMessage msg = removeModels.isEmpty() ? + CStatusMessage(this).info("No duplicates to be removed!") : + CStatusMessage(this).info("You can remove %1 models of the following distributors: '%2'.") << removeModels.size() << distKeys; + ui->fr_Overlay->showOverlayHTMLMessage(msg, 5000); } + + void CDbReduceModelDuplicates::updateProgressIndicator(int percentage) + { + const int delta = ui->pb_Progress->maximum() - ui->pb_Progress->minimum(); + const double p = percentage; + const int value = qRound(delta * 100.0 / p); + ui->pb_Progress->setValue(value); + } + + void CDbReduceModelDuplicates::clearProgressBar() + { + ui->pb_Progress->setMaximum(100); // otherwise undetermined + ui->pb_Progress->setMinimum(0); + ui->pb_Progress->setValue(0); + ui->pb_Progress->setFormat("%v/%m"); + } + } // ns } // ns diff --git a/src/blackgui/components/dbreducemodelduplicates.h b/src/blackgui/components/dbreducemodelduplicates.h index 43fabdb76..705aae646 100644 --- a/src/blackgui/components/dbreducemodelduplicates.h +++ b/src/blackgui/components/dbreducemodelduplicates.h @@ -12,6 +12,7 @@ #ifndef BLACKGUI_COMPONENTS_DBREDUCEMODELDUPLICATES_H #define BLACKGUI_COMPONENTS_DBREDUCEMODELDUPLICATES_H +#include "blackcore/progress.h" #include "blackmisc/simulation/aircraftmodellist.h" #include "blackmisc/simulation/settings/modelsettings.h" #include "blackmisc/settingscache.h" @@ -25,7 +26,9 @@ namespace BlackGui namespace Components { //! Reduce modelss - class CDbReduceModelDuplicates : public QDialog + class CDbReduceModelDuplicates : + public QDialog, + public BlackCore::IProgressIndicator { Q_OBJECT @@ -34,7 +37,7 @@ namespace BlackGui explicit CDbReduceModelDuplicates(QWidget *parent = nullptr); //! Destructor - virtual ~CDbReduceModelDuplicates(); + virtual ~CDbReduceModelDuplicates() override; //! Set the models void setModels(const BlackMisc::Simulation::CAircraftModelList &models, const BlackMisc::Simulation::CSimulatorInfo &simulator); @@ -42,6 +45,9 @@ namespace BlackGui //! Process models void process(); + //! \copydoc BlackCore::IProgressIndicator::updateProgressIndicator + virtual void updateProgressIndicator(int percentage) override; + //! The models to be removed const BlackMisc::Simulation::CAircraftModelList &getRemoveCandidates() const { return m_removeCandidates; } @@ -49,7 +55,14 @@ namespace BlackGui const BlackMisc::Simulation::CSimulatorInfo &getSimulator() const { return m_simulator; } private: + //! Clear progress bar + void clearProgressBar(); + + //! Stop + void stop() { m_stop = true; } + QScopedPointer ui; + bool m_stop = false; BlackMisc::Simulation::CSimulatorInfo m_simulator; BlackMisc::Simulation::CAircraftModelList m_models; BlackMisc::Simulation::CAircraftModelList m_removeCandidates; diff --git a/src/blackgui/components/dbreducemodelduplicates.ui b/src/blackgui/components/dbreducemodelduplicates.ui index 28c93ea17..377b67078 100644 --- a/src/blackgui/components/dbreducemodelduplicates.ui +++ b/src/blackgui/components/dbreducemodelduplicates.ui @@ -124,17 +124,18 @@ 0 - - - Qt::Horizontal + + + 24 - - - 40 - 20 - + + + + + + stop - + @@ -177,7 +178,7 @@ Qt::Horizontal - QDialogButtonBox::Cancel|QDialogButtonBox::Ok + QDialogButtonBox::Close @@ -201,8 +202,9 @@ le_Distributor rb_SameLiveryAndAircraft rb_SameAirlineAndAircraft - tvp_RemoveModels + pb_Stop pb_Run + tvp_RemoveModels