mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-04 16:56:53 +08:00
Ref T441, added progress bar and stop button to UI
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user