| |
1 #include "librarycollection.h" |
| |
2 |
| |
3 const QStringList LibraryCollection::directoryNames = {"parts", "p"}; |
| |
4 |
| |
5 /* |
| |
6 * Searches the libraries for a file by relative path. |
| |
7 */ |
| |
8 QString LibraryCollection::find(QString relativePath) const |
| |
9 { |
| |
10 // LDraw uses backslashes for directory separators. We need to convert them to forward |
| |
11 // slashes so that Qt understands them on all platforms. |
| |
12 relativePath.replace('\\', '/'); |
| |
13 |
| |
14 for (const Library& library : m_libraries) |
| |
15 { |
| |
16 for (const QString& directoryName : directoryNames) |
| |
17 { |
| |
18 QDir dir = library.path; |
| |
19 |
| |
20 if (dir.exists() and dir.cd(directoryName) and dir.exists(relativePath)) |
| |
21 return QDir::cleanPath(dir.absoluteFilePath(relativePath)); |
| |
22 } |
| |
23 } |
| |
24 |
| |
25 return ""; |
| |
26 } |
| |
27 |
| |
28 /* |
| |
29 * Searches the libraries for a file. This overload takes the parameters of a FileSpec and |
| |
30 * calls another overload with a ready spec. |
| |
31 */ |
| |
32 QString LibraryCollection::find(const QString &name, FileType type) const |
| |
33 { |
| |
34 return find(FileSpec {name, type}); |
| |
35 } |
| |
36 |
| |
37 /* |
| |
38 * Searches the libraries for a file by the given file specification. The type attribute |
| |
39 * specifies what kind of file we are looking for. |
| |
40 */ |
| |
41 QString LibraryCollection::find(const FileSpec& spec) const |
| |
42 { |
| |
43 for (const Library& library : m_libraries) |
| |
44 { |
| |
45 try |
| |
46 { |
| |
47 QDir subdirectory = library.subdirectory(spec.type); |
| |
48 if (subdirectory.exists(spec.name)) |
| |
49 return QDir::cleanPath(subdirectory.absoluteFilePath(spec.name)); |
| |
50 } |
| |
51 catch (SubdirectoryNotFoundError&) {} |
| |
52 } |
| |
53 |
| |
54 return ""; |
| |
55 } |
| |
56 |
| |
57 /* |
| |
58 * Returns the appropriate subdirectory for the given file type. |
| |
59 */ |
| |
60 QDir LibraryCollection::Library::subdirectory(FileType type) const |
| |
61 { |
| |
62 QString subdirectory = subdirectoryName(type); |
| |
63 |
| |
64 if (path.exists(subdirectory)) |
| |
65 return path.absolutePath() + "/" + subdirectory; |
| |
66 else |
| |
67 throw SubdirectoryNotFoundError {}; |
| |
68 } |
| |
69 |
| |
70 /* |
| |
71 * Returns the appropriate subdirectory name for the given file type. |
| |
72 */ |
| |
73 QString LibraryCollection::Library::subdirectoryName(FileType type) |
| |
74 { |
| |
75 switch (type) |
| |
76 { |
| |
77 case Part: |
| |
78 return "/parts/"; |
| |
79 |
| |
80 case Subpart: |
| |
81 return "/parts/s/"; |
| |
82 |
| |
83 case Primitive: |
| |
84 return "/p/"; |
| |
85 |
| |
86 case HighResolutionPrimitive: |
| |
87 return "/p/48/"; |
| |
88 |
| |
89 case LowResolutionPrimitive: |
| |
90 return "/p/8/"; |
| |
91 } |
| |
92 |
| |
93 return ""; |
| |
94 } |