From de839911e93e4194836f6a94105d6ef72075b997 Mon Sep 17 00:00:00 2001 From: wmayer Date: Mon, 4 Jul 2022 14:49:53 +0200 Subject: [PATCH] Gui: show thumbnails in file dialog --- src/Gui/FileDialog.cpp | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/src/Gui/FileDialog.cpp b/src/Gui/FileDialog.cpp index 3cf30018fb..fb284b956e 100644 --- a/src/Gui/FileDialog.cpp +++ b/src/Gui/FileDialog.cpp @@ -26,6 +26,7 @@ # include # include # include +# include # include # include # include @@ -597,9 +598,38 @@ QIcon FileIconProvider::icon(IconType type) const QIcon FileIconProvider::icon(const QFileInfo & info) const { - if (info.suffix().toLower() == QLatin1String("fcstd")) { - // return QApplication::windowIcon(); + auto toUrl = [](const QFileInfo & info) { + QFileInfo fi(info); + fi.makeAbsolute(); + QString fileName = fi.absoluteFilePath(); + if (fi.isSymLink()) { + fileName = fi.symLinkTarget(); + } + + return QUrl::fromLocalFile(fileName).toString(); + }; + + auto urlToThumbnail = [](const QString& filename) { + QString hash = QString::fromLatin1(QCryptographicHash::hash(filename.toUtf8(), QCryptographicHash::Md5).toHex()); + QString cache = QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation); + return QString::fromLatin1("%1/thumbnails/normal/%2.png").arg(cache, hash); + }; + + auto iconFromFile = [](const QString& filename) { + if (QFile::exists(filename)) { + QIcon icon(filename); + if (!icon.isNull()) + return icon; + } + return QIcon(QString::fromLatin1(":/icons/freecad-doc.png")); + }; + + if (info.suffix().toLower() == QLatin1String("fcstd")) { + // Check if a thumbnail is available + QString fileName = toUrl(info); + QString thumb = urlToThumbnail(fileName); + return iconFromFile(thumb); } else if (info.suffix().toLower().startsWith(QLatin1String("fcstd"))) { QIcon icon(QString::fromLatin1(":/icons/freecad-doc.png"));