#pragma once #include #include #include #include "SettingsFact.h" #include "TransectStyleComplexItem.h" #include "AreaData.h" class RoutingThread; class RoutingData; namespace routing { class GeneratorBase; } class RouteComplexItem : public TransectStyleComplexItem { Q_OBJECT using PtrGenerator = routing::GeneratorBase *; using PtrAreaData = AreaData *; using PtrRoutingData = std::shared_ptr; using PtrWorker = RoutingThread *; using Transects = QList>; using Variant = Transects; enum class STATE { IDLE, ROUTING, SKIPP, REVERT_PATH, CHANGE_VARIANT }; public: RouteComplexItem(PlanMasterController *masterController, bool flyView, const QString &kmlOrShpFile, QObject *parent); ~RouteComplexItem(); 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) Q_PROPERTY(bool editing READ editing NOTIFY editingChanged) Q_PROPERTY(AreaData *areaData READ areaData NOTIFY areaDataChanged) Q_INVOKABLE void revertPath(void); // Property getters const AreaData *areaData() const; AreaData *areaData(); Fact *variant(); QStringList variantNames() const; bool calculating() const; bool editing() const; // 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 bool registerGenerator(const QString &name, routing::GeneratorBase *g); 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(); // 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(); 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(); void editingChanged(); void areaDataChanged(); 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: bool _setGenerator(PtrGenerator newG); void _setState(STATE state); bool _calculating(STATE state) const; void _setEditing(bool editing); void _setAreaData(PtrAreaData data); // State. STATE _state; // Facts QMap _metaDataMap; SettingsFact _variant; QStringList _variantNames; // Area data PtrAreaData _areaData; PtrAreaData _editorData; PtrAreaData _currentData; bool _editing; // Generators QList _generatorList; QStringList _generatorNameList; PtrGenerator _pGenerator; // Routing. QVector _variantVector; PtrWorker _pWorker; };