RouteComplexItem.h 4.49 KB
Newer Older
1 2 3 4 5 6 7 8 9
#pragma once

#include <QFutureWatcher>
#include <QVector>
#include <memory>

#include "SettingsFact.h"
#include "TransectStyleComplexItem.h"

10
#include "AreaData.h"
11 12 13 14 15 16 17 18

class RoutingThread;
class RoutingData;

namespace routing {
class GeneratorBase;
}

19
class RouteComplexItem : public TransectStyleComplexItem {
20 21
  Q_OBJECT

22 23
  using PtrGenerator = routing::GeneratorBase *;
  using PtrAreaData = AreaData *;
24
  using PtrRoutingData = std::shared_ptr<RoutingData>;
25
  using PtrWorker = RoutingThread *;
26 27 28 29 30 31
  using Transects = QList<QList<CoordInfo_t>>;
  using Variant = Transects;

  enum class STATE { IDLE, ROUTING, SKIPP, REVERT_PATH, CHANGE_VARIANT };

public:
32 33 34
  RouteComplexItem(PlanMasterController *masterController, bool flyView,
                   const QString &kmlOrShpFile, QObject *parent);
  ~RouteComplexItem();
35 36 37 38 39 40 41 42 43 44

  Q_PROPERTY(Fact *variant READ variant CONSTANT)
  Q_PROPERTY(
      QStringList variantNames READ variantNames NOTIFY variantNamesChanged)
  Q_PROPERTY(QStringList generatorNameList READ generatorNameList NOTIFY
                 generatorNameListChanged)
  Q_PROPERTY(bool calculating READ calculating NOTIFY calculatingChanged)
  Q_PROPERTY(
      routing::GeneratorBase *generator READ generator NOTIFY generatorChanged)
  Q_PROPERTY(int generatorIndex READ generatorIndex NOTIFY generatorChanged)
45 46
  Q_PROPERTY(bool editing READ editing NOTIFY editingChanged)
  Q_PROPERTY(AreaData *areaData READ areaData NOTIFY areaDataChanged)
47

48
  Q_INVOKABLE void revertPath(void);
49 50

  // Property getters
51 52
  const AreaData *areaData() const;
  AreaData *areaData();
53 54 55
  Fact *variant();
  QStringList variantNames() const;
  bool calculating() const;
56
  bool editing() const;
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72

  // Overrides
  virtual bool load(const QJsonObject &complexObject, int sequenceNumber,
                    QString &errorString) override final;
  virtual void save(QJsonArray &planItems) override final;
  virtual QString mapVisualQML(void) const override final;
  virtual bool specifiesCoordinate(void) const override final;
  virtual double timeBetweenShots(void) override final;
  virtual QString commandDescription(void) const override final;
  virtual QString commandName(void) const override final;
  virtual QString abbreviation(void) const override final;
  virtual ReadyForSaveState readyForSaveState(void) const override final;
  virtual double additionalTimeDelay(void) const override final;
  virtual QString patternName(void) const override;

  // Generator
73
  bool registerGenerator(const QString &name, routing::GeneratorBase *g);
74 75 76 77 78 79 80 81
  bool unregisterGenerator(const QString &name);
  bool unregisterGenerator(int index);
  Q_INVOKABLE bool switchToGenerator(const QString &name);
  Q_INVOKABLE bool switchToGenerator(int index);
  QStringList generatorNameList();
  routing::GeneratorBase *generator();
  int generatorIndex();

82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
  // Editing.
  //!
  //! \brief editingStart Starts area data editing.
  //!
  //! Starts area data editing. Transects will not be updated bewteen a call
  //! sequence of editingStart() and editingStop().
  //!
  void editingStart();
  //!
  //! \brief editingStop Stops area editing.
  //!
  //! Stops area editing. Will reset area data to the state before
  //! editingStart() if it is invalid. Triggers a transect update.
  //!
  void editingStop();

98 99 100 101 102 103 104 105 106 107
  static const char *settingsGroup;
  static const char *variantName;
  static const char *jsonComplexItemTypeValue;
  static const QString name;

signals:
  void calculatingChanged();
  void variantNamesChanged();
  void generatorNameListChanged();
  void generatorChanged();
108 109
  void editingChanged();
  void areaDataChanged();
110 111 112 113 114 115 116 117 118 119 120 121 122 123

private slots:
  // Overrides from TransectStyleComplexItem
  virtual void _rebuildTransectsPhase1(void) override final;
  virtual void _recalcCameraShots(void) override final;

  // Worker functions.
  void _setTransects(PtrRoutingData pRoute);
  void _changeVariant();
  bool _updateWorker();
  void _changeVariantWorker();
  void _reverseWorker();

private:
124
  bool _setGenerator(PtrGenerator newG);
125 126
  void _setState(STATE state);
  bool _calculating(STATE state) const;
127 128
  void _setEditing(bool editing);
  void _setAreaData(PtrAreaData data);
129 130 131 132

  // State.
  STATE _state;

133
  // Facts
134 135 136 137 138
  QMap<QString, FactMetaData *> _metaDataMap;
  SettingsFact _variant;
  QStringList _variantNames;

  // Area data
139 140 141 142
  PtrAreaData _areaData;
  PtrAreaData _editorData;
  PtrAreaData _currentData;
  bool _editing;
143 144 145 146 147 148 149 150 151 152

  // Generators
  QList<PtrGenerator> _generatorList;
  QStringList _generatorNameList;
  PtrGenerator _pGenerator;

  // Routing.
  QVector<Variant> _variantVector;
  PtrWorker _pWorker;
};