24 { |
24 { |
25 Q_OBJECT |
25 Q_OBJECT |
26 public: |
26 public: |
27 enum OpenType |
27 enum OpenType |
28 { |
28 { |
|
29 /** |
|
30 * Document was opened manually by the user |
|
31 */ |
29 ManuallyOpened, |
32 ManuallyOpened, |
|
33 /** |
|
34 * Document was opened automatically in order to resolve subfile references |
|
35 */ |
30 AutomaticallyOpened, |
36 AutomaticallyOpened, |
31 }; |
37 }; |
32 DocumentManager(QObject* parent = nullptr); |
38 DocumentManager(QObject* parent = nullptr); |
33 QString newModel(); |
39 ModelId newModel(); |
34 Model* findModelByName(const QString& name); |
40 Model* findDependencyByName(const ModelId modelId, const QString& name); |
35 QString openModel(const QString& path, QTextStream& errorStream, const OpenType openType); |
41 Model* getModelById(ModelId modelId); |
|
42 std::optional<ModelId> openModel(const QString& path, QTextStream& errorStream, const OpenType openType); |
36 QString makeNewModelName(); |
43 QString makeNewModelName(); |
37 void loadDependenciesForModel(const QString& modelName, |
44 void loadDependenciesForAllModels(const LibraryManager &libraries, QTextStream &errorStream); |
|
45 void loadDependenciesForModel(const ModelId modelId, |
38 const QString& path, |
46 const QString& path, |
39 const LibraryManager& libraries, |
47 const LibraryManager& libraries, |
40 QTextStream& errorStream); |
48 QTextStream& errorStream); |
41 void closeDocument(const QString& name); |
49 void closeDocument(const ModelId modelId); |
|
50 const QString* modelPath(ModelId modelId) const; |
|
51 void setModelPath( |
|
52 const ModelId modelId, |
|
53 const QString& newPath, |
|
54 const LibraryManager &libraries, |
|
55 QTextStream &errorStream); |
|
56 bool saveModel(const ModelId modelId, QTextStream& errors); |
|
57 std::optional<ModelId> findIdForModel(const Model* model) const; |
42 private: |
58 private: |
43 void collectReferences(QSet<QString> &referenced, const QString& name, const Model* model); |
|
44 struct ModelInfo |
59 struct ModelInfo |
45 { |
60 { |
46 std::unique_ptr<Model> model; |
61 std::unique_ptr<Model> model; |
|
62 QString path; |
47 OpenType opentype; |
63 OpenType opentype; |
|
64 std::map<QString, ModelId> dependencies = {}; |
48 }; |
65 }; |
|
66 struct LoadDepedenciesBag; |
|
67 int modelIdCounter = 0; |
49 int untitledNameCounter = 0; |
68 int untitledNameCounter = 0; |
50 std::map<QString, ModelInfo> openModels; |
69 std::map<ModelId, ModelInfo> openModels; |
51 void loadDependenciesForModel(const QString& modelName, |
70 void loadDependenciesForModel(const ModelId modelId, const QString& path, LoadDepedenciesBag& bag); |
52 const QString& path, |
71 void collectReferences(QSet<QString> &referenced, const QString& name, const Model* model); |
53 const LibraryManager& libraries, |
72 void updateDependencies(ModelInfo* model); |
54 QStringList& missing, |
73 void prune(); |
55 QStringList& processed, |
74 bool isReferencedByAnything(const ModelId modelId) const; |
56 QTextStream& errorStream); |
|
57 }; |
75 }; |
58 |
76 |
59 QString pathToName(const QFileInfo& path); |
77 QString pathToName(const QFileInfo& path); |