2626#include < boost/algorithm/string/predicate.hpp>
2727#include < QByteArray>
2828#include < QCryptographicHash>
29- #include < QDateTime>
30- #include < QDir>
31- #include < QFile>
3229#include < QFileInfo>
3330#include < QProcess>
34- #include < QStandardPaths>
31+ #include < QTimeZone>
32+ #include < QThreadPool>
3533#include < QUrl>
3634#endif
3735
3836#include " DisplayedFilesModel.h"
3937
40- #include < QThreadPool>
4138
4239#include " FileUtilities.h"
40+ #include " ThumbnailSource.h"
4341#include < App/Application.h>
4442#include < App/ProjectFile.h>
4543#include < Base/FileInfo.h>
46- #include < Base/Stream.h>
4744#include < Base/TimeInfo.h>
45+ #include < Base/Stream.h>
46+
4847
4948using namespace Start ;
5049
5150
5251namespace
5352{
54-
55- std::string humanReadableSize (unsigned int bytes)
53+ std::string humanReadableSize (const unsigned int bytes)
5654{
5755 static const std::vector<std::string> siPrefix {
5856 " b" ,
@@ -96,30 +94,29 @@ FileStats fileInfoFromFreeCADFile(const std::string& path)
9694
9795// / Load the thumbnail image data (if any) that is stored in an FCStd file.
9896// / \returns The image bytes, or an empty QByteArray (if no thumbnail was stored)
99- QByteArray loadFCStdThumbnail (const std::string & pathToFCStdFile)
97+ QByteArray loadFCStdThumbnail (const QString & pathToFCStdFile)
10098{
101- App::ProjectFile proj (pathToFCStdFile);
102- if (proj.loadDocument ()) {
99+ if (App::ProjectFile proj (pathToFCStdFile.toStdString ()); proj.loadDocument ()) {
103100 try {
104- std::string thumbnailFile = getUniquePNG (pathToFCStdFile). toStdString ( );
101+ const QString thumbnailFile = getUniquePNG (pathToFCStdFile);
105102 if (!useCachedPNG (thumbnailFile, pathToFCStdFile)) {
106- static std::string thumb = getThumbnailsImage ();
107- if (proj.containsFile (thumb)) {
103+ static const QString thumb = getThumbnailsImage ();
104+ if (proj.containsFile (thumb. toStdString () )) {
108105 createThumbnailsDir ();
109- Base::FileInfo fi (thumbnailFile);
106+ const Base::FileInfo fi (thumbnailFile. toStdString () );
110107 Base::ofstream str (fi, std::ios::out | std::ios::binary);
111- proj.readInputFileDirect (thumb, str);
108+ proj.readInputFileDirect (thumb. toStdString () , str);
112109 str.close ();
113110 }
114111 }
115112
116- auto inputFile = QFile (QString::fromStdString (thumbnailFile));
117- if (inputFile.exists ()) {
113+ if (auto inputFile = QFile (thumbnailFile); inputFile.exists ()) {
118114 inputFile.open (QIODevice::OpenModeFlag::ReadOnly);
119115 return inputFile.readAll ();
120116 }
121117 }
122118 catch (...) {
119+ Base::Console ().Log (" Failed to load thumbnail for %s" , pathToFCStdFile.toStdString ());
123120 }
124121 }
125122 return {};
@@ -128,12 +125,17 @@ QByteArray loadFCStdThumbnail(const std::string& pathToFCStdFile)
128125FileStats getFileInfo (const std::string& path)
129126{
130127 FileStats result;
131- Base::FileInfo file (path);
128+ const Base::FileInfo file (path);
132129 if (file.hasExtension (" FCStd" )) {
133130 result = fileInfoFromFreeCADFile (path);
134131 }
135132 else {
136- file.lastModified ();
133+ Base::TimeInfo lastModified = file.lastModified ();
134+ std::string lmString = QDateTime::fromSecsSinceEpoch (lastModified.getTime_t ())
135+ .toTimeZone (QTimeZone::utc ())
136+ .toString (Qt::ISODate)
137+ .toStdString ();
138+ result.insert (std::make_pair (DisplayedFilesModelRoles::modifiedTime, lmString));
137139 }
138140 result.insert (std::make_pair (DisplayedFilesModelRoles::path, path));
139141 result.insert (std::make_pair (DisplayedFilesModelRoles::size, humanReadableSize (file.size ())));
@@ -145,14 +147,12 @@ bool freecadCanOpen(const QString& extension)
145147{
146148 std::string ext = extension.toStdString ();
147149 auto importTypes = App::GetApplication ().getImportTypes ();
148- return std::find_if (importTypes.begin (),
149- importTypes.end (),
150- [&ext](const auto & item) {
151- return boost::iequals (item, ext);
152- })
150+ return std::ranges::find_if (importTypes,
151+ [&ext](const auto & item) {
152+ return boost::iequals (item, ext);
153+ })
153154 != importTypes.end ();
154155}
155-
156156} // namespace
157157
158158DisplayedFilesModel::DisplayedFilesModel (QObject* parent)
@@ -166,15 +166,14 @@ int DisplayedFilesModel::rowCount(const QModelIndex& parent) const
166166 return static_cast <int >(_fileInfoCache.size ());
167167}
168168
169- QVariant DisplayedFilesModel::data (const QModelIndex& index, int roleAsInt ) const
169+ QVariant DisplayedFilesModel::data (const QModelIndex& index, int role ) const
170170{
171- int row = index.row ();
171+ const int row = index.row ();
172172 if (row < 0 || row >= static_cast <int >(_fileInfoCache.size ())) {
173173 return {};
174174 }
175- auto mapEntry = _fileInfoCache.at (row);
176- auto role = static_cast <DisplayedFilesModelRoles>(roleAsInt);
177- switch (role) {
175+ const auto mapEntry = _fileInfoCache.at (row);
176+ switch (const auto roleAsType = static_cast <DisplayedFilesModelRoles>(role)) {
178177 case DisplayedFilesModelRoles::author: // NOLINT(bugprone-branch-clone)
179178 [[fallthrough]];
180179 case DisplayedFilesModelRoles::baseName:
@@ -192,32 +191,34 @@ QVariant DisplayedFilesModel::data(const QModelIndex& index, int roleAsInt) cons
192191 case DisplayedFilesModelRoles::path:
193192 [[fallthrough]];
194193 case DisplayedFilesModelRoles::size:
195- if (mapEntry.find (role) != mapEntry.end ()) {
196- return QString::fromStdString (mapEntry.at (role));
197- }
198- else {
199- return {};
194+ if (mapEntry.contains (roleAsType)) {
195+ return QString::fromStdString (mapEntry.at (roleAsType));
200196 }
197+ return {};
201198 case DisplayedFilesModelRoles::image: {
202- auto path = QString::fromStdString (mapEntry.at (DisplayedFilesModelRoles::path));
203- if (_imageCache.contains (path)) {
199+ if (const auto path =
200+ QString::fromStdString (mapEntry.at (DisplayedFilesModelRoles::path));
201+ _imageCache.contains (path)) {
204202 return _imageCache[path];
205203 }
206204 break ;
207205 }
208206 default :
209207 break ;
210208 }
211- switch (roleAsInt ) {
209+ switch (role ) {
212210 case Qt::ItemDataRole::ToolTipRole:
213211 return QString::fromStdString (mapEntry.at (DisplayedFilesModelRoles::path));
212+ default :
213+ // No other role gets handled
214+ break ;
214215 }
215216 return {};
216217}
217218
218219void DisplayedFilesModel::addFile (const QString& filePath)
219220{
220- QFileInfo qfi (filePath);
221+ const QFileInfo qfi (filePath);
221222 if (!qfi.isReadable ()) {
222223 return ;
223224 }
@@ -228,13 +229,12 @@ void DisplayedFilesModel::addFile(const QString& filePath)
228229
229230 _fileInfoCache.emplace_back (getFileInfo (filePath.toStdString ()));
230231 if (qfi.suffix ().toLower () == QLatin1String (" fcstd" )) {
231- auto thumbnail = loadFCStdThumbnail (filePath.toStdString ());
232- if (!thumbnail.isEmpty ()) {
232+ if (const auto thumbnail = loadFCStdThumbnail (filePath); !thumbnail.isEmpty ()) {
233233 _imageCache.insert (filePath, thumbnail);
234234 }
235235 }
236236 else {
237- auto runner = new ThumbnailSource (filePath);
237+ const auto runner = new ThumbnailSource (filePath);
238238 connect (runner->signals (),
239239 &ThumbnailSourceSignals::thumbnailAvailable,
240240 this ,
@@ -251,16 +251,16 @@ void DisplayedFilesModel::clear()
251251QHash<int , QByteArray> DisplayedFilesModel::roleNames () const
252252{
253253 static QHash<int , QByteArray> nameMap {
254- std::make_pair (int (DisplayedFilesModelRoles::author), " author" ),
255- std::make_pair (int (DisplayedFilesModelRoles::baseName), " baseName" ),
256- std::make_pair (int (DisplayedFilesModelRoles::company), " company" ),
257- std::make_pair (int (DisplayedFilesModelRoles::creationTime), " creationTime" ),
258- std::make_pair (int (DisplayedFilesModelRoles::description), " description" ),
259- std::make_pair (int (DisplayedFilesModelRoles::image), " image" ),
260- std::make_pair (int (DisplayedFilesModelRoles::license), " license" ),
261- std::make_pair (int (DisplayedFilesModelRoles::modifiedTime), " modifiedTime" ),
262- std::make_pair (int (DisplayedFilesModelRoles::path), " path" ),
263- std::make_pair (int (DisplayedFilesModelRoles::size), " size" ),
254+ std::make_pair (static_cast < int > (DisplayedFilesModelRoles::author), " author" ),
255+ std::make_pair (static_cast < int > (DisplayedFilesModelRoles::baseName), " baseName" ),
256+ std::make_pair (static_cast < int > (DisplayedFilesModelRoles::company), " company" ),
257+ std::make_pair (static_cast < int > (DisplayedFilesModelRoles::creationTime), " creationTime" ),
258+ std::make_pair (static_cast < int > (DisplayedFilesModelRoles::description), " description" ),
259+ std::make_pair (static_cast < int > (DisplayedFilesModelRoles::image), " image" ),
260+ std::make_pair (static_cast < int > (DisplayedFilesModelRoles::license), " license" ),
261+ std::make_pair (static_cast < int > (DisplayedFilesModelRoles::modifiedTime), " modifiedTime" ),
262+ std::make_pair (static_cast < int > (DisplayedFilesModelRoles::path), " path" ),
263+ std::make_pair (static_cast < int > (DisplayedFilesModelRoles::size), " size" ),
264264 };
265265 return nameMap;
266266}
0 commit comments