|     19 #pragma once | 
    19 #pragma once | 
|     20 #include "libraries.h" | 
    20 #include "libraries.h" | 
|     21 #include "model.h" | 
    21 #include "model.h" | 
|     22 #include "polygoncache.h" | 
    22 #include "polygoncache.h" | 
|     23  | 
    23  | 
|     24 class DocumentManager : public QObject | 
    24 enum OpenType | 
|     25 { | 
    25 { | 
|     26 	Q_OBJECT | 
    26 	//! \brief Document was opened manually by the user | 
|         | 
    27 	ManuallyOpened, | 
|         | 
    28 	//! \brief Document was opened automatically in order to resolve subfile references | 
|         | 
    29 	AutomaticallyOpened, | 
|         | 
    30 }; | 
|         | 
    31  | 
|         | 
    32 class DocumentManager | 
|         | 
    33 { | 
|     27 public: | 
    34 public: | 
|     28 	enum OpenType | 
    35 	struct ModelInfo | 
|     29 	{ | 
    36 	{ | 
|     30 		/** | 
    37 		std::unique_ptr<Model> model; | 
|     31 		  * Document was opened manually by the user | 
    38 		ModelId id; | 
|     32 		  */ | 
    39 		QString path; | 
|     33 		ManuallyOpened, | 
    40 		OpenType opentype; | 
|     34 		/** | 
    41 		std::map<QString, ModelId> dependencies = {}; | 
|     35 		  * Document was opened automatically in order to resolve subfile references | 
    42 		PolygonCache polygonCache; | 
|     36 		  */ | 
        | 
|     37 		AutomaticallyOpened, | 
        | 
|     38 	}; | 
    43 	}; | 
|     39     DocumentManager(QObject* parent = nullptr); | 
    44 	using MissingDependencies = std::map<QString, QString>; | 
|         | 
    45 	DocumentManager(); | 
|     40 	ModelId newModel(); | 
    46 	ModelId newModel(); | 
|     41 	Model* findDependencyByName(const ModelId modelId, const QString& name); | 
    47 	Model* findDependencyByName(const ModelId modelId, const QString& name); | 
|     42 	Model* getModelById(ModelId modelId); | 
    48 	Model* getModelById(ModelId modelId); | 
|     43 	std::optional<ModelId> openModel(const QString& path, QTextStream& errorStream, const OpenType openType); | 
    49 	std::optional<ModelId> openModel(const QString& path, QTextStream& errorStream, const OpenType openType); | 
|     44 	QString makeNewModelName(); | 
    50 	std::map<QString, QString> loadDependenciesForAllModels(const LibraryManager &libraries); | 
|     45 	void loadDependenciesForAllModels(const LibraryManager &libraries, QTextStream &errorStream); | 
        | 
|     46 	void loadDependenciesForModel(const ModelId modelId, | 
        | 
|     47 		const QString& path, | 
        | 
|     48 		const LibraryManager& libraries, | 
        | 
|     49 		QTextStream& errorStream); | 
        | 
|     50 	void closeDocument(const ModelId modelId); | 
    51 	void closeDocument(const ModelId modelId); | 
|     51 	const QString* modelPath(ModelId modelId) const; | 
    52 	const QString* modelPath(ModelId modelId) const; | 
|     52 	void setModelPath( | 
    53 	void setModelPath( | 
|     53 			const ModelId modelId, | 
    54 			const ModelId modelId, | 
|     54 			const QString& newPath, | 
    55 			const QString& newPath, | 
|     55 			const LibraryManager &libraries, | 
    56 			const LibraryManager &libraries, | 
|     56 			QTextStream &errorStream); | 
    57 			QTextStream &errorStream); | 
|     57 	bool saveModel(const ModelId modelId, QTextStream& errors); | 
    58 	bool saveModel(const ModelId modelId, QTextStream& errors); | 
|     58 	std::optional<ModelId> findIdForModel(const Model* model) const; | 
    59 	std::optional<ModelId> findIdForModel(const Model* model) const; | 
|     59 	PolygonCache* getPolygonCacheForModel(ModelId modelId); | 
    60 	PolygonCache* getPolygonCacheForModel(ModelId modelId); | 
|         | 
    61 	const ModelInfo* infoForModel(ModelId modelId) const; | 
|     60 private: | 
    62 private: | 
|     61 	struct ModelInfo | 
        | 
|     62 	{ | 
        | 
|     63 		std::unique_ptr<Model> model; | 
        | 
|     64 		ModelId id; | 
        | 
|     65 		QString path; | 
        | 
|     66 		OpenType opentype; | 
        | 
|     67 		std::map<QString, ModelId> dependencies = {}; | 
        | 
|     68 	}; | 
        | 
|     69 	struct LoadDepedenciesBag; | 
        | 
|     70 	int modelIdCounter = 0; | 
    63 	int modelIdCounter = 0; | 
|     71 	int untitledNameCounter = 0; | 
        | 
|     72 	std::map<ModelId, ModelInfo> openModels; | 
    64 	std::map<ModelId, ModelInfo> openModels; | 
|     73 	std::map<ModelId, PolygonCache> polygonCaches; | 
        | 
|     74 	void loadDependenciesForModel(const ModelId modelId, const QString& path, LoadDepedenciesBag& bag); | 
        | 
|     75 	void collectReferences(QSet<QString> &referenced, const QString& name, const Model* model); | 
    65 	void collectReferences(QSet<QString> &referenced, const QString& name, const Model* model); | 
|     76 	void updateDependencies(ModelInfo* model); | 
    66 	void updateDependencies(ModelInfo* model); | 
|     77 	void prune(); | 
    67 	void prune(); | 
|     78 	Q_SLOT void modelModified(); | 
        | 
|     79 	bool isReferencedByAnything(const ModelId modelId) const; | 
    68 	bool isReferencedByAnything(const ModelId modelId) const; | 
|     80 	void makePolygonCacheForModel(const ModelId modelId); | 
    69 	void makePolygonCacheForModel(const ModelId modelId); | 
|     81 }; | 
    70 }; | 
|     82  | 
    71  | 
|         | 
    72 QString errorStringFromMissingDependencies(const DocumentManager::MissingDependencies& missing); | 
|     83 QString pathToName(const QFileInfo& path); | 
    73 QString pathToName(const QFileInfo& path); |