diff --git a/src/blackgui/components/dbreducemodelduplicates.cpp b/src/blackgui/components/dbreducemodelduplicates.cpp new file mode 100644 index 000000000..62f5e0cdd --- /dev/null +++ b/src/blackgui/components/dbreducemodelduplicates.cpp @@ -0,0 +1,118 @@ +/* Copyright (C) 2018 + * swift project Community / Contributors + * + * This file is part of swift Project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ + +#include "dbreducemodelduplicates.h" +#include "ui_dbreducemodelduplicates.h" + +#include "blackgui/guiapplication.h" +#include "blackgui/uppercasevalidator.h" +#include "blackcore/webdataservices.h" +#include "blackmisc/statusmessage.h" + +#include +#include + +using namespace BlackMisc; +using namespace BlackMisc::Simulation; +using namespace BlackGui::Views; + +namespace BlackGui +{ + namespace Components + { + CDbReduceModelDuplicates::CDbReduceModelDuplicates(QWidget *parent) : + QDialog(parent), + ui(new Ui::CDbReduceModelDuplicates) + { + ui->setupUi(this); + this->setWindowFlags(this->windowFlags() & ~Qt::WindowContextHelpButtonHint); + ui->tvp_RemoveModels->menuAddItems(CAircraftModelView::MenuRemoveSelectedRows); + ui->le_Distributor->setValidator(new CUpperCaseValidator(ui->le_Distributor)); + + connect(ui->pb_Run, &QPushButton::clicked, this, &CDbReduceModelDuplicates::process); + } + + CDbReduceModelDuplicates::~CDbReduceModelDuplicates() + { } + + void CDbReduceModelDuplicates::setModels(const CAircraftModelList &models, const CSimulatorInfo &simulator) + { + m_models = models; + m_simulator = simulator; + + const QStringList distributors = models.getDistributors().getDbKeysAndAliases(true); + QCompleter *c = new QCompleter(distributors, this); + c->setCaseSensitivity(Qt::CaseInsensitive); + ui->le_Distributor->setCompleter(c); + ui->le_Models->setText(QStringLiteral("%1 models for simulator '%2', distributors: %3").arg(models.size()).arg(simulator.toQString(true)).arg(distributors.size())); + } + + void CDbReduceModelDuplicates::process() + { + if (!sGui || sGui->isShuttingDown()) { return; } + if (m_models.isEmpty()) + { + const CStatusMessage m = CStatusMessage(this).validationError("No models"); + ui->fr_Overlay->showOverlayHTMLMessage(m, 5000); + return; + } + + const CAircraftModelList keyDuplicates = m_models.findDuplicateModelStrings(); + if (!keyDuplicates.isEmpty()) + { + const CStatusMessage m = CStatusMessage(this).validationError("Found %1 key duplicates") << keyDuplicates.size(); + ui->fr_Overlay->showOverlayHTMLMessage(m, 5000); + } + + if (ui->le_Distributor->text().isEmpty()) + { + const CStatusMessage m = CStatusMessage(this).validationError("No distributor"); + ui->fr_Overlay->showOverlayHTMLMessage(m, 5000); + return; + } + + const CDistributorList distributors = m_models.getDistributors(); + const CDistributor distributor = distributors.findByKeyOrAlias(ui->le_Distributor->text().trimmed().toUpper()); + if (!distributor.hasValidDbKey()) + { + const CStatusMessage m = CStatusMessage(this).validationError("Invalid distributor"); + ui->fr_Overlay->showOverlayHTMLMessage(m, 5000); + return; + } + + const CAircraftModelList distributorModels = m_models.findByDistributor(distributor); + CAircraftModelList nonDistributorModels = m_models; + nonDistributorModels.removeByDistributor(distributor); // all models of other distrbutors + CAircraftModelList removeModels; + + for (const CAircraftModel &distributorModel : distributorModels) + { + 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); + } + else if (ui->rb_SameAirlineAndAircraft->isChecked()) + { + removeModels.replaceOrAddModelsWithString(nonDistributorModels.findByAircraftAndAirline(distributorModel.getAircraftIcaoCode(), distributorModel.getAirlineIcaoCode()), Qt::CaseInsensitive); + } + } + + ui->tvp_RemoveModels->updateContainerMaybeAsync(removeModels); + m_removeCandidates = removeModels; + + 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); + } + } // ns +} // ns diff --git a/src/blackgui/components/dbreducemodelduplicates.h b/src/blackgui/components/dbreducemodelduplicates.h new file mode 100644 index 000000000..c3c568e9d --- /dev/null +++ b/src/blackgui/components/dbreducemodelduplicates.h @@ -0,0 +1,58 @@ +/* Copyright (C) 2018 + * swift project Community / Contributors + * + * This file is part of swift Project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ + +//! \file + +#ifndef BLACKGUI_COMPONENTS_DBREDUCEMODELDUPLICATES_H +#define BLACKGUI_COMPONENTS_DBREDUCEMODELDUPLICATES_H + +#include "blackmisc/simulation/aircraftmodellist.h" + +#include +#include + +namespace Ui { class CDbReduceModelDuplicates; } +namespace BlackGui +{ + namespace Components + { + //! Reduce modelss + class CDbReduceModelDuplicates : public QDialog + { + Q_OBJECT + + public: + //! Ctor + explicit CDbReduceModelDuplicates(QWidget *parent = nullptr); + + //! Destructor + virtual ~CDbReduceModelDuplicates(); + + //! Set the models + void setModels(const BlackMisc::Simulation::CAircraftModelList &models, const BlackMisc::Simulation::CSimulatorInfo &simulator); + + //! Process models + void process(); + + //! The models to be removed + const BlackMisc::Simulation::CAircraftModelList &getRemoveCandidates() const { return m_removeCandidates; } + + //! Simulator + const BlackMisc::Simulation::CSimulatorInfo &getSimulator() const { return m_simulator; } + + private: + QScopedPointer ui; + BlackMisc::Simulation::CSimulatorInfo m_simulator; + BlackMisc::Simulation::CAircraftModelList m_models; + BlackMisc::Simulation::CAircraftModelList m_removeCandidates; + }; + } //ns +} //ns + +#endif // guard diff --git a/src/blackgui/components/dbreducemodelduplicates.ui b/src/blackgui/components/dbreducemodelduplicates.ui new file mode 100644 index 000000000..d2af653ed --- /dev/null +++ b/src/blackgui/components/dbreducemodelduplicates.ui @@ -0,0 +1,236 @@ + + + CDbReduceModelDuplicates + + + + 0 + 0 + 640 + 480 + + + + Reduce models + + + + + + + 2 + + + 2 + + + 2 + + + 2 + + + + + Selection + + + + + + Models: + + + + + + + true + + + + + + + Preferred distributor: + + + + + + + + + + Reduction mode: + + + + + + + + 0 + + + 0 + + + + + with exactly same livery and aircraft + + + true + + + + + + + with same airline and aircraft + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + run + + + + + + + + + + + + + Remove models + + + + + + QAbstractItemView::SelectRows + + + false + + + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + BlackGui::Views::CAircraftModelView + QTableView +
blackgui/views/aircraftmodelview.h
+
+ + BlackGui::COverlayMessagesFrame + QFrame +
blackgui/overlaymessagesframe.h
+ 1 +
+
+ + le_Models + le_Distributor + rb_SameLiveryAndAircraft + rb_SameAirlineAndAircraft + tvp_RemoveModels + pb_Run + + + + + bb_ReduceModelDuplicates + accepted() + CDbReduceModelDuplicates + accept() + + + 248 + 254 + + + 157 + 274 + + + + + bb_ReduceModelDuplicates + rejected() + CDbReduceModelDuplicates + reject() + + + 316 + 260 + + + 286 + 274 + + + + +