diff --git a/src/blackgui/views/aircraftmodelview.cpp b/src/blackgui/views/aircraftmodelview.cpp index 0af4fc413..91fff02e8 100644 --- a/src/blackgui/views/aircraftmodelview.cpp +++ b/src/blackgui/views/aircraftmodelview.cpp @@ -8,8 +8,15 @@ */ #include "aircraftmodelview.h" +#include "blackmisc/aviation/aircrafticaocodelist.h" +#include "blackmisc/aviation/airlineicaocodelist.h" +#include "blackmisc/aviation/liverylist.h" +#include "blackmisc/simulation//distributorlist.h" +#include "blackgui/shortcut.h" +#include "blackgui/guiutility.h" #include "blackgui/filters/aircraftmodelfilterdialog.h" #include +#include #include #include @@ -33,6 +40,9 @@ namespace BlackGui Q_ASSERT_X(mainWindow, Q_FUNC_INFO, "no main window found"); this->setFilterDialog(new CAircraftModelFilterDialog(mainWindow)); + // shortcut + new QShortcut(CShortcut::keyStash(), this, SLOT(ps_stashShortcut()), nullptr, Qt::WidgetShortcut); + // default mode CAircraftModelListModel::AircraftModelMode mode = derivedModel()->getModelMode(); this->setAircraftModelMode(mode); @@ -42,6 +52,7 @@ namespace BlackGui { this->m_withMenuDisplayAutomatically = false; this->setCustomMenu(nullptr, false); // delete everything + derivedModel()->setAircraftModelMode(mode); switch (mode) { case CAircraftModelListModel::StashModel: @@ -81,23 +92,132 @@ namespace BlackGui } } - void CAircraftModelView::applyToSelected(const CLivery &livery) + int CAircraftModelView::applyToSelected(const CLivery &livery) { - if (!hasSelection()) { return; } + if (!hasSelection()) { return 0; } int c = this->updateSelected(CVariant::from(livery), CAircraftModel::IndexLivery); - // this->updateContainer(models); + return c; } - void CAircraftModelView::applyToSelected(const CAircraftIcaoCode &icao) + int CAircraftModelView::applyToSelected(const CAircraftIcaoCode &icao) { - if (!hasSelection()) { return; } + if (!hasSelection()) { return 0; } int c = this->updateSelected(CVariant::from(icao), CAircraftModel::IndexAircraftIcaoCode); + return c; } - void CAircraftModelView::applyToSelected(const CDistributor &distributor) + int CAircraftModelView::applyToSelected(const CDistributor &distributor) { - if (!hasSelection()) { return; } + if (!hasSelection()) { return 0; } int c = this->updateSelected(CVariant::from(distributor), CAircraftModel::IndexDistributor); + return c; + } + + bool CAircraftModelView::hasModelsToStash() const + { + return m_allowStash && hasSelection(); + } + + void CAircraftModelView::setImplementedMetaTypeIds() + { + this->setAcceptedMetaTypeIds( + { + qMetaTypeId(), qMetaTypeId(), + qMetaTypeId(), qMetaTypeId(), + qMetaTypeId(), qMetaTypeId(), + qMetaTypeId(), qMetaTypeId(), + qMetaTypeId(), qMetaTypeId(), + }); + } + + void CAircraftModelView::dropEvent(QDropEvent *event) + { + if (!isDropAllowed()) { return; } + if (!event) { return; } + const QMimeData *mime = event->mimeData(); + if (!mime) { return; } + + if (CGuiUtility::hasSwiftVariantMimeType(mime)) + { + CVariant valueVariant(CGuiUtility::fromSwiftDragAndDropData(mime)); + if (valueVariant.isValid()) + { + if (valueVariant.canConvert()) + { + CAircraftModel model = valueVariant.value(); + if (!model.hasModelString()) { return; } + const CAircraftModelList models({model}); + this->derivedModel()->replaceOrAddByModelString(models); + return; + } + else if (valueVariant.canConvert()) + { + CAircraftModelList models(valueVariant.value()); + if (models.isEmpty()) { return; } + this->derivedModel()->replaceOrAddByModelString(models); + return; + } + + // only for selected members + if (!this->hasSelection()) { return; } + if (valueVariant.canConvert()) + { + CAircraftIcaoCode icao = valueVariant.value(); + if (icao.validate().hasErrorMessages()) { return; } + this->applyToSelected(icao); + } + else if (valueVariant.canConvert()) + { + CAircraftIcaoCodeList icaos(valueVariant.value()); + if (icaos.size() != 1) { return; } + CAircraftIcaoCode icao = icaos.front(); + if (icao.validate().hasErrorMessages()) { return; } + this->applyToSelected(icao); + } + else if (valueVariant.canConvert()) + { + CLivery livery = valueVariant.value(); + if (livery.validate().hasErrorMessages()) { return; } + this->applyToSelected(livery); + } + else if (valueVariant.canConvert()) + { + CLiveryList liveries(valueVariant.value()); + if (liveries.size() != 1) { return; } + CLivery livery = liveries.front(); + if (livery.validate().hasErrorMessages()) { return; } + this->applyToSelected(livery); + } + else if (valueVariant.canConvert()) + { + CDistributor distributor = valueVariant.value(); + if (distributor.validate().hasErrorMessages()) { return; } + this->applyToSelected(distributor); + } + else if (valueVariant.canConvert()) + { + CDistributorList distributors(valueVariant.value()); + if (distributors.size() != 1) { return; } + CDistributor distributor = distributors.front(); + if (distributor.validate().hasErrorMessages()) { return; } + this->applyToSelected(distributor); + } + else if (valueVariant.canConvert()) + { + CAirlineIcaoCode airline = valueVariant.value(); + if (airline.validate().hasErrorMessages()) { return; } + emit requestHandlingOfStashDrop(airline); // I need to convert to stanard livery, which I can`t do here + } + else if (valueVariant.canConvert()) + { + CAirlineIcaoCodeList airlines(valueVariant.value()); + if (airlines.size() != 1) { return; } + CAirlineIcaoCode airline = airlines.front(); + if (airline.validate().hasErrorMessages()) { return; } + emit requestHandlingOfStashDrop(airline); // I need to convert to stanard livery, which I can`t do here + } + } + } // valid mime? } void CAircraftModelView::ps_toggleHighlightDbModels() @@ -112,6 +232,12 @@ namespace BlackGui derivedModel()->setHighlightModelsStrings(!h); } + void CAircraftModelView::ps_stashShortcut() + { + if (!m_allowStash) { return; } + emit requestStash(); + } + void CAircraftModelView::CHighlightDbModelsMenu::customMenu(QMenu &menu) const { const CAircraftModelView *mv = qobject_cast(parent()); @@ -131,6 +257,5 @@ namespace BlackGui a->setChecked(mv->derivedModel()->highlightGivenModelStrings()); this->nestedCustomMenu(menu); } - } // namespace } // namespace diff --git a/src/blackgui/views/aircraftmodelview.h b/src/blackgui/views/aircraftmodelview.h index 3569c68a7..1c0489b81 100644 --- a/src/blackgui/views/aircraftmodelview.h +++ b/src/blackgui/views/aircraftmodelview.h @@ -35,17 +35,33 @@ namespace BlackGui void setAircraftModelMode(Models::CAircraftModelListModel::AircraftModelMode mode); //! Apply to selected objects - void applyToSelected(const BlackMisc::Aviation::CLivery &livery); + int applyToSelected(const BlackMisc::Aviation::CLivery &livery); //! Apply to selected objects - void applyToSelected(const BlackMisc::Aviation::CAircraftIcaoCode &icao); + int applyToSelected(const BlackMisc::Aviation::CAircraftIcaoCode &icao); //! Apply to selected objects - void applyToSelected(const BlackMisc::Simulation::CDistributor &distributor); + int applyToSelected(const BlackMisc::Simulation::CDistributor &distributor); + + //! Allow to stash + void setAllowStash(bool stash) { m_allowStash = stash; } + + //! Has any models to stash amd is allowed to stash + bool hasModelsToStash() const; + + //! Add the technically supported metatypes as allows + void setImplementedMetaTypeIds(); signals: - //! Request to load VPilot data - void requestVPilotRules(); + //! Request to stash if applicable + void requestStash(); + + //! Request further handling of drops I cannot handle on my own + void requestHandlingOfStashDrop(const BlackMisc::Aviation::CAirlineIcaoCode &airlineIcao); + + protected: + //! \copydoc QTableView::dropEvent + virtual void dropEvent(QDropEvent *event) override; private slots: //! Highlight DB models @@ -54,7 +70,12 @@ namespace BlackGui //! Highlight stashed models void ps_toggleHighlightStashedModels(); + //! Stash shortcut pressed + void ps_stashShortcut(); + private: + bool m_allowStash = false; //!< allow to stash + //! Custom menu for the models which have been loaded class CHighlightDbModelsMenu : public BlackGui::IMenuDelegate {