From 2ca7cdb691f7dc2962ca066f5440a0710e1b7ed4 Mon Sep 17 00:00:00 2001 From: zhangkun Date: Thu, 16 Oct 2025 18:52:06 +0800 Subject: [PATCH] feat: improve icon size detection and duplicate handling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Added foundSize function to parse icon size from directory names using multiple strategies 2. Implemented duplicate entry detection to skip existing icons in DCI files 3. Added QFileInfo and QLogging includes for new functionality 4. Removed debug-specific code that was adding unnecessary prefixes 5. Improved size detection logic to handle both numeric and "NxN" format directory names 6. Added fallback to parent directory when current directory name doesn't contain size information Log: Improved icon theme generation with better size detection and duplicate prevention Influence: 1. Test icon theme generation with various directory naming conventions 2. Verify that duplicate icons are properly skipped during generation 3. Test with directories containing numeric names vs "widthxheight" format 4. Verify fallback to parent directory size detection works correctly 5. Check that existing icons in DCI files are not overwritten 6. Test with different directory structures and naming patterns feat: 改进图标尺寸检测和重复项处理 1. 添加 foundSize 函数,使用多种策略从目录名解析图标尺寸 2. 实现重复条目检测,跳过 DCI 文件中已存在的图标 3. 添加 QFileInfo 和 QLogging 包含以支持新功能 4. 移除添加不必要前缀的调试专用代码 5. 改进尺寸检测逻辑,支持数字和"NxN"格式的目录名 6. 在当前目录名不包含尺寸信息时,添加回退到父目录的检测 Log: 改进图标主题生成,提供更好的尺寸检测和重复项预防 Influence: 1. 测试使用不同目录命名约定的图标主题生成 2. 验证在生成过程中重复图标是否被正确跳过 3. 测试包含数字名称与"宽x高"格式的目录 4. 验证回退到父目录尺寸检测是否正常工作 5. 检查 DCI 文件中现有图标是否不会被覆盖 6. 测试不同的目录结构和命名模式 --- tools/dci-icon-theme/main.cpp | 49 ++++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 9 deletions(-) diff --git a/tools/dci-icon-theme/main.cpp b/tools/dci-icon-theme/main.cpp index 5e364a24..74a0293e 100644 --- a/tools/dci-icon-theme/main.cpp +++ b/tools/dci-icon-theme/main.cpp @@ -43,6 +43,37 @@ static inline void dciChecker(bool result, std::function cb) { } } +// TODO 应该使用xdg图标查找规范解析index.theme来查找尺寸 +static uint foundSize(const QFileInfo &fileInfo) { + QDir dir = fileInfo.absoluteDir(); + + // 解析尺寸 + auto parseSize = [](const QString &dirName) -> uint { + bool ok; + if (int size = dirName.toUInt(&ok); ok) { + return size; + } + + if (dirName.contains('x') && dirName.split('x').size() == 2) { + if (int size = dirName.split('x').first().toUInt(&ok); ok) { + return size; + } + } + + return 0; + }; + + if (uint size = parseSize(dir.dirName())) { + return size; + } + + // 尝试找上一级目录 + if (!dir.cdUp()) + return 0; + + return parseSize(dir.dirName()); +} + static inline QByteArray webpImageData(const QImage &image, int quality) { QByteArray data; QBuffer buffer(&data); @@ -293,10 +324,6 @@ int main(int argc, char *argv[]) #endif QStringList qualityList = cp.value(scaleQuality).split(":", behavior); -#ifdef QT_DEBUG - surfix = cp.value(scaleQuality).prepend("-"); -#endif - for (const QString &kv : qualityList) { auto sq = kv.split("="); if (sq.size() != 2) { @@ -418,10 +445,9 @@ int main(int argc, char *argv[]) for (const QFileInfo &file : files) { QString dirName = file.absoluteDir().dirName(); - bool isNum = false; - dirName.toInt(&isNum); - dirName.prepend("/"); - + uint iconSize = foundSize(file); + dirName = iconSize > 0 ? QString("/%1").arg(iconSize) : dirName.prepend("/"); + // Initialize DCI file once per icon group if (dciFile.isNull()) { if (QFileInfo::exists(dciFilePath)) { @@ -438,10 +464,15 @@ int main(int argc, char *argv[]) qInfo() << "Writing to dci file:" << file.absoluteFilePath() << "==>" << dciFilePath; - QString sizeDir = isNum ? dirName : "/256"; // "/256" + QString sizeDir = iconSize > 0 ? dirName : "/256"; // "/256" as default QString normalLight = sizeDir + "/normal.light"; // "/256/normal.light" QString normalDark = sizeDir + "/normal.dark"; // "/256/normal.dark" + if (dciFile->exists(sizeDir)) { + qWarning() << "Skip exists dci file:" << dciFilePath << sizeDir << dciFile->list(sizeDir); + continue; + } + dciChecker(dciFile->mkdir(sizeDir), [&]{return dciFile->lastErrorString();}); dciChecker(dciFile->mkdir(normalLight), [&]{return dciFile->lastErrorString();}); if (!writeImage(*dciFile, file.filePath(), normalLight))