Commit 8250ef7b authored by Valentin Platzgummer's avatar Valentin Platzgummer

measurement complex item loading almost finished

parent 1eccaa0c
...@@ -304,14 +304,16 @@ bool AreaData::load(const QJsonObject &obj, QString &errorString) { ...@@ -304,14 +304,16 @@ bool AreaData::load(const QJsonObject &obj, QString &errorString) {
if (JsonHelper::validateKeys(obj, keyInfo, e)) { if (JsonHelper::validateKeys(obj, keyInfo, e)) {
this->clear(); this->clear();
// iterate over json array // iterate over json array
for (const auto &jsonArea : obj[areaListKey].toArray()) { for (const auto valueRef : obj[areaListKey].toArray()) {
const auto jsonArea = valueRef.toObject();
// check if area type key is present // check if area type key is present
QList<JsonHelper::KeyValidateInfo> areaInfo = { QList<JsonHelper::KeyValidateInfo> areaInfo = {
{GeoArea::areaTypeKey, QJsonValue::String, true}, {GeoArea::areaTypeKey, QJsonValue::String, true},
}; };
if (!JsonHelper::validateKeys(jsonArea, areaInfo, e)) { if (!JsonHelper::validateKeys(jsonArea, areaInfo, e)) {
// load MeasurementArea // load MeasurementArea
if (jsonArea[GeoArea::areaTypeKey] == MeasurementArea::name) { if (jsonArea[GeoArea::areaTypeKey].toString() ==
MeasurementArea::name) {
auto area = getGeoArea<MeasurementArea *>(_areaList); auto area = getGeoArea<MeasurementArea *>(_areaList);
if (area == nullptr) { if (area == nullptr) {
auto area = new MeasurementArea(this); auto area = new MeasurementArea(this);
...@@ -330,7 +332,8 @@ bool AreaData::load(const QJsonObject &obj, QString &errorString) { ...@@ -330,7 +332,8 @@ bool AreaData::load(const QJsonObject &obj, QString &errorString) {
} }
} }
// load SafeArea // load SafeArea
else if (jsonArea[GeoArea::areaTypeKey] == SafeArea::name) { else if (jsonArea[GeoArea::areaTypeKey].toString() ==
SafeArea::name) {
auto area = getGeoArea<SafeArea *>(_areaList); auto area = getGeoArea<SafeArea *>(_areaList);
if (area == nullptr) { if (area == nullptr) {
auto area = new SafeArea(this); auto area = new SafeArea(this);
...@@ -352,7 +355,7 @@ bool AreaData::load(const QJsonObject &obj, QString &errorString) { ...@@ -352,7 +355,7 @@ bool AreaData::load(const QJsonObject &obj, QString &errorString) {
else { else {
returnValue = false; returnValue = false;
errorString.append(tr("Unknown area type: ") + errorString.append(tr("Unknown area type: ") +
jsonArea[GeoArea::areaTypeKey]); jsonArea[GeoArea::areaTypeKey].toString());
} }
} }
// GeoArea::areaTypeKey missing // GeoArea::areaTypeKey missing
...@@ -397,7 +400,7 @@ bool AreaData::save(QJsonObject &obj) { ...@@ -397,7 +400,7 @@ bool AreaData::save(QJsonObject &obj) {
QJsonObject temp; QJsonObject temp;
QJsonValue jsonOrigin; QJsonValue jsonOrigin;
JsonHelper::saveGeoCoordinate(_origin, true, jsonOrigin); JsonHelper::saveGeoCoordinate(_origin, false, jsonOrigin);
temp[originKey] = jsonOrigin; temp[originKey] = jsonOrigin;
temp[initializedKey] = _initialized; temp[initializedKey] = _initialized;
......
...@@ -19,12 +19,20 @@ template <> inline auto get<0>(const IntPoint &p) { return p.X; } ...@@ -19,12 +19,20 @@ template <> inline auto get<0>(const IntPoint &p) { return p.X; }
template <> inline auto get<1>(const IntPoint &p) { return p.Y; } template <> inline auto get<1>(const IntPoint &p) { return p.Y; }
namespace routing { namespace routing {
namespace {
const QString generatorType = "CircularGenerator"; const QString generatorType = "CircularGenerator";
GeneratorBase *creator(QObject *parent) { GeneratorBase *creator(QObject *parent) {
return new CircularGenerator(parent); return new CircularGenerator(parent);
} }
const char *distanceKey = "TransectDistance";
const char *deltaAlphaKey = "DeltaAlpha";
const char *minLengthKey = "MinLength";
const char *referenceKey = "ReferencePoint";
} // namespace
REGISTER_GENERATOR(generatorType, creator) REGISTER_GENERATOR(generatorType, creator)
bool circularTransects(const snake::FPoint &reference, bool circularTransects(const snake::FPoint &reference,
...@@ -34,10 +42,6 @@ bool circularTransects(const snake::FPoint &reference, ...@@ -34,10 +42,6 @@ bool circularTransects(const snake::FPoint &reference,
snake::Length minLength, snake::Transects &transects); snake::Length minLength, snake::Transects &transects);
const char *CircularGenerator::settingsGroup = "CircularGenerator"; const char *CircularGenerator::settingsGroup = "CircularGenerator";
const char *distanceKey = "TransectDistance";
const char *deltaAlphaKey = "DeltaAlpha";
const char *minLengthKey = "MinLength";
const char *referenceKey = "ReferencePoint";
CircularGenerator::CircularGenerator(QObject *parent) CircularGenerator::CircularGenerator(QObject *parent)
: CircularGenerator(nullptr, parent) {} : CircularGenerator(nullptr, parent) {}
...@@ -192,6 +196,8 @@ void CircularGenerator::setReference(const QGeoCoordinate &reference) { ...@@ -192,6 +196,8 @@ void CircularGenerator::setReference(const QGeoCoordinate &reference) {
bool CircularGenerator::save(QJsonObject &obj) const { bool CircularGenerator::save(QJsonObject &obj) const {
QJsonObject temp; QJsonObject temp;
GeneratorBase::save(temp);
bool ok = false; bool ok = false;
auto variant = _distance.rawValue(); auto variant = _distance.rawValue();
auto val = variant.toDouble(&ok); auto val = variant.toDouble(&ok);
...@@ -237,6 +243,14 @@ bool CircularGenerator::save(QJsonObject &obj) const { ...@@ -237,6 +243,14 @@ bool CircularGenerator::save(QJsonObject &obj) const {
bool CircularGenerator::load(const QJsonObject &obj, QString &errorString) { bool CircularGenerator::load(const QJsonObject &obj, QString &errorString) {
bool returnValue = true; bool returnValue = true;
{
QString e;
if (!GeneratorBase::load(obj, e)) {
returnValue = false;
errorString.append(e);
}
}
// load distance // load distance
{ {
QString e; QString e;
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
namespace routing { namespace routing {
const char *GeneratorBase::typeKey = "GeneratorType"; const char *GeneratorBase::typeKey = "GeneratorType";
const char *GeneratorBase::nameKey = "Name";
GeneratorBase::GeneratorBase(QObject *parent) GeneratorBase::GeneratorBase(QObject *parent)
: GeneratorBase(nullptr, parent) {} : GeneratorBase(nullptr, parent) {}
...@@ -16,7 +17,24 @@ GeneratorBase::GeneratorBase(GeneratorBase::Data d, QObject *parent) ...@@ -16,7 +17,24 @@ GeneratorBase::GeneratorBase(GeneratorBase::Data d, QObject *parent)
GeneratorBase::~GeneratorBase() {} GeneratorBase::~GeneratorBase() {}
QString GeneratorBase::name() { return _name; } bool GeneratorBase::save(QJsonObject &obj) const {
obj[typeKey] = type();
obj[name] = name();
return true;
}
bool GeneratorBase::load(const QJsonObject &obj, QString &errorString) {
if (obj.contains[nameKey] && obj[nameKey].isString()) {
setName(obj[nameKey].toString());
return true;
} else {
errorString.append(
tr("Not able to load generator name. Leaving name unchanged."));
return false;
}
}
QString GeneratorBase::name() const { return _name; }
void GeneratorBase::setName(const QString &name) { void GeneratorBase::setName(const QString &name) {
if (_name != name) { if (_name != name) {
......
...@@ -27,16 +27,17 @@ public: ...@@ -27,16 +27,17 @@ public:
Q_PROPERTY(QString mapVisualQml READ mapVisualQml CONSTANT) Q_PROPERTY(QString mapVisualQml READ mapVisualQml CONSTANT)
Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged) Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
virtual QString editorQml() = 0; virtual QString editorQml() const = 0;
virtual QString mapVisualQml() = 0; virtual QString mapVisualQml() const = 0;
virtual bool save(QJsonObject &obj) const = 0; virtual bool save(QJsonObject &obj) const; // must be called if overridden
virtual bool load(const QJsonObject &obj, QString &errorString) = 0; virtual bool load(const QJsonObject &obj,
QString &errorString); // must be called if overridden
QString name(); QString name() const;
void setName(const QString &name); void setName(const QString &name);
virtual QString abbreviation() = 0; virtual QString abbreviation() const = 0;
virtual QString type() = 0; virtual QString type() const = 0;
virtual bool get(Generator &generator) = 0; virtual bool get(Generator &generator) = 0;
...@@ -44,6 +45,7 @@ public: ...@@ -44,6 +45,7 @@ public:
void setData(Data d); void setData(Data d);
static const char *typeKey; static const char *typeKey;
static const char *nameKey;
signals: signals:
void generatorChanged(); void generatorChanged();
......
...@@ -12,10 +12,17 @@ ...@@ -12,10 +12,17 @@
#include "nemo_interface/SnakeTile.h" #include "nemo_interface/SnakeTile.h"
namespace routing { namespace routing {
namespace {
const QString generatorType = "LinearGenerator"; const QString generatorType = "LinearGenerator";
GeneratorBase *creator(QObject *parent) { return new LinearGenerator(parent); } GeneratorBase *creator(QObject *parent) { return new LinearGenerator(parent); }
const char *distanceKey = "TransectDistance";
const char *alphaKey = "Alpha";
const char *minLengthKey = "MinLength";
} // namespace
REGISTER_GENERATOR(generatorType, creator) REGISTER_GENERATOR(generatorType, creator)
QGC_LOGGING_CATEGORY(LinearGeneratorLog, "LinearGeneratorLog") QGC_LOGGING_CATEGORY(LinearGeneratorLog, "LinearGeneratorLog")
...@@ -25,9 +32,6 @@ bool linearTransects(const snake::FPolygon &polygon, ...@@ -25,9 +32,6 @@ bool linearTransects(const snake::FPolygon &polygon,
snake::Length minLength, snake::Transects &transects); snake::Length minLength, snake::Transects &transects);
const char *LinearGenerator::settingsGroup = "LinearGenerator"; const char *LinearGenerator::settingsGroup = "LinearGenerator";
const char *distanceKey = "TransectDistance";
const char *alphaKey = "Alpha";
const char *minLengthKey = "MinLength";
LinearGenerator::LinearGenerator(QObject *parent) LinearGenerator::LinearGenerator(QObject *parent)
: LinearGenerator(nullptr, parent) {} : LinearGenerator(nullptr, parent) {}
...@@ -159,6 +163,8 @@ bool LinearGenerator::get(Generator &generator) { ...@@ -159,6 +163,8 @@ bool LinearGenerator::get(Generator &generator) {
bool LinearGenerator::save(QJsonObject &obj) const { bool LinearGenerator::save(QJsonObject &obj) const {
QJsonObject temp; QJsonObject temp;
GeneratorBase::save(temp);
bool ok = false; bool ok = false;
auto variant = _distance.rawValue(); auto variant = _distance.rawValue();
auto val = variant.toDouble(&ok); auto val = variant.toDouble(&ok);
...@@ -200,6 +206,14 @@ bool LinearGenerator::save(QJsonObject &obj) const { ...@@ -200,6 +206,14 @@ bool LinearGenerator::save(QJsonObject &obj) const {
bool LinearGenerator::load(const QJsonObject &obj, QString &errorString) { bool LinearGenerator::load(const QJsonObject &obj, QString &errorString) {
bool returnValue = true; bool returnValue = true;
{
QString e;
if (!GeneratorBase::load(obj, e)) {
returnValue = false;
errorString.append(e);
}
}
// load distance // load distance
{ {
QString e; QString e;
......
...@@ -101,9 +101,12 @@ public: ...@@ -101,9 +101,12 @@ public:
Q_INVOKABLE bool switchToGenerator(const QString &name); Q_INVOKABLE bool switchToGenerator(const QString &name);
Q_INVOKABLE bool switchToGenerator(int index); Q_INVOKABLE bool switchToGenerator(int index);
Q_INVOKABLE void resetGenerators(); Q_INVOKABLE void resetGenerators();
QStringList generatorNameList(); QStringList generatorNameList() const;
routing::GeneratorBase *generator(); routing::GeneratorBase *generator();
int generatorIndex(); const routing::GeneratorBase *generator() const;
routing::GeneratorBase *generator(int index);
const routing::GeneratorBase *generator(int index) const;
int generatorIndex() const;
// Editing. // Editing.
//! //!
...@@ -119,7 +122,11 @@ public: ...@@ -119,7 +122,11 @@ public:
//! Stops area editing. Will reset area data to the state before //! Stops area editing. Will reset area data to the state before
//! editingStart() if it is invalid. Triggers a route update. //! editingStart() if it is invalid. Triggers a route update.
//! //!
Q_INVOKABLE void stopEditing(); //! \param doUpdate No route update will be triggered if false, route update
//! will eventually be triggered if true. \return Returns true if a route
//! update was triggered, false either.
//!
Q_INVOKABLE bool stopEditing(bool doUpdate = true);
//! //!
//! \brief abortEditing Aborts area editing. //! \brief abortEditing Aborts area editing.
//! //!
...@@ -143,8 +150,6 @@ public: ...@@ -143,8 +150,6 @@ public:
bool followTerrain() const; bool followTerrain() const;
static const char *settingsGroup; static const char *settingsGroup;
static const char *variantName;
static const char *altitudeName;
static const char *jsonComplexItemTypeValue; static const char *jsonComplexItemTypeValue;
static const QString name; static const QString name;
......
...@@ -38,10 +38,9 @@ inline static void qCallOnce(Function func, QBasicAtomicInt &flag) { ...@@ -38,10 +38,9 @@ inline static void qCallOnce(Function func, QBasicAtomicInt &flag) {
} }
template <class Function> inline static void qCallOncePerThread(Function func) { template <class Function> inline static void qCallOncePerThread(Function func) {
using namespace CallOnce; if (!CallOnce::once_flag()->hasLocalData()) {
if (!once_flag()->hasLocalData()) { CallOnce::once_flag()->setLocalData(new QAtomicInt(CallOnce::CO_Request));
once_flag()->setLocalData(new QAtomicInt(CO_Request)); qCallOnce(func, *CallOnce::once_flag()->localData());
qCallOnce(func, *once_flag()->localData());
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment