@@ -43,6 +43,37 @@ static inline void dciChecker(bool result, std::function<const QString()> cb) {
4343 }
4444}
4545
46+ // TODO 应该使用xdg图标查找规范解析index.theme来查找尺寸
47+ static uint foundSize (const QFileInfo &fileInfo) {
48+ QDir dir = fileInfo.absoluteDir ();
49+
50+ // 解析尺寸
51+ auto parseSize = [](const QString &dirName) -> uint {
52+ bool ok;
53+ if (int size = dirName.toUInt (&ok); ok) {
54+ return size;
55+ }
56+
57+ if (dirName.contains (' x' ) && dirName.split (' x' ).size () == 2 ) {
58+ if (int size = dirName.split (' x' ).first ().toUInt (&ok); ok) {
59+ return size;
60+ }
61+ }
62+
63+ return 0 ;
64+ };
65+
66+ if (uint size = parseSize (dir.dirName ())) {
67+ return size;
68+ }
69+
70+ // 尝试找上一级目录
71+ if (!dir.cdUp ())
72+ return 0 ;
73+
74+ return parseSize (dir.dirName ());
75+ }
76+
4677static inline QByteArray webpImageData (const QImage &image, int quality) {
4778 QByteArray data;
4879 QBuffer buffer (&data);
@@ -293,10 +324,6 @@ int main(int argc, char *argv[])
293324#endif
294325 QStringList qualityList = cp.value (scaleQuality).split (" :" , behavior);
295326
296- #ifdef QT_DEBUG
297- surfix = cp.value (scaleQuality).prepend (" -" );
298- #endif
299-
300327 for (const QString &kv : qualityList) {
301328 auto sq = kv.split (" =" );
302329 if (sq.size () != 2 ) {
@@ -418,10 +445,9 @@ int main(int argc, char *argv[])
418445
419446 for (const QFileInfo &file : files) {
420447 QString dirName = file.absoluteDir ().dirName ();
421- bool isNum = false ;
422- dirName.toInt (&isNum);
423- dirName.prepend (" /" );
424-
448+ uint iconSize = foundSize (file);
449+ dirName = iconSize > 0 ? QString (" /%1" ).arg (iconSize) : dirName.prepend (" /" );
450+
425451 // Initialize DCI file once per icon group
426452 if (dciFile.isNull ()) {
427453 if (QFileInfo::exists (dciFilePath)) {
@@ -438,10 +464,15 @@ int main(int argc, char *argv[])
438464
439465 qInfo () << " Writing to dci file:" << file.absoluteFilePath () << " ==>" << dciFilePath;
440466
441- QString sizeDir = isNum ? dirName : " /256" ; // "/256"
467+ QString sizeDir = iconSize > 0 ? dirName : " /256" ; // "/256" as default
442468 QString normalLight = sizeDir + " /normal.light" ; // "/256/normal.light"
443469 QString normalDark = sizeDir + " /normal.dark" ; // "/256/normal.dark"
444470
471+ if (dciFile->exists (sizeDir)) {
472+ qWarning () << " Skip exists dci file:" << dciFilePath << sizeDir << dciFile->list (sizeDir);
473+ continue ;
474+ }
475+
445476 dciChecker (dciFile->mkdir (sizeDir), [&]{return dciFile->lastErrorString ();});
446477 dciChecker (dciFile->mkdir (normalLight), [&]{return dciFile->lastErrorString ();});
447478 if (!writeImage (*dciFile, file.filePath (), normalLight))
0 commit comments