Commit 1b05f323 authored by Valentin Platzgummer's avatar Valentin Platzgummer

MeasurementItemEditor improved

parent 31d4efc3
......@@ -34,14 +34,13 @@ DebugBuild {
DEFINES += DEBUG
#DEFINES += SNAKE_SHOW_TIME
#DEFINES += SNAKE_DEBUG
DEFINES += SNAKE_SHOW_TIME
DEFINES += DEBUG_CIRCULAR_SURVEY
#DEFINES += SNAKE_SHOW_TIME
DEFINES += ROS_BRIDGE_DEBUG
}
else {
DESTDIR = $${OUT_PWD}/release
#DEFINES += ROS_BRIDGE_DEBUG
DEFINES += SNAKE_SHOW_TIME
#DEFINES += SNAKE_SHOW_TIME
#DEFINES += SNAKE_DEBUG
DEFINES += NDEBUG
}
......
......@@ -18,8 +18,7 @@ AreaData::AreaData(QObject *parent) : QObject(parent) {}
AreaData::~AreaData() {}
AreaData::AreaData(const AreaData &other, QObject *parent)
: QObject(parent), _showErrorMessages(true) {
AreaData::AreaData(const AreaData &other, QObject *parent) : QObject(parent) {
*this = other;
}
......@@ -93,21 +92,21 @@ const QmlObjectListModel *AreaData::areaList() const { return &_areaList; }
QGeoCoordinate AreaData::origin() const { return _origin; }
bool AreaData::isCorrect() {
bool AreaData::isCorrect(bool showError) {
if (!initialized()) {
qCWarning(AreaDataLog) << "isCorrect(): not initialized";
return false;
}
// Check if areas are correct
if (!_areasCorrect()) {
if (!_areasCorrect(showError)) {
return false;
}
// Check if areas where added.
MeasurementArea *measurementArea = nullptr;
SafeArea *safeArea = nullptr;
if (!_getAreas(&measurementArea, &safeArea)) {
if (!_getAreas(&measurementArea, &safeArea, showError)) {
return false;
}
......@@ -128,7 +127,8 @@ bool AreaData::isCorrect() {
// qDebug() << ss.str().c_str();
if (!bg::covered_by(measurementAreaENU, safeAreaENU)) {
_processError(tr("Measurement Area not inside Safe Area. Please adjust "
"the Measurement Area.\n"));
"the Measurement Area.\n"),
showError);
return false;
}
......@@ -209,11 +209,11 @@ bool AreaData::initialized() {
measurementArea->count() >= 3 && safeArea->count() >= 3;
}
void AreaData::intersection() {
if (initialized() && _areasCorrect()) {
void AreaData::intersection(bool showError) {
if (initialized() && _areasCorrect(showError)) {
MeasurementArea *measurementArea = nullptr;
SafeArea *safeArea = nullptr;
if (_getAreas(&measurementArea, &safeArea)) {
if (_getAreas(&measurementArea, &safeArea, showError)) {
// convert to ENU
const auto origin = this->origin();
......@@ -230,7 +230,8 @@ void AreaData::intersection() {
if (outputENU.size() < 1 || outputENU[0].outer().size() < 4) {
_processError(
"Intersection did't deliver any result. Measurement Area and "
"Safe Area must touch each other.");
"Safe Area must touch each other.",
showError);
return;
}
......@@ -238,7 +239,8 @@ void AreaData::intersection() {
_processError(
"Hint: Only simple polygons can be displayed. If Intersection"
"produces polygons with holes or multi polygons, only "
"partial information can be displayed.");
"partial information can be displayed.",
showError);
}
// Shrink the result if safeAreaENU doesn't cover it.
......@@ -247,9 +249,10 @@ void AreaData::intersection() {
while (!bg::covered_by(large, safeAreaENU)) {
snake::offsetPolygon(large, small, -0.1);
large = std::move(small);
qDebug() << "intersection(): shrink";
}
// Check if result is different from input.
if (!bg::equals(large, measurementAreaENU)) {
// Convert.
measurementArea->clear();
for (auto it = large.outer().begin(); it != large.outer().end() - 1;
......@@ -260,6 +263,7 @@ void AreaData::intersection() {
}
}
}
}
}
MeasurementArea *AreaData::measurementArea() {
......@@ -302,7 +306,7 @@ bool AreaData::load(const QJsonObject &obj, QString &errorString) {
// load MeasurementArea
if (jsonArea[GeoArea::areaTypeKey].toString() ==
MeasurementArea::name) {
MeasurementArea::nameString) {
auto area = getGeoArea<MeasurementArea *>(_areaList);
......@@ -325,7 +329,8 @@ bool AreaData::load(const QJsonObject &obj, QString &errorString) {
}
}
// load SafeArea
else if (jsonArea[GeoArea::areaTypeKey].toString() == SafeArea::name) {
else if (jsonArea[GeoArea::areaTypeKey].toString() ==
SafeArea::nameString) {
auto area = getGeoArea<SafeArea *>(_areaList);
if (area == nullptr) {
......@@ -394,7 +399,6 @@ bool AreaData::save(QJsonObject &obj) {
} else {
qDebug(AreaDataLog) << "save(): not able to save area: "
<< area->objectName();
_processError(tr("Not able to save area: ") + area->objectName());
return false;
}
}
......@@ -411,21 +415,21 @@ void AreaData::_setOrigin(const QGeoCoordinate &origin) {
}
}
void AreaData::_processError(const QString &str) {
void AreaData::_processError(const QString &str, bool showError) {
this->_errorString = str;
emit error();
if (_showErrorMessages) {
if (showError) {
qgcApp()->informationMessageBoxOnMainThread(tr("Area Editor"),
this->errorString());
}
}
bool AreaData::_areasCorrect() {
bool AreaData::_areasCorrect(bool showError) {
// Check if areas are correct.
for (int i = 0; i < _areaList.count(); ++i) {
auto *area = _areaList.value<GeoArea *>(0);
auto *area = _areaList.value<GeoArea *>(i);
if (!area->isCorrect()) {
_processError(area->errorString());
_processError(area->errorString(), showError);
return false;
}
}
......@@ -433,30 +437,25 @@ bool AreaData::_areasCorrect() {
return true;
}
bool AreaData::_getAreas(MeasurementArea **measurementArea,
SafeArea **safeArea) {
bool AreaData::_getAreas(MeasurementArea **measurementArea, SafeArea **safeArea,
bool showError) {
*measurementArea = getGeoArea<MeasurementArea *>(_areaList);
if (*measurementArea == nullptr) {
_processError(
tr("Measurement Area missing. Please define a measurement area."));
tr("Measurement Area missing. Please define a measurement area."),
showError);
return false;
}
*safeArea = getGeoArea<SafeArea *>(_areaList);
if (*safeArea == nullptr) {
_processError(tr("Safe Area missing. Please define a safe area."));
_processError(tr("Safe Area missing. Please define a safe area."),
showError);
return false;
}
return true;
}
void AreaData::setShowErrorMessages(bool showErrorMessages) {
if (showErrorMessages != _showErrorMessages) {
_showErrorMessages = showErrorMessages;
emit showErrorMessagesChanged();
}
}
void AreaData::_updateOrigin() {
auto *measurementArea = getGeoArea<MeasurementArea *>(_areaList);
if (measurementArea != nullptr) {
......@@ -464,6 +463,4 @@ void AreaData::_updateOrigin() {
}
}
bool AreaData::showErrorMessages() const { return _showErrorMessages; }
QString AreaData::errorString() const { return _errorString; }
......@@ -20,8 +20,7 @@ public:
AreaData &operator=(const AreaData &other);
Q_PROPERTY(QmlObjectListModel *areaList READ areaList NOTIFY areaListChanged)
Q_PROPERTY(bool showErrorMessages READ showErrorMessages WRITE
setShowErrorMessages NOTIFY showErrorMessagesChanged)
Q_PROPERTY(QString errorString READ errorString NOTIFY error)
// Member Methodes
//!
......@@ -51,7 +50,7 @@ public:
//! \note Origin might change if the list of areas changes.
QGeoCoordinate origin() const;
Q_INVOKABLE bool isCorrect();
Q_INVOKABLE bool isCorrect(bool showError = true);
//!
//! \brief initialize Initializes the areas in a valid way, such that they
//! area inside the bounding box. \param bottomLeft bottom left corner of the
......@@ -69,7 +68,7 @@ public:
//! either.
//!
Q_INVOKABLE bool initialized();
Q_INVOKABLE void intersection();
Q_INVOKABLE void intersection(bool showError = true);
Q_INVOKABLE MeasurementArea *measurementArea();
Q_INVOKABLE SafeArea *safeArea();
......@@ -82,25 +81,21 @@ public:
QString errorString() const; // Contains a message about the last error.
bool showErrorMessages() const;
void setShowErrorMessages(bool showErrorMessages);
signals:
void areaListChanged();
void originChanged();
void error(); // Emitted if errorString() contains a new message.
void showErrorMessagesChanged();
private slots:
void _updateOrigin();
private:
void _setOrigin(const QGeoCoordinate &origin);
void _processError(const QString &str);
bool _areasCorrect();
bool _getAreas(MeasurementArea **measurementArea, SafeArea **safeArea);
void _processError(const QString &str, bool showError);
bool _areasCorrect(bool showError);
bool _getAreas(MeasurementArea **measurementArea, SafeArea **safeArea,
bool showError);
QGeoCoordinate _origin;
QmlObjectListModel _areaList;
QString _errorString;
bool _showErrorMessages;
};
......@@ -406,6 +406,7 @@ void CircularGenerator::setMeasurementArea(MeasurementArea *area) {
&CircularGenerator::resetReferenceIfInvalid);
connect(_measurementArea, &MeasurementArea::pathChanged, this,
&GeneratorBase::generatorChanged);
resetReferenceIfInvalid();
}
emit generatorChanged();
......@@ -438,16 +439,13 @@ bool circularTransects(const snake::FPoint &reference,
distances.reserve(polygon.outer().size());
std::vector<snake::Angle> angles;
angles.reserve(polygon.outer().size());
//#ifdef DEBUG_CIRCULAR_SURVEY
// qCDebug(CircularGeneratorLog) << "circularTransects():";
//#endif
for (const auto &p : polygon.outer()) {
snake::Length distance = bg::distance(reference, p) * si::meter;
distances.push_back(distance);
snake::Angle alpha = (std::atan2(p.get<1>(), p.get<0>())) * si::radian;
alpha = alpha < 0 * si::radian ? alpha + 2 * M_PI * si::radian : alpha;
angles.push_back(alpha);
//#ifdef DEBUG_CIRCULAR_SURVEY
// qCDebug(CircularGeneratorLog) << "distances, angles,
// coordinates:"; qCDebug(CircularGeneratorLog) <<
// to_string(distance).c_str(); qCDebug(CircularGeneratorLog)
......@@ -455,7 +453,6 @@ bool circularTransects(const snake::FPoint &reference,
// qCDebug(CircularGeneratorLog) << "x = " << p.get<0>() << "y
// = "
// << p.get<1>();
//#endif
}
auto rMin = deltaR; // minimal circle radius
......@@ -484,7 +481,6 @@ bool circularTransects(const snake::FPoint &reference,
vector<ClipperLib::Path> sectors(nTran, ClipperLib::Path());
const auto nSectors =
long(std::round(((alpha2 - alpha1) / deltaAlpha).value()));
//#ifdef DEBUG_CIRCULAR_SURVEY
// qCDebug(CircularGeneratorLog) << "circularTransects(): sector
// parameres:"; qCDebug(CircularGeneratorLog) << "alpha1: " <<
// to_string(snake::Degree(alpha1)).c_str();
......@@ -499,7 +495,6 @@ bool circularTransects(const snake::FPoint &reference,
// qCDebug(CircularGeneratorLog)
// << "rMax: " << to_string(rMax).c_str();
// qCDebug(CircularGeneratorLog) << "nTran: " << nTran;
//#endif
using ClipperCircle =
GenericCircle<ClipperLib::cInt, ClipperLib::IntPoint>;
for (auto &sector : sectors) {
......
......@@ -67,6 +67,7 @@ bool GeneratorFactory::registerGenerator(const QString &type,
GeneratorFactory::Creator creator) {
const auto pair = _creatorMap.insert(std::make_pair(type, creator));
auto success = pair.second;
Q_ASSERT(success);
return success;
}
......
......@@ -33,12 +33,12 @@ const char *MeasurementComplexItem::jsonComplexItemTypeValue =
const QString MeasurementComplexItem::name(tr("Measurement"));
namespace {
const char *variantKey = "Variant";
const char *variantIndexKey = "VariantIndex";
const char *altitudeKey = "Altitude";
const char *areaDataKey = "AreaData";
const char *variantNamesKey = "VariantNames";
const char *generatorsKey = "Generators";
const char *variantsKey = "Variants";
const char *generatorArrayKey = "GeneratorArray";
const char *variantArrayKey = "VariantArray";
const char *generatorIndexKey = "GeneratorIndex";
} // namespace
......@@ -51,17 +51,39 @@ MeasurementComplexItem::MeasurementComplexItem(
QStringLiteral(":/json/MeasurementComplexItem.SettingsGroup.json"),
this)),
_altitude(settingsGroup, _metaDataMap[altitudeKey]),
_variant(settingsGroup, _metaDataMap[variantKey]),
_variantIndex(settingsGroup, _metaDataMap[variantIndexKey]),
_pAreaData(new AreaData(this)), _pEditorData(new AreaData(this)),
_pCurrentData(_pAreaData), _pGenerator(nullptr),
_pWorker(new RoutingThread(this)) {
// Setup altitude.
_altitude.setRawValue(qgcApp()
->toolbox()
->settingsManager()
->appSettings()
->defaultMissionItemAltitude()
->rawValue());
connect(&_altitude, &SettingsFact::rawValueChanged, [this] {
emit this->minAMSLAltitudeChanged(this->_altitude.rawValue().toDouble());
});
connect(&_altitude, &SettingsFact::rawValueChanged, [this] {
emit this->maxAMSLAltitudeChanged(this->_altitude.rawValue().toDouble());
});
connect(&_altitude, &SettingsFact::rawValueChanged, [this] {
emit this->amslEntryAltChanged(this->_altitude.rawValue().toDouble());
});
connect(&_altitude, &SettingsFact::rawValueChanged, [this] {
emit this->amslExitAltChanged(this->_altitude.rawValue().toDouble());
});
connect(&_altitude, &SettingsFact::rawValueChanged, this,
&MeasurementComplexItem::_onAltitudeChanged);
Q_UNUSED(kmlOrShpFile)
_editorQml = "qrc:/qml/MeasurementItemEditor.qml";
// Connect facts.
connect(&this->_variant, &Fact::rawValueChanged, this,
&MeasurementComplexItem::_changeVariant);
connect(&this->_variantIndex, &Fact::rawValueChanged, this,
&MeasurementComplexItem::_changeVariantIndex);
// Connect worker.
connect(this->_pWorker, &RoutingThread::result, this,
......@@ -106,10 +128,6 @@ MeasurementComplexItem::MeasurementComplexItem(
resetGenerators();
startEditing();
qCritical() << "ToDo: _altitude connections missing.";
qCritical() << "ToDo: remove generatorNameList and use GeneratorBase::name() "
"instead.";
}
MeasurementComplexItem::~MeasurementComplexItem() {}
......@@ -173,10 +191,10 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject,
setSequenceNumber(sequenceNumber);
startEditing();
// load variant
if (complexObject.contains(variantKey) &&
complexObject[variantKey].isDouble()) {
_variant.setRawValue(complexObject[variantKey].toInt());
// load variant index
if (complexObject.contains(variantIndexKey) &&
complexObject[variantIndexKey].isDouble()) {
_variantIndex.setRawValue(complexObject[variantIndexKey].toInt());
}
// load altitude
......@@ -194,14 +212,11 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject,
complexObject[areaDataKey].isObject()) {
QString e;
if (_pCurrentData->load(complexObject[areaDataKey].toObject(), e)) {
_pCurrentData->setShowErrorMessages(false);
if (!_pCurrentData->isCorrect()) {
if (!_pCurrentData->isCorrect(false /*don't show gui message*/)) {
errorString.append(_pCurrentData->errorString());
_pCurrentData->setShowErrorMessages(true);
abortEditing();
return false;
}
_pCurrentData->setShowErrorMessages(true);
} else {
// this is critical, proceeding is not
......@@ -218,13 +233,13 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject,
}
// load Generators.
if (complexObject.contains(generatorsKey) &&
complexObject[generatorsKey].isArray()) {
if (complexObject.contains(generatorArrayKey) &&
complexObject[generatorArrayKey].isArray()) {
QVector<PtrGenerator> generatorList;
QObject parent;
for (const auto valueRef : complexObject[generatorsKey].toArray()) {
for (const auto valueRef : complexObject[generatorArrayKey].toArray()) {
const auto jsonGen = valueRef.toObject();
if (jsonGen.contains(routing::GeneratorBase::typeKey) &&
......@@ -276,7 +291,7 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject,
// insert generators
for (const auto gen : generatorList) {
gen->setParent(this);
addGenerator(gen->name(), gen);
addGenerator(gen);
}
}
} else {
......@@ -303,11 +318,11 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject,
// load Route Variants
bool variantsSuccess = true;
QVector<Variant> variantVector;
if (complexObject.contains(variantsKey) &&
complexObject[variantsKey].isArray()) {
if (complexObject.contains(variantArrayKey) &&
complexObject[variantArrayKey].isArray()) {
// load variants to variantVector for further processing.
for (const auto valueRef : complexObject[variantsKey].toArray()) {
for (const auto valueRef : complexObject[variantArrayKey].toArray()) {
if (valueRef.isArray()) {
const auto jsonVariant = valueRef.toArray();
Variant variant;
......@@ -333,6 +348,16 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject,
}
}
// Check if variantVector and variants are non empty
if (variantVector.size() == 0) {
variantsSuccess = false;
}
for (const auto &var : variantVector) {
if (var.size() == 0) {
variantsSuccess = false;
}
}
// Check if variants are covered by safe area.
if (variantsSuccess) {
auto safeArea = _pCurrentData->safeArea();
......@@ -362,11 +387,8 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject,
variantsSuccess = false;
}
if (!variantsSuccess) {
stopEditing(); // stop editing and trigger update
} else {
if (variantsSuccess) {
_variantVector.swap(variantVector);
qCritical() << "add variant names and set variant";
// load variant names
bool variantNamesLoaded = true;
......@@ -374,7 +396,7 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject,
complexObject[variantNamesKey].isArray()) {
QStringList variantNames;
for (const auto &name : complexObject[variantNamesKey]) {
for (const auto &name : complexObject[variantNamesKey].toArray()) {
if (name.isString()) {
variantNames.append(name.toString());
} else {
......@@ -413,11 +435,14 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject,
emit variantNamesChanged();
}
_changeVariant();
stopEditing(
false /*doUpdate*/); // does noting if editing was already stopped
_changeVariantIndex();
} else {
stopEditing(); // stop editing and trigger update
}
return true;
}
......@@ -460,7 +485,7 @@ void MeasurementComplexItem::save(QJsonArray &planItems) {
jsonComplexItemTypeValue;
// Variant and altitude.
saveObject[variantKey] = double(_variant.rawValue().toUInt());
saveObject[variantIndexKey] = double(_variantIndex.rawValue().toUInt());
saveObject[altitudeKey] = double(_altitude.rawValue().toUInt());
// Variant names.
......@@ -483,17 +508,16 @@ void MeasurementComplexItem::save(QJsonArray &planItems) {
QJsonArray generatorArray;
for (int i = 0; i < _generatorList.size(); ++i) {
auto const gen = _generatorList[i];
auto const &name = _generatorNameList[i];
QJsonObject obj;
if (!gen->save(obj)) {
qCDebug(MeasurementComplexItemLog)
<< "save(): not able to save generator: " << name;
<< "save(): not able to save generator with name: " << gen->name();
return;
} else {
generatorArray.append(obj);
}
}
saveObject[generatorsKey] = generatorArray;
saveObject[generatorArrayKey] = generatorArray;
// generator index
saveObject[generatorIndexKey] = generatorIndex();
......@@ -509,7 +533,7 @@ void MeasurementComplexItem::save(QJsonArray &planItems) {
}
variantsArray.append(variant);
}
saveObject[variantsKey] = variantsArray;
saveObject[variantArrayKey] = variantsArray;
planItems.append(saveObject);
} else {
......@@ -614,7 +638,6 @@ void MeasurementComplexItem::setMissionFlightStatus(
void MeasurementComplexItem::applyNewAltitude(double newAltitude) {
this->_altitude.setRawValue(newAltitude);
qWarning() << "applyNewAltitude(): impl. missing.";
}
double MeasurementComplexItem::additionalTimeDelay() const { return 0; }
......@@ -678,11 +701,8 @@ bool MeasurementComplexItem::_idle(MeasurementComplexItem::STATE state) {
}
void MeasurementComplexItem::_updateFlightpathSegments() {
if (_cTerrainCollisionSegments != 0) {
bool hasCollisionOld = _cTerrainCollisionSegments > 0;
_cTerrainCollisionSegments = 0;
emit terrainCollisionChanged(false);
qCritical() << "add alt color here...";
}
_flightPathSegments.beginReset();
_flightPathSegments.clearAndDeleteContents();
......@@ -708,12 +728,41 @@ void MeasurementComplexItem::_updateFlightpathSegments() {
_flightPathSegments.endReset();
if (_cTerrainCollisionSegments != 0) {
emit terrainCollisionChanged(true);
// Terrain collsision.
bool hasCollision = _cTerrainCollisionSegments > 0;
if (hasCollisionOld != hasCollision) {
emit terrainCollisionChanged(hasCollision);
}
if (_pAreaData->measurementArea() != nullptr) {
_pAreaData->measurementArea()->setShowAltColor(hasCollision);
}
_masterController->missionController()->recalcTerrainProfile();
}
void MeasurementComplexItem::_onAltitudeChanged() {
// Apply altitude to variants and route.
auto alt = _altitude.rawValue().toDouble();
for (auto &var : _variantVector) {
Variant *pVar;
if (var.size() > 0) {
pVar = &var;
} else {
pVar = &_route;
}
for (auto &qVariant : *pVar) {
auto vertex = qVariant.value<QGeoCoordinate>();
vertex.setAltitude(alt);
qVariant = QVariant::fromValue(vertex);
}
}
if (_route.size() > 0) {
emit routeChanged();
}
}
void MeasurementComplexItem::_setAreaData(
MeasurementComplexItem::PtrAreaData data) {
if (_pCurrentData != data) {
......@@ -796,9 +845,9 @@ void MeasurementComplexItem::_updateRoute() {
}
}
void MeasurementComplexItem::_changeVariant() {
void MeasurementComplexItem::_changeVariantIndex() {
if (idle()) {
auto variant = this->_variant.rawValue().toUInt();
auto variant = this->_variantIndex.rawValue().toUInt();
// Find old variant. Old variant corresponts with empty list.
std::size_t old_variant = std::numeric_limits<std::size_t>::max();
......@@ -828,14 +877,14 @@ void MeasurementComplexItem::_changeVariant() {
<< "Variant out of bounds (variant =" << variant << ").";
qCDebug(MeasurementComplexItemLog) << "Resetting variant to zero.";
disconnect(&this->_variant, &Fact::rawValueChanged, this,
&MeasurementComplexItem::_changeVariant);
this->_variant.setCookedValue(QVariant(0));
connect(&this->_variant, &Fact::rawValueChanged, this,
&MeasurementComplexItem::_changeVariant);
disconnect(&this->_variantIndex, &Fact::rawValueChanged, this,
&MeasurementComplexItem::_changeVariantIndex);
this->_variantIndex.setCookedValue(QVariant(0));
connect(&this->_variantIndex, &Fact::rawValueChanged, this,
&MeasurementComplexItem::_changeVariantIndex);
if (this->_variantVector.size() > 0) {
this->_changeVariant();
this->_changeVariantIndex();
}
}
}
......@@ -904,63 +953,60 @@ int MeasurementComplexItem::lastSequenceNumber() const {
return _sequenceNumber + std::max(0, this->_route.size() - 1);
}
bool MeasurementComplexItem::addGenerator(const QString &name,
routing::GeneratorBase *g) {
if (name.isEmpty()) {
qCDebug(MeasurementComplexItemLog) << "addGenerator(): empty name string.";
return false;
}
bool MeasurementComplexItem::addGenerator(routing::GeneratorBase *g) {
if (!g) {
if (g == nullptr) {
qCDebug(MeasurementComplexItemLog) << "addGenerator(): empty generator.";
Q_ASSERT(g != nullptr);
return false;
}
if (this->_generatorNameList.contains(name)) {
qCDebug(MeasurementComplexItemLog) << "addGenerator(): generator "
"already registered.";
for (const auto &otherGenerator : _generatorList) {
if (otherGenerator->name() == g->name()) {
qCDebug(MeasurementComplexItemLog)
<< "addGenerator(): generator with name " << g->name()
<< " already added.";
Q_ASSERT(otherGenerator->name() == g->name());
return false;
} else {
this->_generatorNameList.push_back(name);
}
}
this->_generatorList.push_back(g);
if (this->_generatorList.size() == 1) {
_setGenerator(g);
}
emit generatorNameListChanged();
emit generatorListChanged();
return true;
}
}
bool MeasurementComplexItem::removeGenerator(const QString &name) {
auto index = this->_generatorNameList.indexOf(name);
if (index >= 0) {
return removeGenerator(generatorIndex(name));
}
bool MeasurementComplexItem::removeGenerator(int index) {
if (index >= 0 && index < this->_generatorList.size()) {
// Is this the current generator?
const auto &g = this->_generatorList.at(index);
if (g == this->_pGenerator) {
if (index > 0) {
_setGenerator(this->_generatorList.at(index - 1));
} else if (index + 1 < _generatorList.size()) {
_setGenerator(this->_generatorList.at(index + 1));
} else {