Skip to content

Commit f1f9b48

Browse files
committed
feat: add UAB file thumbnail support
1. Added UAB MIME type definition and thumbnail generation support 2. Implemented UAB thumbnail extraction from linglong.icon ELF section using readelf 3. Enhanced MIME type support system with strategy-based checking 4. Added UAB to unconditional thumbnail support category (like AppImage) 5. Created utility function to skip thumbnail frame for specific file types 6. Improved file validation logic in thumbnail creators 7. Fixed PPTX MIME type checking to include parent types Log: Added thumbnail support for UAB files Influence: 1. Test UAB file thumbnail generation with valid files containing linglong.icon section 2. Verify UAB files without linglong.icon section show no thumbnail 3. Check that UAB files skip thumbnail frame display like AppImage 4. Test thumbnail generation with different UAB file sizes 5. Verify PPTX thumbnail generation still works correctly 6. Test that existing thumbnail functionality for other file types remains unchanged 7. Check thumbnail support settings in preferences affect UAB files appropriately feat: 添加 UAB 文件缩略图支持 1. 添加 UAB MIME 类型定义和缩略图生成支持 2. 实现从 UAB 文件的 linglong.icon ELF 节提取缩略图,使用 readelf 工具 3. 增强 MIME 类型支持系统,采用基于策略的检查机制 4. 将 UAB 添加到无条件缩略图支持类别(与 AppImage 类似) 5. 创建工具函数用于跳过特定文件类型的缩略图底板 6. 改进缩略图生成器中的文件验证逻辑 7. 修复 PPTX MIME 类型检查以包含父类型 Log: 新增 UAB 文件缩略图支持功能 Influence: 1. 测试包含 linglong.icon 节的 UAB 文件缩略图生成 2. 验证没有 linglong.icon 节的 UAB 文件不显示缩略图 3. 检查 UAB 文件是否像 AppImage 一样跳过缩略图底板显示 4. 测试不同大小 UAB 文件的缩略图生成 5. 验证 PPTX 缩略图生成功能仍然正常工作 6. 测试其他文件类型的现有缩略图功能是否保持不变 7. 检查首选项中的缩略图支持设置是否正确影响 UAB 文件
1 parent a9a6668 commit f1f9b48

File tree

12 files changed

+252
-57
lines changed

12 files changed

+252
-57
lines changed

include/dfm-base/dfm_global_defines.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ inline constexpr char kTypeAppVMAsf[] { "application/vnd.ms-asf" };
152152
inline constexpr char kTypeAppCRRMedia[] { "application/cnd.rn-realmedia" };
153153
inline constexpr char kTypeAppVRRMedia[] { "application/vnd.rn-realmedia" };
154154
inline constexpr char kTypeAppAppimage[] { "application/vnd.appimage" };
155+
inline constexpr char kTypeAppUab[] { "application/vnd.linyaps.uab" };
155156
inline constexpr char kTypeTextHtml[] { "text/html" };
156157
inline constexpr char kTypeAppXhtmlXml[] { "application/xhtml+xml" };
157158
inline constexpr char kTypeTextXPython[] { "text/x-python" };

src/dfm-base/utils/iconutils.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
// SPDX-License-Identifier: GPL-3.0-or-later
44
#include "iconutils.h"
55

6+
#include <dfm-base/dfm_global_defines.h>
7+
68
#include <QPainter>
79
#include <QGraphicsDropShadowEffect>
810
#include <QGraphicsScene>
@@ -108,3 +110,13 @@ QPixmap IconUtils::renderIconBackground(const QSizeF &size, const IconStyle &sty
108110
p.end();
109111
return pm;
110112
}
113+
114+
bool IconUtils::shouldSkipThumbnailFrame(const QString &mimeType)
115+
{
116+
// appimage, uab 不显示缩略图底板
117+
static const QStringList kExcludedMimes = {
118+
Global::Mime::kTypeAppAppimage,
119+
Global::Mime::kTypeAppUab
120+
};
121+
return kExcludedMimes.contains(mimeType);
122+
}

src/dfm-base/utils/iconutils.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ QPixmap renderIconBackground(const QSize &size, const IconStyle &style = IconSty
2323
QPixmap renderIconBackground(const QSizeF &size, const IconStyle &style = IconStyle {});
2424
QPixmap addShadowToPixmap(const QPixmap &originalPixmap, int shadowOffsetY, qreal blurRadius, qreal shadowOpacity);
2525
IconStyle getIconStyle(int size);
26+
bool shouldSkipThumbnailFrame(const QString &mimeType);
2627
} // end namespace IconUtils
2728

2829
DFMBASE_END_NAMESPACE

src/dfm-base/utils/thumbnail/thumbnailcreators.cpp

Lines changed: 132 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -497,16 +497,14 @@ QImage ThumbnailCreators::appimageThumbnailCreator(const QString &filePath, Thum
497497
qCDebug(logDFMBase) << "thumbnail: creating AppImage thumbnail for:" << filePath << "size:" << size;
498498

499499
// 1. Check if AppImage exists
500-
if (!QFile::exists(filePath)) {
500+
auto info = InfoFactory::create<FileInfo>(QUrl::fromLocalFile(filePath));
501+
if (!info || !info->exists()) {
501502
qCWarning(logDFMBase) << "thumbnail: AppImage file not found:" << filePath;
502503
return QImage();
503504
}
504505

505506
// 2. Check if file is AppImage type and has executable permission
506-
auto info = InfoFactory::create<FileInfo>(QUrl::fromLocalFile(filePath),
507-
Global::CreateFileInfoType::kCreateFileInfoSync);
508-
if (!info
509-
|| info->nameOf(NameInfoType::kMimeTypeName) != Global::Mime::kTypeAppAppimage
507+
if (info->nameOf(NameInfoType::kMimeTypeName) != Global::Mime::kTypeAppAppimage
510508
|| !info->isAttributes(FileInfo::FileIsType::kIsExecutable)) {
511509
qCWarning(logDFMBase) << "thumbnail: file is not a valid AppImage or lacks executable permission:" << filePath
512510
<< "mimeType:" << (info ? info->nameOf(NameInfoType::kMimeTypeName) : "null")
@@ -520,11 +518,10 @@ QImage ThumbnailCreators::appimageThumbnailCreator(const QString &filePath, Thum
520518

521519
// Read .DirIcon file from AppImage without extraction
522520
bool success = appimage_read_file_into_buffer_following_symlinks(
523-
filePath.toUtf8().constData(),
524-
".DirIcon",
525-
&iconBuffer,
526-
&iconSize
527-
);
521+
filePath.toUtf8().constData(),
522+
".DirIcon",
523+
&iconBuffer,
524+
&iconSize);
528525

529526
// Use RAII to ensure buffer cleanup
530527
QScopedPointer<char, QScopedPointerPodDeleter> bufferCleanup(iconBuffer);
@@ -557,18 +554,19 @@ QImage ThumbnailCreators::pptxThumbnailCreator(const QString &filePath, Thumbnai
557554
{
558555
qCInfo(logDFMBase) << "thumbnail: creating PPTX thumbnail for:" << filePath << "size:" << size;
559556

560-
// 1. Verify file exists
561-
if (!QFile::exists(filePath)) {
557+
auto info = InfoFactory::create<FileInfo>(QUrl::fromLocalFile(filePath));
558+
if (!info || !info->exists()) {
562559
qCWarning(logDFMBase) << "thumbnail: PPTX file not found:" << filePath;
563560
return QImage();
564561
}
565562

566563
// 2. Verify file type
567-
auto info = InfoFactory::create<FileInfo>(QUrl::fromLocalFile(filePath),
568-
Global::CreateFileInfoType::kCreateFileInfoSync);
569-
if (!info || info->nameOf(NameInfoType::kMimeTypeName) != Global::Mime::kTypeAppPptx) {
564+
const QMimeType &mime = info->fileMimeType();
565+
QStringList candidateTypes { info->nameOf(NameInfoType::kMimeTypeName) };
566+
candidateTypes.append(mime.parentMimeTypes());
567+
if (!candidateTypes.contains(Global::Mime::kTypeAppPptx)) {
570568
qCWarning(logDFMBase) << "thumbnail: file is not a valid PPTX file:" << filePath
571-
<< "mimeType:" << (info ? info->nameOf(NameInfoType::kMimeTypeName) : "null");
569+
<< "mimeTypes:" << candidateTypes;
572570
return QImage();
573571
}
574572

@@ -618,3 +616,121 @@ QImage ThumbnailCreators::pptxThumbnailCreator(const QString &filePath, Thumbnai
618616
qCDebug(logDFMBase) << "thumbnail: no thumbnail available for PPTX file:" << filePath;
619617
return QImage();
620618
}
619+
620+
QImage ThumbnailCreators::uabThumbnailCreator(const QString &filePath, ThumbnailSize size)
621+
{
622+
qCDebug(logDFMBase) << "thumbnail: creating UAB thumbnail for:" << filePath << "size:" << size;
623+
624+
// 1. Validate file existence
625+
auto info = InfoFactory::create<FileInfo>(QUrl::fromLocalFile(filePath));
626+
if (!info || !info->exists()) {
627+
qCWarning(logDFMBase) << "thumbnail: UAB file not found:" << filePath;
628+
return QImage();
629+
}
630+
631+
// 2. Verify file type
632+
if (!info || info->nameOf(NameInfoType::kMimeTypeName) != Global::Mime::kTypeAppUab) {
633+
qCWarning(logDFMBase) << "thumbnail: file is not a valid UAB file:" << filePath
634+
<< "mimeType:" << (info ? info->nameOf(NameInfoType::kMimeTypeName) : "null");
635+
return QImage();
636+
}
637+
638+
// 3. Query ELF section information using readelf (read-only, no file modification)
639+
QProcess readelfProcess;
640+
readelfProcess.start("readelf", { "-W", "-S", filePath });
641+
642+
if (!readelfProcess.waitForFinished(5000)) {
643+
qCWarning(logDFMBase) << "thumbnail: readelf timeout for UAB file:" << filePath;
644+
readelfProcess.kill();
645+
return QImage();
646+
}
647+
648+
if (readelfProcess.exitCode() != 0) {
649+
qCWarning(logDFMBase) << "thumbnail: readelf failed for UAB file:" << filePath
650+
<< "stderr:" << readelfProcess.readAllStandardError();
651+
return QImage();
652+
}
653+
654+
// 4. Parse readelf output to locate linglong.icon section
655+
QString readelfOutput = readelfProcess.readAllStandardOutput();
656+
QStringList lines = readelfOutput.split('\n');
657+
658+
qint64 sectionOffset = -1;
659+
qint64 sectionSize = -1;
660+
bool sectionFound = false;
661+
662+
for (const QString &line : lines) {
663+
if (line.contains("linglong.icon")) {
664+
// Parse section header line format:
665+
// [Nr] Name Type Address Off Size ES Flg Lk Inf Al
666+
// [26] linglong.icon PROGBITS 0000000000000000 002e30 004e20 00 0 0 1
667+
QString normalizedLine = line.simplified();
668+
QStringList parts = normalizedLine.split(' ', Qt::SkipEmptyParts);
669+
670+
// Validate column count (need at least 7 columns)
671+
if (parts.size() >= 7) {
672+
bool offsetOk = false, sizeOk = false;
673+
sectionOffset = parts[4].toLongLong(&offsetOk, 16); // Column 5: Offset (hex)
674+
sectionSize = parts[5].toLongLong(&sizeOk, 16); // Column 6: Size (hex)
675+
676+
if (offsetOk && sizeOk && sectionOffset > 0 && sectionSize > 0) {
677+
sectionFound = true;
678+
qCDebug(logDFMBase) << "thumbnail: found linglong.icon section - offset:"
679+
<< QString("0x%1").arg(sectionOffset, 0, 16)
680+
<< "size:" << sectionSize << "bytes";
681+
break;
682+
}
683+
}
684+
}
685+
}
686+
687+
if (!sectionFound) {
688+
qCWarning(logDFMBase) << "thumbnail: linglong.icon section not found in UAB file:" << filePath;
689+
return QImage();
690+
}
691+
692+
// 5. Extract section data using QFile (read-only mode, no file modification)
693+
QFile uabFile(filePath);
694+
if (!uabFile.open(QIODevice::ReadOnly)) {
695+
qCWarning(logDFMBase) << "thumbnail: failed to open UAB file for reading:" << filePath
696+
<< "error:" << uabFile.errorString();
697+
return QImage();
698+
}
699+
700+
if (!uabFile.seek(sectionOffset)) {
701+
qCWarning(logDFMBase) << "thumbnail: failed to seek to section offset:" << sectionOffset
702+
<< "in file:" << filePath
703+
<< "error:" << uabFile.errorString();
704+
uabFile.close();
705+
return QImage();
706+
}
707+
708+
QByteArray iconData = uabFile.read(sectionSize);
709+
uabFile.close(); // Close immediately to release file handle
710+
711+
if (iconData.size() != sectionSize) {
712+
qCWarning(logDFMBase) << "thumbnail: incomplete section data read - expected:" << sectionSize
713+
<< "bytes, got:" << iconData.size() << "bytes for:" << filePath;
714+
return QImage();
715+
}
716+
717+
qCDebug(logDFMBase) << "thumbnail: successfully extracted" << iconData.size()
718+
<< "bytes of icon data from UAB file:" << filePath;
719+
720+
// 6. Load image directly from extracted data (no temporary file needed)
721+
QImage icon;
722+
if (!icon.loadFromData(iconData)) {
723+
qCWarning(logDFMBase) << "thumbnail: failed to decode image from extracted icon data for:" << filePath;
724+
return QImage();
725+
}
726+
727+
// 7. Scale image to requested thumbnail size
728+
if (icon.width() > size || icon.height() > size) {
729+
icon = icon.scaled(size, size, Qt::KeepAspectRatio, Qt::SmoothTransformation);
730+
qCDebug(logDFMBase) << "thumbnail: scaled UAB icon from"
731+
<< icon.size() << "to fit size:" << size;
732+
}
733+
734+
qCDebug(logDFMBase) << "thumbnail: UAB thumbnail created successfully for:" << filePath;
735+
return icon;
736+
}

src/dfm-base/utils/thumbnail/thumbnailcreators.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ QImage imageThumbnailCreator(const QString &filePath, DFMGLOBAL_NAMESPACE::Thumb
2121
QImage djvuThumbnailCreator(const QString &filePath, DFMGLOBAL_NAMESPACE::ThumbnailSize size);
2222
QImage pdfThumbnailCreator(const QString &filePath, DFMGLOBAL_NAMESPACE::ThumbnailSize size);
2323
QImage appimageThumbnailCreator(const QString &filePath, DFMGLOBAL_NAMESPACE::ThumbnailSize size);
24+
QImage uabThumbnailCreator(const QString &filePath, DFMGLOBAL_NAMESPACE::ThumbnailSize size);
2425
QImage pptxThumbnailCreator(const QString &filePath, DFMGLOBAL_NAMESPACE::ThumbnailSize size);
2526
} // namespace ThumbnailCreators
2627
} // namespace dfmbase

src/dfm-base/utils/thumbnail/thumbnailfactory.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ ThumbnailFactory::ThumbnailFactory(QObject *parent)
3535
registerThumbnailCreator("audio/*", ThumbnailCreators::audioThumbnailCreator);
3636
registerThumbnailCreator("video/*", ThumbnailCreators::videoThumbnailCreator);
3737
registerThumbnailCreator(Mime::kTypeAppAppimage, ThumbnailCreators::appimageThumbnailCreator);
38+
registerThumbnailCreator(Mime::kTypeAppUab, ThumbnailCreators::uabThumbnailCreator);
3839
registerThumbnailCreator(Mime::kTypeAppPptx, ThumbnailCreators::pptxThumbnailCreator);
3940

4041
init();

src/dfm-base/utils/thumbnail/thumbnailhelper.cpp

Lines changed: 86 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,37 @@ DFMGLOBAL_USE_NAMESPACE
3131

3232
ThumbnailHelper::ThumbnailHelper()
3333
{
34+
initMimeTypeSupport();
35+
}
36+
37+
void ThumbnailHelper::initMimeTypeSupport()
38+
{
39+
using Strategy = SupportCheckStrategy;
40+
41+
// === Image types ===
42+
mimeTypeSupportStrategy.insert("image/*", Strategy::kCheckImage);
43+
44+
// === Audio types ===
45+
mimeTypeSupportStrategy.insert("audio/*", Strategy::kCheckAudio);
46+
47+
// === Video types ===
48+
mimeTypeSupportStrategy.insert("video/*", Strategy::kCheckVideo);
49+
50+
// === Text types ===
51+
mimeTypeSupportStrategy.insert(Mime::kTypeTextPlain, Strategy::kCheckText);
52+
53+
// === Document types ===
54+
mimeTypeSupportStrategy.insert(Mime::kTypeAppPdf, Strategy::kCheckDocument);
55+
mimeTypeSupportStrategy.insert(Mime::kTypeAppCRRMedia, Strategy::kCheckDocument);
56+
mimeTypeSupportStrategy.insert(Mime::kTypeAppMxf, Strategy::kCheckDocument);
57+
mimeTypeSupportStrategy.insert(Mime::kTypeAppPptx, Strategy::kCheckDocument);
58+
59+
// === Executable package types (unconditional icon display) ===
60+
mimeTypeSupportStrategy.insert(Mime::kTypeAppAppimage, Strategy::kUnconditional);
61+
mimeTypeSupportStrategy.insert(Mime::kTypeAppUab, Strategy::kUnconditional);
62+
63+
qCInfo(logDFMBase) << "thumbnail: initialized MIME type support strategies for"
64+
<< mimeTypeSupportStrategy.size() << "types";
3465
}
3566

3667
void ThumbnailHelper::initSizeLimit()
@@ -41,7 +72,7 @@ void ThumbnailHelper::initSizeLimit()
4172
sizeLimitHash.insert(mimeDatabase.mimeTypeForName(DFMGLOBAL_NAMESPACE::Mime::kTypeAppVRRMedia), INT64_MAX);
4273
sizeLimitHash.insert(mimeDatabase.mimeTypeForName(DFMGLOBAL_NAMESPACE::Mime::kTypeAppVMAsf), INT64_MAX);
4374
sizeLimitHash.insert(mimeDatabase.mimeTypeForName(DFMGLOBAL_NAMESPACE::Mime::kTypeAppMxf), INT64_MAX);
44-
sizeLimitHash.insert(mimeDatabase.mimeTypeForName(DFMGLOBAL_NAMESPACE::Mime::kTypeAppPptx), INT64_MAX);
75+
sizeLimitHash.insert(mimeDatabase.mimeTypeForName(DFMGLOBAL_NAMESPACE::Mime::kTypeAppPptx), 1024 * 1024 * 80);
4576

4677
// images
4778
sizeLimitHash.insert(mimeDatabase.mimeTypeForName(DFMGLOBAL_NAMESPACE::Mime::kTypeImageIef), 1024 * 1024 * 80);
@@ -54,8 +85,8 @@ void ThumbnailHelper::initSizeLimit()
5485
sizeLimitHash.insert(mimeDatabase.mimeTypeForName(DFMGLOBAL_NAMESPACE::Mime::kTypeImagePipeg), 1024 * 1024 * 30);
5586
// High file limit size only for FLAC files.
5687
sizeLimitHash.insert(mimeDatabase.mimeTypeForName(DFMGLOBAL_NAMESPACE::Mime::kTypeAudioFlac), INT64_MAX);
57-
5888
sizeLimitHash.insert(mimeDatabase.mimeTypeForName(DFMGLOBAL_NAMESPACE::Mime::kTypeAppAppimage), INT64_MAX);
89+
sizeLimitHash.insert(mimeDatabase.mimeTypeForName(DFMGLOBAL_NAMESPACE::Mime::kTypeAppUab), INT64_MAX);
5990

6091
qCInfo(logDFMBase) << "thumbnail: initialized size limits for" << sizeLimitHash.size() << "mime types";
6192
}
@@ -98,49 +129,71 @@ bool ThumbnailHelper::canGenerateThumbnail(const QUrl &url)
98129
bool ThumbnailHelper::checkMimeTypeSupport(const QMimeType &mime)
99130
{
100131
const QString &mimeName = mime.name();
101-
QStringList mimeList = { mimeName };
102-
mimeList.append(mime.parentMimeTypes());
103-
104-
auto checkStatus = [](Application::GenericAttribute attr) {
105-
return Application::instance()->genericAttribute(attr).toBool();
106-
};
132+
QStringList candidateTypes { mimeName };
133+
candidateTypes.append(mime.parentMimeTypes());
107134

108-
if (mimeName.startsWith("image")) {
109-
bool supported = checkStatus(Application::kPreviewImage);
110-
return supported;
135+
// === Special check: MimeTypeDisplayManager audio/video types ===
136+
// These types may not start with "audio/" or "video/" prefix
137+
if (MimeTypeDisplayManager::instance()->supportAudioMimeTypes().contains(mimeName)) {
138+
return Application::instance()->genericAttribute(Application::kPreviewAudio).toBool();
111139
}
112140

113-
if (mimeName.startsWith("audio")
114-
|| MimeTypeDisplayManager::instance()->supportAudioMimeTypes().contains(mimeName)) {
115-
bool supported = checkStatus(Application::kPreviewAudio);
116-
return supported;
141+
if (MimeTypeDisplayManager::instance()->supportVideoMimeTypes().contains(mimeName)) {
142+
return Application::instance()->genericAttribute(Application::kPreviewVideo).toBool();
117143
}
118144

119-
if (mimeName.startsWith("video")
120-
|| MimeTypeDisplayManager::instance()->supportVideoMimeTypes().contains(mimeName)) {
121-
bool supported = checkStatus(Application::kPreviewVideo);
122-
return supported;
123-
}
145+
// === Find matching strategy ===
146+
SupportCheckStrategy strategy;
147+
bool found = false;
148+
149+
for (const QString &type : candidateTypes) {
150+
// 1. Exact match
151+
if (mimeTypeSupportStrategy.contains(type)) {
152+
strategy = mimeTypeSupportStrategy.value(type);
153+
found = true;
154+
break;
155+
}
124156

125-
if (mimeName == Mime::kTypeTextPlain) {
126-
bool supported = checkStatus(Application::kPreviewTextFile);
127-
return supported;
157+
// 2. Wildcard match (e.g., image/*, audio/*, video/*)
158+
QString prefix = type.section('/', 0, 0);
159+
QString wildcardPattern = prefix + "/*";
160+
if (mimeTypeSupportStrategy.contains(wildcardPattern)) {
161+
strategy = mimeTypeSupportStrategy.value(wildcardPattern);
162+
found = true;
163+
break;
164+
}
128165
}
129166

130-
if (Q_LIKELY(mimeList.contains(Mime::kTypeAppPdf)
131-
|| mimeName == Mime::kTypeAppCRRMedia
132-
|| mimeName == Mime::kTypeAppMxf)
133-
|| mimeList.contains(Mime::kTypeAppPptx)) {
134-
bool supported = checkStatus(Application::kPreviewDocumentFile);
135-
return supported;
167+
if (!found) {
168+
return false;
136169
}
137170

138-
// appimage is executable package, should display icon
139-
if (mimeName == Mime::kTypeAppAppimage) {
171+
// === Evaluate strategy ===
172+
return evaluateStrategy(strategy);
173+
}
174+
175+
bool ThumbnailHelper::evaluateStrategy(SupportCheckStrategy strategy)
176+
{
177+
auto checkAttribute = [](Application::GenericAttribute attr) {
178+
return Application::instance()->genericAttribute(attr).toBool();
179+
};
180+
181+
switch (strategy) {
182+
case SupportCheckStrategy::kUnconditional:
140183
return true;
184+
case SupportCheckStrategy::kCheckImage:
185+
return checkAttribute(Application::kPreviewImage);
186+
case SupportCheckStrategy::kCheckAudio:
187+
return checkAttribute(Application::kPreviewAudio);
188+
case SupportCheckStrategy::kCheckVideo:
189+
return checkAttribute(Application::kPreviewVideo);
190+
case SupportCheckStrategy::kCheckText:
191+
return checkAttribute(Application::kPreviewTextFile);
192+
case SupportCheckStrategy::kCheckDocument:
193+
return checkAttribute(Application::kPreviewDocumentFile);
194+
default:
195+
return false;
141196
}
142-
143-
return false;
144197
}
145198

146199
void ThumbnailHelper::makePath(const QString &path)

0 commit comments

Comments
 (0)