Ref T441, added progress bar and stop button to UI

This commit is contained in:
Klaus Basan
2018-12-09 19:16:40 +01:00
parent 6761a4c08a
commit 9525e0dbe5
5 changed files with 81 additions and 24 deletions

View File

@@ -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)
{

View File

@@ -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<QDialog::DialogCode>(m_reduceModelsDialog->exec());
const QDialog::DialogCode ret = static_cast<QDialog::DialogCode>(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<int> keys = removeModels.toDbKeySet();
models.removeObjectsWithKeys(keys);
// const QSet<int> 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);
}

View File

@@ -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

View File

@@ -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::CDbReduceModelDuplicates> ui;
bool m_stop = false;
BlackMisc::Simulation::CSimulatorInfo m_simulator;
BlackMisc::Simulation::CAircraftModelList m_models;
BlackMisc::Simulation::CAircraftModelList m_removeCandidates;

View File

@@ -124,17 +124,18 @@
<number>0</number>
</property>
<item>
<spacer name="hs_Button">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<widget class="QProgressBar" name="pb_Progress">
<property name="value">
<number>24</number>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</widget>
</item>
<item>
<widget class="QPushButton" name="pb_Stop">
<property name="text">
<string>stop</string>
</property>
</spacer>
</widget>
</item>
<item>
<widget class="QPushButton" name="pb_Run">
@@ -177,7 +178,7 @@
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
<set>QDialogButtonBox::Close</set>
</property>
</widget>
</item>
@@ -201,8 +202,9 @@
<tabstop>le_Distributor</tabstop>
<tabstop>rb_SameLiveryAndAircraft</tabstop>
<tabstop>rb_SameAirlineAndAircraft</tabstop>
<tabstop>tvp_RemoveModels</tabstop>
<tabstop>pb_Stop</tabstop>
<tabstop>pb_Run</tabstop>
<tabstop>tvp_RemoveModels</tabstop>
</tabstops>
<resources/>
<connections>