MeasurementArea.h 3.63 KB
Newer Older
1 2 3 4
#pragma once

#include <QFutureWatcher>
#include <QObject>
5
#include <QSharedPointer>
6 7
#include <QTimer>

8
#include "GeoArea.h"
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

#include "SettingsFact.h"

class TileData : public QObject {
public:
  QmlObjectListModel tiles;
  QVariantList tileCenterPoints;

  TileData();
  ~TileData();

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

24 25 26
  void saveToJson(QJsonObject &json);
  bool loadFromJson(const QJsonObject &json, QString &errorString);

27 28 29 30
  void clear();
  std::size_t size() const;
};

31
class MeasurementArea : public GeoArea {
32 33
  Q_OBJECT
  enum class STATE { IDLE, DEFERED, UPDATEING, RESTARTING, STOP };
34
  using DataPtr = QSharedPointer<TileData>;
35 36

public:
37 38 39 40
  MeasurementArea(QObject *parent = nullptr);
  MeasurementArea(const MeasurementArea &other, QObject *parent = nullptr);
  MeasurementArea &operator=(const MeasurementArea &other);
  ~MeasurementArea();
41 42 43 44 45 46 47 48

  Q_PROPERTY(Fact *tileHeight READ tileHeight CONSTANT)
  Q_PROPERTY(Fact *tileWidth READ tileWidth CONSTANT)
  Q_PROPERTY(Fact *minTileArea READ minTileArea CONSTANT)
  Q_PROPERTY(Fact *showTiles READ showTiles CONSTANT)
  Q_PROPERTY(QmlObjectListModel *tiles READ tiles NOTIFY tilesChanged)
  Q_PROPERTY(int maxTiles READ maxTiles NOTIFY maxTilesChanged)
  Q_PROPERTY(QVector<int> progress READ progressQml NOTIFY progressChanged)
49 50
  Q_PROPERTY(bool holdProgress READ holdProgress WRITE setHoldProgress NOTIFY
                 holdProgressChanged)
51

52 53 54 55
  // Overrides from GeoArea
  QString mapVisualQML(void) const override;
  QString editorQML(void) const override;
  MeasurementArea *clone(QObject *parent = nullptr) const;
56
  bool saveToJson(QJsonObject &json) override;
57
  bool loadFromJson(const QJsonObject &json, QString &errorString) override;
58
  Q_INVOKABLE virtual bool isCorrect();
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73

  // Property getters.
  Fact *tileHeight();
  Fact *tileWidth();
  Fact *minTileArea();
  Fact *showTiles();
  QmlObjectListModel *tiles();
  const QVector<int> &progress() const;
  QVector<int> progressQml() const;
  const QmlObjectListModel *tiles() const;
  const QVariantList &tileCenterPoints() const; // List of QGeoCoordinate
  const TileData &tileData() const;
  int maxTiles() const;
  bool ready() const;

74 75
  bool measurementCompleted() const;

76 77
  // Static Variables
  static const char *settingsGroup;
78
  static const char *nameString;
79

80 81 82 83 84 85 86 87 88 89 90 91
  //!
  //! \brief holdProgress
  //! \return Returns a copy of the holdProgress variable.
  //!
  bool holdProgress() const;
  //!
  //! \brief setHoldProgress Sets the holdProgress variable to \p holdProgress.
  //! \note If holdProgress() == true, than setProgress() will do nothing, but
  //! return false and emit the progressNotAccepted() signal.
  //!
  void setHoldProgress(bool holdProgress);

92 93 94 95 96 97 98
signals:
  void tilesChanged();
  void maxTilesChanged();
  void progressChanged();
  void progressAccepted();
  void progressNotAccepted();
  void readyChanged();
99
  void holdProgressChanged();
100 101 102

public slots:
  bool setProgress(const QVector<int> &p);
103 104
  Q_INVOKABLE void randomProgress();
  Q_INVOKABLE void resetProgress();
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126

private slots:
  void doUpdate();
  void deferUpdate();
  void storeTiles();
  void disableUpdate();
  void enableUpdate();

private:
  // Member Methodes
  void init();
  void setState(STATE s);

  // Members
  QMap<QString, FactMetaData *> _metaDataMap;

  SettingsFact _tileHeight;
  SettingsFact _tileWidth;
  SettingsFact _minTileAreaPercent; // 0..100
  SettingsFact _showTiles;

  QVector<int> _progress;
127
  bool _holdProgress;
128 129 130 131 132 133 134
  // Tile stuff.
  // Tile stuff.
  mutable QTimer _timer;
  mutable STATE _state;
  mutable TileData _tileData;
  mutable QFutureWatcher<DataPtr> _watcher;
};