AreaData.h 2.4 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
#pragma once

#include <QGeoCoordinate>
#include <QObject>

#include "QmlObjectListModel.h"

class GeoArea;
class SafeArea;
class MeasurementArea;

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

Valentin Platzgummer's avatar
Valentin Platzgummer committed
20 21
  Q_PROPERTY(QmlObjectListModel *areaList READ areaList NOTIFY areaListChanged)

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 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
  // Member Methodes
  //!
  //! \brief insert Inserts the area if areaList does not contain it.
  //! \param areaData
  bool insert(GeoArea *areaData);
  //!
  //! \brief remove
  //! \param areaData Removes the area.
  //! \note Deletes the area if it has no parent.
  void remove(GeoArea *areaData);
  void clear();
  //!
  //! \brief areaList
  //! \return Returns the list of areas.
  //! \note For Qml use only, don't alter the list, or risk to break invariants.
  QmlObjectListModel *areaList();
  //!
  //! \brief areaList
  //! \return Returns the list of areas.
  const QmlObjectListModel *areaList() const;

  //!
  //! \brief origin
  //! \return Returns an origin near one of the areas.
  //! \note Origin might change if the list of areas changes.
  const QGeoCoordinate &origin() const;

  Q_INVOKABLE bool isValid() const;
  Q_INVOKABLE bool tryMakeValid();
  //!
  //! \brief initialize Initializes the areas in a valid way, such that they
  //! area inside the bounding box. \param bottomLeft bottom left corner of the
  //! bounding box. \param topRight  top right corner of the bounding box. \note
  //! Behavior is undefined, if \p bottomLeft and \p topRight are not the bottom
  //! left and the top right corner of the bounding box. \return Returns true on
  //! succes, false either.
  //!
  Q_INVOKABLE bool initialize(const QGeoCoordinate &bottomLeft,
                              const QGeoCoordinate &topRight);
  //!
  //! \brief initialized Checks if area data is initialized
  //! \return Returns true if area list contains a SafeArea and a
  //! MeasurementArea and both areas have atleast three vertices, returns false
  //! either.
  //!
  Q_INVOKABLE bool initialized();

  bool operator==(const AreaData &other) const;
  bool operator!=(const AreaData &other) const;

signals:
  void areaListChanged();
  void originChanged();

private:
  void _setOrigin(const QGeoCoordinate &origin);
  QGeoCoordinate _newOrigin();

  QGeoCoordinate _origin;
  QmlObjectListModel _areaList;
};