1 /*
2  * DQt - D bindings for the Qt Toolkit
3  *
4  * GNU Lesser General Public License Usage
5  * This file may be used under the terms of the GNU Lesser
6  * General Public License version 3 as published by the Free Software
7  * Foundation and appearing in the file LICENSE.LGPL3 included in the
8  * packaging of this file. Please review the following information to
9  * ensure the GNU Lesser General Public License version 3 requirements
10  * will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
11  */
12 module qt.core.dir;
13 extern(C++):
14 
15 import qt.config;
16 import qt.core.fileinfo;
17 import qt.core.flags;
18 import qt.core.qchar;
19 import qt.core.shareddata;
20 import qt.core.string;
21 import qt.core.stringlist;
22 import qt.core.typeinfo;
23 import qt.helpers;
24 
25 extern(C++, class) struct QDirPrivate;
26 
27 /// Binding for C++ class [QDir](https://doc.qt.io/qt-6/qdir.html).
28 @Q_RELOCATABLE_TYPE extern(C++, class) struct /+ Q_CORE_EXPORT +/ QDir
29 {
30 public:
31     enum Filter { Dirs        = 0x001,
32                   Files       = 0x002,
33                   Drives      = 0x004,
34                   NoSymLinks  = 0x008,
35                   AllEntries  = Filter.Dirs | Filter.Files | Filter.Drives,
36                   TypeMask    = 0x00f,
37 
38                   Readable    = 0x010,
39                   Writable    = 0x020,
40                   Executable  = 0x040,
41                   PermissionMask    = 0x070,
42 
43                   Modified    = 0x080,
44                   Hidden      = 0x100,
45                   System      = 0x200,
46 
47                   AccessMask  = 0x3F0,
48 
49                   AllDirs       = 0x400,
50                   CaseSensitive = 0x800,
51                   NoDot         = 0x2000,
52                   NoDotDot      = 0x4000,
53                   NoDotAndDotDot = Filter.NoDot | Filter.NoDotDot,
54 
55                   NoFilter = -1
56     }
57     /+ Q_DECLARE_FLAGS(Filters, Filter) +/
58 alias Filters = QFlags!(Filter);
59     enum SortFlag { Name        = 0x00,
60                     Time        = 0x01,
61                     Size        = 0x02,
62                     Unsorted    = 0x03,
63                     SortByMask  = 0x03,
64 
65                     DirsFirst   = 0x04,
66                     Reversed    = 0x08,
67                     IgnoreCase  = 0x10,
68                     DirsLast    = 0x20,
69                     LocaleAware = 0x40,
70                     Type        = 0x80,
71                     NoSort = -1
72     }
73     /+ Q_DECLARE_FLAGS(SortFlags, SortFlag) +/
74 alias SortFlags = QFlags!(SortFlag);
75     @disable this(this);
76     this(ref const(QDir) );
77     @disable this();
78     this(ref const(QString) path/* = globalInitVar!QString*/);
79     this(ref const(QString) path, ref const(QString) nameFilter,
80              SortFlags sort = SortFlags(SortFlag.Name | SortFlag.IgnoreCase), Filters filter = Filter.AllEntries);
81 /+ #ifdef Q_CLANG_QDOC
82     QDir(const std::filesystem::path &path);
83     QDir(const std::filesystem::path &path, const QString &nameFilter,
84          SortFlags sort = SortFlags(Name | IgnoreCase), Filters filter = AllEntries);
85 #elif QT_CONFIG(cxx17_filesystem)
86     template<typename T, QtPrivate::ForceFilesystemPath<T> = 0>
87     QDir(const T &path) : QDir(QtPrivate::fromFilesystemPath(path))
88     {
89     }
90     template<typename T, QtPrivate::ForceFilesystemPath<T> = 0>
91     QDir(const T &path, const QString &nameFilter,
92          SortFlags sort = SortFlags(Name | IgnoreCase), Filters filter = AllEntries)
93          : QDir(QtPrivate::fromFilesystemPath(path), nameFilter, sort, filter)
94     {
95     }
96 #endif +/ // QT_CONFIG(cxx17_filesystem)
97     ~this();
98 
99     /+ref QDir operator =(ref const(QDir) );+/
100     /+ QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QDir) +/
101 
102     /+ void swap(QDir &other) noexcept
103     { qSwap(d_ptr, other.d_ptr); } +/
104 
105     void setPath(ref const(QString) path);
106 /+ #ifdef Q_CLANG_QDOC
107     void setPath(const std::filesystem::path &path);
108 #elif QT_CONFIG(cxx17_filesystem)
109     template<typename T, QtPrivate::ForceFilesystemPath<T> = 0>
110     void setPath(const T &path)
111     {
112         setPath(QtPrivate::fromFilesystemPath(path));
113     }
114 #endif +/ // QT_CONFIG(cxx17_filesystem)
115     QString path() const;
116     QString absolutePath() const;
117     QString canonicalPath() const;
118 /+ #if QT_CONFIG(cxx17_filesystem) || defined(Q_CLANG_QDOC)
119     std::filesystem::path filesystemPath() const
120     { return QtPrivate::toFilesystemPath(path()); }
121     std::filesystem::path filesystemAbsolutePath() const
122     { return QtPrivate::toFilesystemPath(absolutePath()); }
123     std::filesystem::path filesystemCanonicalPath() const
124     { return QtPrivate::toFilesystemPath(canonicalPath()); }
125 #endif +/ // QT_CONFIG(cxx17_filesystem)
126 
127     static void setSearchPaths(ref const(QString) prefix, ref const(QStringList) searchPaths);
128     static void addSearchPath(ref const(QString) prefix, ref const(QString) path);
129 /+ #ifdef Q_CLANG_QDOC
130     static void addSearchPath(const QString &prefix, const std::filesystem::path &path);
131 #elif QT_CONFIG(cxx17_filesystem)
132     template<typename T, QtPrivate::ForceFilesystemPath<T> = 0>
133     static void addSearchPath(const QString &prefix, const T &path)
134     {
135         addSearchPath(prefix, QtPrivate::fromFilesystemPath(path));
136     }
137 #endif +/ // QT_CONFIG(cxx17_filesystem)
138     static QStringList searchPaths(ref const(QString) prefix);
139 
140     QString dirName() const;
141     QString filePath(ref const(QString) fileName) const;
142     QString absoluteFilePath(ref const(QString) fileName) const;
143     QString relativeFilePath(ref const(QString) fileName) const;
144 
145     static QString toNativeSeparators(ref const(QString) pathName);
146     static QString fromNativeSeparators(ref const(QString) pathName);
147 
148     bool cd(ref const(QString) dirName);
149     bool cdUp();
150 
151     QStringList nameFilters() const;
152     void setNameFilters(ref const(QStringList) nameFilters);
153 
154     Filters filter() const;
155     void setFilter(Filters filter);
156     SortFlags sorting() const;
157     void setSorting(SortFlags sort);
158 
159     uint count() const;
160     bool isEmpty(Filters filters = Filters(Filter.AllEntries | Filter.NoDotAndDotDot)) const;
161 
162     QString opIndex(int) const;
163 
164     static QStringList nameFiltersFromString(ref const(QString) nameFilter);
165 
166     QStringList entryList(Filters filters = Filter.NoFilter, SortFlags sort = SortFlag.NoSort) const;
167     QStringList entryList(ref const(QStringList) nameFilters, Filters filters = Filter.NoFilter,
168                               SortFlags sort = SortFlag.NoSort) const;
169 
170     /+QFileInfoList entryInfoList(Filters filters = Filter.NoFilter, SortFlags sort = SortFlag.NoSort) const;
171     QFileInfoList entryInfoList(ref const(QStringList) nameFilters, Filters filters = Filter.NoFilter,
172                                     SortFlags sort = SortFlag.NoSort) const;+/
173 
174     bool mkdir(ref const(QString) dirName) const;
175     bool rmdir(ref const(QString) dirName) const;
176     bool mkpath(ref const(QString) dirPath) const;
177     bool rmpath(ref const(QString) dirPath) const;
178 
179     bool removeRecursively();
180 
181     bool isReadable() const;
182     bool exists() const;
183     bool isRoot() const;
184 
185     static bool isRelativePath(ref const(QString) path);
186     pragma(inline, true) static bool isAbsolutePath(ref const(QString) path) { return !isRelativePath(path); }
187     bool isRelative() const;
188     pragma(inline, true) bool isAbsolute() const { return !isRelative(); }
189     bool makeAbsolute();
190 
191     /+bool operator ==(ref const(QDir) dir) const;+/
192     /+pragma(inline, true) bool operator !=(ref const(QDir) dir) const { return !operator==(dir); }+/
193 
194     bool remove(ref const(QString) fileName);
195     bool rename(ref const(QString) oldName, ref const(QString) newName);
196     bool exists(ref const(QString) name) const;
197 
198     //static QFileInfoList drives();
199 
200     pragma(inline, true) static QChar listSeparator()/+ noexcept+/
201     {
202         static if((versionIsSet!("Windows") && !versionIsSet!("Cygwin")))
203         {
204             return QChar(QLatin1Char(';'));
205         }
206         else
207         {
208             return QChar(QLatin1Char(':'));
209         }
210     }
211 
212     static QChar separator()
213     {
214         static if((versionIsSet!("Windows") && !versionIsSet!("Cygwin")))
215         {
216             return QChar(QLatin1Char('\\'));
217         }
218         else
219         {
220             return QChar(QLatin1Char('/'));
221         }
222     }
223 
224     static bool setCurrent(ref const(QString) path);
225     pragma(inline, true) static QDir current() { auto tmp = currentPath(); return QDir(tmp); }
226     static QString currentPath();
227 
228     pragma(inline, true) static QDir home() { auto tmp = homePath(); return QDir(tmp); }
229     static QString homePath();
230     pragma(inline, true) static QDir root() { auto tmp = rootPath(); return QDir(tmp); }
231     static QString rootPath();
232     pragma(inline, true) static QDir temp() { auto tmp = tempPath(); return QDir(tmp); }
233     static QString tempPath();
234 
235 /+ #if QT_CONFIG(regularexpression) +/
236     static bool match(ref const(QStringList) filters, ref const(QString) fileName);
237     static bool match(ref const(QString) filter, ref const(QString) fileName);
238 /+ #endif +/
239 
240     static QString cleanPath(ref const(QString) path);
241     void refresh() const;
242 
243 protected:
244     /+ explicit +/this(ref QDirPrivate d);
245 
246     QSharedDataPointer!(QDirPrivate) d_ptr;
247 
248 private:
249     /+ friend class QDirIterator; +/
250     // Q_DECLARE_PRIVATE equivalent for shared data pointers
251     /+ QDirPrivate *d_func(); +/
252     /+ const QDirPrivate *d_func() const { return d_ptr.constData(); } +/
253     mixin(CREATE_CONVENIENCE_WRAPPERS);
254 }
255 /+pragma(inline, true) QFlags!(QDir.Filters.enum_type) operator |(QDir.Filters.enum_type f1, QDir.Filters.enum_type f2)/+noexcept+/{return QFlags!(QDir.Filters.enum_type)(f1)|f2;}+/
256 /+pragma(inline, true) QFlags!(QDir.Filters.enum_type) operator |(QDir.Filters.enum_type f1, QFlags!(QDir.Filters.enum_type) f2)/+noexcept+/{return f2|f1;}+/
257 /+pragma(inline, true) QFlags!(QDir.Filters.enum_type) operator &(QDir.Filters.enum_type f1, QDir.Filters.enum_type f2)/+noexcept+/{return QFlags!(QDir.Filters.enum_type)(f1)&f2;}+/
258 /+pragma(inline, true) QFlags!(QDir.Filters.enum_type) operator &(QDir.Filters.enum_type f1, QFlags!(QDir.Filters.enum_type) f2)/+noexcept+/{return f2&f1;}+/
259 /+pragma(inline, true) void operator +(QDir.Filters.enum_type f1, QDir.Filters.enum_type f2)/+noexcept+/;+/
260 /+pragma(inline, true) void operator +(QDir.Filters.enum_type f1, QFlags!(QDir.Filters.enum_type) f2)/+noexcept+/;+/
261 /+pragma(inline, true) void operator +(int f1, QFlags!(QDir.Filters.enum_type) f2)/+noexcept+/;+/
262 /+pragma(inline, true) void operator -(QDir.Filters.enum_type f1, QDir.Filters.enum_type f2)/+noexcept+/;+/
263 /+pragma(inline, true) void operator -(QDir.Filters.enum_type f1, QFlags!(QDir.Filters.enum_type) f2)/+noexcept+/;+/
264 /+pragma(inline, true) void operator -(int f1, QFlags!(QDir.Filters.enum_type) f2)/+noexcept+/;+/
265 /+pragma(inline, true) QIncompatibleFlag operator |(QDir.Filters.enum_type f1, int f2)/+noexcept+/{return QIncompatibleFlag(int(f1)|f2);}+/
266 /+pragma(inline, true) void operator +(int f1, QDir.Filters.enum_type f2)/+noexcept+/;+/
267 /+pragma(inline, true) void operator +(QDir.Filters.enum_type f1, int f2)/+noexcept+/;+/
268 /+pragma(inline, true) void operator -(int f1, QDir.Filters.enum_type f2)/+noexcept+/;+/
269 /+pragma(inline, true) void operator -(QDir.Filters.enum_type f1, int f2)/+noexcept+/;+/
270 
271 /+ Q_DECLARE_SHARED(QDir)
272 Q_DECLARE_OPERATORS_FOR_FLAGS(QDir::Filters) +/
273 /+pragma(inline, true) QFlags!(QDir.SortFlags.enum_type) operator |(QDir.SortFlags.enum_type f1, QDir.SortFlags.enum_type f2)/+noexcept+/{return QFlags!(QDir.SortFlags.enum_type)(f1)|f2;}+/
274 /+pragma(inline, true) QFlags!(QDir.SortFlags.enum_type) operator |(QDir.SortFlags.enum_type f1, QFlags!(QDir.SortFlags.enum_type) f2)/+noexcept+/{return f2|f1;}+/
275 /+pragma(inline, true) QFlags!(QDir.SortFlags.enum_type) operator &(QDir.SortFlags.enum_type f1, QDir.SortFlags.enum_type f2)/+noexcept+/{return QFlags!(QDir.SortFlags.enum_type)(f1)&f2;}+/
276 /+pragma(inline, true) QFlags!(QDir.SortFlags.enum_type) operator &(QDir.SortFlags.enum_type f1, QFlags!(QDir.SortFlags.enum_type) f2)/+noexcept+/{return f2&f1;}+/
277 /+pragma(inline, true) void operator +(QDir.SortFlags.enum_type f1, QDir.SortFlags.enum_type f2)/+noexcept+/;+/
278 /+pragma(inline, true) void operator +(QDir.SortFlags.enum_type f1, QFlags!(QDir.SortFlags.enum_type) f2)/+noexcept+/;+/
279 /+pragma(inline, true) void operator +(int f1, QFlags!(QDir.SortFlags.enum_type) f2)/+noexcept+/;+/
280 /+pragma(inline, true) void operator -(QDir.SortFlags.enum_type f1, QDir.SortFlags.enum_type f2)/+noexcept+/;+/
281 /+pragma(inline, true) void operator -(QDir.SortFlags.enum_type f1, QFlags!(QDir.SortFlags.enum_type) f2)/+noexcept+/;+/
282 /+pragma(inline, true) void operator -(int f1, QFlags!(QDir.SortFlags.enum_type) f2)/+noexcept+/;+/
283 /+pragma(inline, true) QIncompatibleFlag operator |(QDir.SortFlags.enum_type f1, int f2)/+noexcept+/{return QIncompatibleFlag(int(f1)|f2);}+/
284 /+pragma(inline, true) void operator +(int f1, QDir.SortFlags.enum_type f2)/+noexcept+/;+/
285 /+pragma(inline, true) void operator +(QDir.SortFlags.enum_type f1, int f2)/+noexcept+/;+/
286 /+pragma(inline, true) void operator -(int f1, QDir.SortFlags.enum_type f2)/+noexcept+/;+/
287 /+pragma(inline, true) void operator -(QDir.SortFlags.enum_type f1, int f2)/+noexcept+/;+/
288 /+ Q_DECLARE_OPERATORS_FOR_FLAGS(QDir::SortFlags)
289 #ifndef QT_NO_DEBUG_STREAM
290 class QDebug;
291 Q_CORE_EXPORT QDebug operator<<(QDebug debug, QDir::Filters filters);
292 Q_CORE_EXPORT QDebug operator<<(QDebug debug, const QDir &dir);
293 #endif +/
294