refs #526, changed to publishing multiple (instead of 1) models

This commit is contained in:
Klaus Basan
2016-01-02 21:01:48 +01:00
parent 3168ef266a
commit e7f8061511
6 changed files with 135 additions and 57 deletions

View File

@@ -44,7 +44,6 @@ namespace BlackGui
this->ui->tvp_OwnAircraftModels->addFilterDialog();
// connects
connect(ui->editor_Model, &CModelMappingForm::requestPublish, this, &CDbMappingComponent::ps_publishSingleModelToDb);
connect(ui->editor_Model, &CModelMappingForm::requestStash, this, &CDbMappingComponent::ps_stashCurrentModel);
connect(ui->tvp_OwnAircraftModels, &CAircraftModelView::doubleClicked, this, &CDbMappingComponent::ps_onModelRowSelected);
@@ -244,7 +243,7 @@ namespace BlackGui
return currentTabIndex() == TabStash;
}
CStatusMessageList CDbMappingComponent::validate(bool withNestedForms) const
CStatusMessageList CDbMappingComponent::validateCurrentModel(bool withNestedForms) const
{
CStatusMessageList msgs(this->ui->editor_Model->validate(!withNestedForms));
if (withNestedForms)
@@ -256,24 +255,6 @@ namespace BlackGui
return msgs;
}
void CDbMappingComponent::ps_publishSingleModelToDb()
{
CStatusMessageList msgs(validate(true));
if (msgs.hasErrorMessages())
{
CLogMessage::preformatted(msgs);
this->showMessages(msgs);
return;
}
const CAircraftModel model(getAircraftModel());
msgs = this->asyncWriteModel(model);
if (!msgs.isEmpty())
{
CLogMessage(this).preformatted(msgs);
}
}
void CDbMappingComponent::ps_handleStashDropRequest(const CAirlineIcaoCode &code) const
{
CLivery stdLivery(this->getStdLiveryForAirlineCode(code));
@@ -284,13 +265,13 @@ namespace BlackGui
void CDbMappingComponent::ps_stashCurrentModel()
{
const CAircraftModel model(getAircraftModel());
if (!model.hasModelString())
CStatusMessageList msgs(this->validateCurrentModel(true));
if (msgs.hasErrorMessages())
{
CStatusMessage msg = CStatusMessage(CStatusMessage::SeverityError, "no model string, ignored");
this->showMessage(msg);
this->showMessages(msgs);
return;
}
this->ui->comp_StashAircraft->stashModel(model);
this->ui->comp_StashAircraft->stashModel(model, true);
}
void CDbMappingComponent::resizeForSelect()

View File

@@ -104,7 +104,7 @@ namespace BlackGui
public slots:
//! Validate, empty list means OK
BlackMisc::CStatusMessageList validate(bool withNestedForms) const;
BlackMisc::CStatusMessageList validateCurrentModel(bool withNestedForms) const;
//! Resize so that selection is easy (larger table view)
void resizeForSelect();
@@ -128,9 +128,6 @@ namespace BlackGui
//! Stashed models changed
void ps_onStashedModelsChanged();
//! Publish
void ps_publishSingleModelToDb();
//! Stash drop request
void ps_handleStashDropRequest(const BlackMisc::Aviation::CAirlineIcaoCode &code) const;

View File

@@ -6,10 +6,16 @@
<rect>
<x>0</x>
<y>0</y>
<width>262</width>
<width>600</width>
<height>618</height>
</rect>
</property>
<property name="minimumSize">
<size>
<width>600</width>
<height>400</height>
</size>
</property>
<property name="windowTitle">
<string>Frame</string>
</property>
@@ -226,7 +232,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>244</width>
<width>582</width>
<height>425</height>
</rect>
</property>

View File

@@ -76,6 +76,5 @@ namespace BlackGui
{
// code goes here
}
} // ns
} // ns

View File

@@ -38,14 +38,15 @@ namespace BlackGui
connect(this->ui->pb_Unstash, &QPushButton::pressed, this, &CDbStashComponent::ps_onUnstashPressed);
connect(this->ui->pb_Validate, &QPushButton::pressed, this, &CDbStashComponent::ps_onValidatePressed);
connect(this->ui->pb_Publish, &QPushButton::pressed, this, &CDbStashComponent::ps_onPublishPressed);
connect(this->ui->tvp_StashAircraftModels, &CAircraftModelView::modelChanged, this, &CDbStashComponent::stashedModelsChanged);
connect(this->ui->tvp_StashAircraftModels, &CAircraftModelView::rowCountChanged, this, &CDbStashComponent::ps_onRowCountChanged);
// copy over buttons
connect(this->ui->pb_AircraftIcao, &QPushButton::pressed, this, &CDbStashComponent::ps_copyOverValues);
connect(this->ui->pb_AirlineIcao, &QPushButton::pressed, this, &CDbStashComponent::ps_copyOverValues);
connect(this->ui->pb_Livery, &QPushButton::pressed, this, &CDbStashComponent::ps_copyOverValues);
connect(this->ui->pb_Distributor, &QPushButton::pressed, this, &CDbStashComponent::ps_copyOverValues);
connect(this->ui->pb_AircraftIcao, &QPushButton::pressed, this, &CDbStashComponent::ps_copyOverPartsToSelected);
connect(this->ui->pb_AirlineIcao, &QPushButton::pressed, this, &CDbStashComponent::ps_copyOverPartsToSelected);
connect(this->ui->pb_Livery, &QPushButton::pressed, this, &CDbStashComponent::ps_copyOverPartsToSelected);
connect(this->ui->pb_Distributor, &QPushButton::pressed, this, &CDbStashComponent::ps_copyOverPartsToSelected);
ui->tvp_StashAircraftModels->setCustomMenu(new CStashModelsMenu(this, true));
this->enableButtonRow();
@@ -57,6 +58,10 @@ namespace BlackGui
void CDbStashComponent::setProvider(IWebDataServicesProvider *provider)
{
CWebDataServicesAware::setProvider(provider);
provider->connectDataPublishSignal(
this,
std::bind(&CDbStashComponent::ps_publishResponse, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)
);
}
void CDbStashComponent::gracefulShutdown()
@@ -64,23 +69,33 @@ namespace BlackGui
// shutdown
}
CStatusMessage CDbStashComponent::validateStashModel(const CAircraftModel &model) const
CStatusMessage CDbStashComponent::validateStashModel(const CAircraftModel &model, bool allowReplace) const
{
static const CLogCategoryList cats(CLogCategoryList(this).join({ CLogCategory::validation()}));
if (this->ui->tvp_StashAircraftModels->container().containsModelStringOrId(model))
if (!allowReplace && this->ui->tvp_StashAircraftModels->container().containsModelStringOrId(model))
{
const QString msg("Model \"%1\" already stashed");
return CStatusMessage(cats, CStatusMessage::SeverityError, msg.arg(model.getModelString()));
return CStatusMessage(validationCats(), CStatusMessage::SeverityError, msg.arg(model.getModelString()));
}
return CStatusMessage();
}
CStatusMessage CDbStashComponent::stashModel(const CAircraftModel &model)
CStatusMessage CDbStashComponent::stashModel(const CAircraftModel &model, bool replace)
{
CStatusMessage m(validateStashModel(model));
CStatusMessage m(validateStashModel(model, replace));
if (!m.isWarningOrAbove())
{
this->ui->tvp_StashAircraftModels->insert(model);
if (replace)
{
this->ui->tvp_StashAircraftModels->replaceOrAdd(&CAircraftModel::getModelString, model.getModelString(), model);
}
else
{
this->ui->tvp_StashAircraftModels->insert(model);
}
}
else
{
this->showMessage(m);
}
return m;
}
@@ -107,6 +122,11 @@ namespace BlackGui
return !this->ui->tvp_StashAircraftModels->isEmpty();
}
int CDbStashComponent::getStashedModelsCount() const
{
return this->ui->tvp_StashAircraftModels->rowCount();
}
QStringList CDbStashComponent::getStashedModelStrings() const
{
return this->ui->tvp_StashAircraftModels->derivedModel()->getModelStrings(false);
@@ -170,25 +190,67 @@ namespace BlackGui
void CDbStashComponent::ps_onValidatePressed()
{
if (this->ui->tvp_StashAircraftModels->isEmpty()) {return; }
const CStatusMessageList msgs(this->validate());
this->showMessages(msgs);
this->validateAndDisplay(true);
}
void CDbStashComponent::ps_onPublishPressed()
{
if (this->ui->tvp_StashAircraftModels->isEmpty()) {return; }
if (!this->validateAndDisplay()) { return; }
CAircraftModelList models(getSelectedOrAllModels());
if (models.isEmpty()) { return; }
CStatusMessageList msgs = this->asyncPublishModels(models);
if (msgs.hasWarningOrErrorMessages())
{
this->showMessages(msgs);
}
}
void CDbStashComponent::ps_publishResponse(const CAircraftModelList &publishedModels, const CAircraftModelList &skippedModels, const CStatusMessageList &msgs)
{
if (!msgs.isEmpty())
{
this->showMessages(msgs);
}
Q_UNUSED(publishedModels);
Q_UNUSED(skippedModels);
}
CStatusMessageList CDbStashComponent::validate() const
{
if (this->ui->tvp_StashAircraftModels->isEmpty()) {return CStatusMessageList(); }
bool selectedOnly = ui->cb_SelectedOnly->isChecked();
const CAircraftModelList models(selectedOnly ? this->ui->tvp_StashAircraftModels->selectedObjects() : this->ui->tvp_StashAircraftModels->container());
CAircraftModelList models(getSelectedOrAllModels());
if (models.isEmpty()) { return CStatusMessageList(); }
const CStatusMessageList msgs(models.validateForPublishing());
if (!msgs.isEmpty()) { return msgs; }
return CStatusMessageList(
{
CStatusMessage(CStatusMessage::SeverityInfo, QString("No errors in %1 model(s)").arg(models.size()))
CStatusMessage(validationCats(), CStatusMessage::SeverityInfo, QString("No errors in %1 model(s)").arg(models.size()))
});
}
bool CDbStashComponent::validateAndDisplay(bool displayInfo)
{
const CStatusMessageList msgs(this->validate());
if (msgs.hasWarningOrErrorMessages())
{
this->showMessages(msgs);
return false;
}
else
{
if (displayInfo)
{
QString no = QString::number(this->getStashedModelsCount());
CStatusMessage msg(validationCats(), CStatusMessage::SeverityInfo, "Validation passed for " + no + " models");
this->showMessage(msg);
}
return true; // no error
}
}
void CDbStashComponent::enableButtonRow()
{
bool e = !this->ui->tvp_StashAircraftModels->isEmpty();
@@ -201,7 +263,20 @@ namespace BlackGui
this->ui->pb_Validate->setEnabled(e);
}
void CDbStashComponent::ps_copyOverValues()
const CLogCategoryList &CDbStashComponent::validationCats() const
{
static const CLogCategoryList cats(CLogCategoryList(this).join({ CLogCategory::validation()}));
return cats;
}
CAircraftModelList CDbStashComponent::getSelectedOrAllModels() const
{
bool selectedOnly = ui->cb_SelectedOnly->isChecked();
const CAircraftModelList models(selectedOnly ? this->ui->tvp_StashAircraftModels->selectedObjects() : this->ui->tvp_StashAircraftModels->container());
return models;
}
void CDbStashComponent::ps_copyOverPartsToSelected()
{
QObject *sender = QObject::sender();
BLACK_VERIFY_X(this->getMappingComponent(), Q_FUNC_INFO, "missing mapping component");
@@ -234,22 +309,22 @@ namespace BlackGui
this->enableButtonRow();
}
bool CDbStashComponent::showMessages(const CStatusMessageList &msgs, bool onlyErrors)
bool CDbStashComponent::showMessages(const CStatusMessageList &msgs, bool onlyErrors, int timeoutMs)
{
if (msgs.isEmpty()) { return false; }
if (!msgs.hasErrorMessages() && onlyErrors) { return false; }
BLACK_VERIFY_X(this->getMappingComponent(), Q_FUNC_INFO, "missing mapping component");
if (!this->getMappingComponent()) { return false; }
this->getMappingComponent()->showMessages(msgs);
this->getMappingComponent()->showMessages(msgs, timeoutMs);
return true;
}
bool CDbStashComponent::showMessage(const CStatusMessage &msg)
bool CDbStashComponent::showMessage(const CStatusMessage &msg, int timeoutMs)
{
if (msg.isEmpty()) { return false; }
BLACK_VERIFY_X(this->getMappingComponent(), Q_FUNC_INFO, "missing mapping component");
if (!this->getMappingComponent()) { return false; }
this->getMappingComponent()->showMessage(msg);
this->getMappingComponent()->showMessage(msg, timeoutMs);
return true;
}

View File

@@ -52,10 +52,10 @@ namespace BlackGui
void gracefulShutdown();
//! Test the given model if it can be stashed
BlackMisc::CStatusMessage validateStashModel(const BlackMisc::Simulation::CAircraftModel &model) const;
BlackMisc::CStatusMessage validateStashModel(const BlackMisc::Simulation::CAircraftModel &model, bool allowReplace) const;
//! Stash given model
BlackMisc::CStatusMessage stashModel(const BlackMisc::Simulation::CAircraftModel &model);
BlackMisc::CStatusMessage stashModel(const BlackMisc::Simulation::CAircraftModel &model, bool replace = false);
//! Stash given models
BlackMisc::CStatusMessageList stashModels(const BlackMisc::Simulation::CAircraftModelList &models);
@@ -66,6 +66,9 @@ namespace BlackGui
//! Has stashed models
bool hasStashedModels() const;
//! Number of models
int getStashedModelsCount() const;
//! Stashed model strings
QStringList getStashedModelStrings() const;
@@ -98,8 +101,16 @@ namespace BlackGui
//! Validate pressed
void ps_onValidatePressed();
//! Publish pressed
void ps_onPublishPressed();
//! Publish response received
void ps_publishResponse(const BlackMisc::Simulation::CAircraftModelList &publishedModels,
const BlackMisc::Simulation::CAircraftModelList &skippedModels,
const BlackMisc::CStatusMessageList &msgs);
//! Copy over values
void ps_copyOverValues();
void ps_copyOverPartsToSelected();
//! Row count changed
void ps_onRowCountChanged(int number, bool filter);
@@ -108,17 +119,26 @@ namespace BlackGui
QScopedPointer<Ui::CDbStashComponent> ui;
//! Display messages
bool showMessages(const BlackMisc::CStatusMessageList &msgs, bool onlyErrors = false);
bool showMessages(const BlackMisc::CStatusMessageList &msgs, bool onlyErrors = false, int timeoutMs = -1);
//! Display message
bool showMessage(const BlackMisc::CStatusMessage &msg);
bool showMessage(const BlackMisc::CStatusMessage &msg, int timeoutMs = -1);
//! Validate
BlackMisc::CStatusMessageList validate() const;
//! Validate and display info messages
bool validateAndDisplay(bool displayInfo = false);
//! Set the button row
void enableButtonRow();
//! Validation categories
const BlackMisc::CLogCategoryList &validationCats() const;
//! Get the selected only models or all models depending on checkbox
BlackMisc::Simulation::CAircraftModelList getSelectedOrAllModels() const;
//! Custom menu for the stashed models
class CStashModelsMenu : public BlackGui::IMenuDelegate
{