GeoArea.h 1.51 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
#pragma once

#include <QObject>

#include "QGCMapPolygon.h"

class GeoArea : public QGCMapPolygon {
  Q_OBJECT
public:
  GeoArea(QObject *parent = nullptr);
  GeoArea(const GeoArea &other, QObject *parent = nullptr);
  GeoArea &operator=(const GeoArea &other);

  Q_PROPERTY(QString mapVisualQML READ mapVisualQML CONSTANT)
  Q_PROPERTY(QString editorQML READ editorQML CONSTANT)

  virtual QString mapVisualQML(void) const = 0;
  virtual QString editorQML(void) const = 0;

  virtual void saveToJson(QJsonObject &jsonObject);
  virtual bool loadFromJson(const QJsonObject &jsonObject,
                            QString &errorString);

  virtual GeoArea *clone(QObject *parent = nullptr) const = 0;

  bool isSimplePolygon();

  // static Members
  static const char *wimaAreaName;
  static const char *areaTypeName;
  static const char *settingsGroup;

private:
  void init();
};

// Example usage:
// QmlObjecListModel list;
// .... add areas ....
// auto area = getArea<WimaMeasurementArea *>(list); // returns the first
// WimaMeasurementArea or nullptr
template <class AreaPtr, class QObjectList>
inline AreaPtr getGeoArea(QObjectList &list) {
  static_assert(std::is_pointer<AreaPtr>::value,
                "AreaPtr must be a pointer type.");
  for (int i = 0; i < list.count(); ++i) {
    auto obj = list[i];
    auto area = qobject_cast<AreaPtr>(obj);
    if (area != nullptr) {
      return area;
    }
  }
  return nullptr;
}

bool copyAreaList(const QmlObjectListModel &from, QmlObjectListModel &to,
                  QObject *parent);