27 ManuallyOpened, |
27 ManuallyOpened, |
28 //! \brief Document was opened automatically in order to resolve subfile references |
28 //! \brief Document was opened automatically in order to resolve subfile references |
29 AutomaticallyOpened, |
29 AutomaticallyOpened, |
30 }; |
30 }; |
31 |
31 |
32 class DocumentManager |
32 class DocumentManager : public QObject |
33 { |
33 { |
|
34 Q_OBJECT |
34 public: |
35 public: |
35 struct ModelInfo |
36 struct ModelInfo |
36 { |
37 { |
37 std::unique_ptr<Model> model; |
38 std::unique_ptr<Model> model; |
38 ModelId id; |
39 ModelId id; |
39 QString path; |
40 QString path; |
40 OpenType opentype; |
41 OpenType opentype; |
41 std::map<QString, ModelId> dependencies = {}; |
42 std::map<QString, ModelId> dependencies = {}; |
42 PolygonCache polygonCache; |
43 PolygonCache polygonCache = {}; |
|
44 QObject* payload; |
43 }; |
45 }; |
44 using MissingDependencies = std::map<QString, QString>; |
46 using MissingDependencies = std::map<QString, QString>; |
45 DocumentManager(); |
47 DocumentManager(QObject* parent = nullptr); |
|
48 auto begin() const { return this->openModels.begin(); } |
|
49 auto end() const { return this->openModels.end(); } |
46 ModelId newModel(); |
50 ModelId newModel(); |
47 Model* findDependencyByName(const ModelId modelId, const QString& name); |
51 Model* findDependencyByName(const ModelId modelId, const QString& name); |
48 Model* getModelById(ModelId modelId); |
52 Model* getModelById(ModelId modelId); |
49 std::optional<ModelId> openModel(const QString& path, QTextStream& errorStream, const OpenType openType); |
53 std::optional<ModelId> openModel(const QString& path, QTextStream& errorStream, const OpenType openType); |
50 std::map<QString, QString> loadDependenciesForAllModels(const LibraryManager &libraries); |
54 std::map<QString, QString> loadDependenciesForAllModels(const LibraryManager &libraries); |
56 const LibraryManager &libraries, |
60 const LibraryManager &libraries, |
57 QTextStream &errorStream); |
61 QTextStream &errorStream); |
58 bool saveModel(const ModelId modelId, QTextStream& errors); |
62 bool saveModel(const ModelId modelId, QTextStream& errors); |
59 std::optional<ModelId> findIdForModel(const Model* model) const; |
63 std::optional<ModelId> findIdForModel(const Model* model) const; |
60 PolygonCache* getPolygonCacheForModel(ModelId modelId); |
64 PolygonCache* getPolygonCacheForModel(ModelId modelId); |
61 const ModelInfo* infoForModel(ModelId modelId) const; |
65 const ModelInfo* find(ModelId modelId) const; |
|
66 void setModelPayload(ModelId modelId, QObject* object); |
|
67 template<typename T> |
|
68 T* findPayload(ModelId modelId) const |
|
69 { |
|
70 const ModelInfo* info = this->find(modelId); |
|
71 return info ? qobject_cast<T*>(info->payload) : nullptr; |
|
72 } |
62 private: |
73 private: |
63 int modelIdCounter = 0; |
74 int modelIdCounter = 0; |
64 std::map<ModelId, ModelInfo> openModels; |
75 std::map<ModelId, ModelInfo> openModels; |
65 void collectReferences(QSet<QString> &referenced, const QString& name, const Model* model); |
76 void collectReferences(QSet<QString> &referenced, const QString& name, const Model* model); |
66 void updateDependencies(ModelInfo* model); |
77 void updateDependencies(ModelInfo* model); |