Skip to content

Commit 29b717b

Browse files
committed
GH-3068 Icons dont necessarly overwrite each other
1 parent 6c9dc4c commit 29b717b

File tree

4 files changed

+87
-15
lines changed

4 files changed

+87
-15
lines changed

launcher/InstanceImportTask.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ void InstanceImportTask::processZipPack()
107107
root = mmcFound;
108108
m_modpackType = ModpackType::MultiMC;
109109
}
110-
else if (technicFound)
110+
else if(technicFound)
111111
{
112112
// process as Technic pack
113113
qDebug() << "Technic:" << technicFound;
@@ -445,11 +445,11 @@ void InstanceImportTask::processMultiMC()
445445
{
446446
// import icon
447447
auto iconList = ENV.icons();
448-
if (iconList->iconFileExists(m_instIcon))
448+
if (!iconList->iconFileExists(m_instIcon))
449449
{
450-
iconList->deleteIcon(m_instIcon);
450+
iconList->installIcon(importIconPath, m_instIcon);
451451
}
452-
iconList->installIcons({importIconPath});
452+
453453
}
454454
}
455455
emitSucceeded();

launcher/icons/IIconList.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,5 @@ class IIconList
2121
virtual void saveIcon(const QString &key, const QString &path, const char * format) const = 0;
2222
virtual bool iconFileExists(const QString &key) const = 0;
2323
virtual void installIcons(const QStringList &iconFiles) = 0;
24-
virtual void installIcon(const QString &file, const QString &name) = 0;
24+
virtual void installIcon(const QString &file, QString &name) = 0;
2525
};

launcher/icons/IconList.cpp

Lines changed: 77 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include <QFileSystemWatcher>
2323
#include <QSet>
2424
#include <QDebug>
25+
#include <QCryptographicHash>
2526

2627
#define MAX_SIZE 1024
2728

@@ -255,28 +256,96 @@ void IconList::installIcons(const QStringList &iconFiles)
255256
for (QString file : iconFiles)
256257
{
257258
QFileInfo fileinfo(file);
258-
if (!fileinfo.isReadable() || !fileinfo.isFile())
259+
if(!fileinfo.isReadable() || !fileinfo.isFile())
259260
continue;
260-
QString target = FS::PathCombine(m_dir.dirName(), fileinfo.fileName());
261261

262+
QFile sourceFile(file);
263+
if(!sourceFile.open(QIODevice::ReadOnly))
264+
continue;
265+
262266
QString suffix = fileinfo.suffix();
263267
if (suffix != "jpeg" && suffix != "png" && suffix != "jpg" && suffix != "ico" && suffix != "svg" && suffix != "gif")
264268
continue;
269+
270+
const QString sourceHash = getIconHash(sourceFile);
271+
QString sourceFileName = fileinfo.baseName();
272+
sourceFileName = QString("%1_%2.%3").arg(sourceFileName, sourceHash, suffix);
273+
QString target = FS::PathCombine(m_dir.dirName(), sourceFileName);
274+
275+
if(QFile::exists(target))
276+
{
277+
QFile targetFile(target);
278+
if(!targetFile.open(QIODevice::ReadOnly))
279+
continue;
265280

281+
const QString targetHash = getIconHash(targetFile);
282+
283+
if(sourceHash == targetHash)
284+
continue;
285+
286+
QString targetFileName = fileinfo.baseName();
287+
targetFileName = QString("%1_%2.%3").arg(targetFileName, targetHash, suffix);
288+
targetFileName = FS::PathCombine(m_dir.dirName(), targetFileName);
289+
if(!targetFile.rename(targetFileName))
290+
continue;
291+
}
266292
if (!QFile::copy(file, target))
267293
continue;
268294
}
269295
}
270296

271-
void IconList::installIcon(const QString &file, const QString &name)
297+
void IconList::installIcon(const QString &file, QString &name)
272298
{
273-
QFileInfo fileinfo(file);
274-
if(!fileinfo.isReadable() || !fileinfo.isFile())
275-
return;
299+
QFileInfo fileinfo(file);
300+
if(!fileinfo.isReadable() || !fileinfo.isFile())
301+
return;
302+
303+
QFile sourceFile(file);
304+
if(!sourceFile.open(QIODevice::ReadOnly))
305+
return;
306+
307+
QString suffix = fileinfo.suffix();
308+
if (suffix != "jpeg" && suffix != "png" && suffix != "jpg" && suffix != "ico" && suffix != "svg" && suffix != "gif")
309+
return;
310+
311+
const QString sourceHash = getIconHash(sourceFile);
312+
name = QString("%1_%2.%3").arg(name, sourceHash, suffix);
313+
QString target = FS::PathCombine(m_dir.dirName(), name);
314+
315+
if(QFile::exists(target))
316+
{
317+
QFile targetFile(target);
318+
if(!targetFile.open(QIODevice::ReadOnly))
319+
return;
320+
321+
const QString targetHash = getIconHash(targetFile);
322+
323+
if(sourceHash == targetHash)
324+
return;
325+
326+
QString targetFileName = QString(name);
327+
targetFileName = QString("%1_%2.%3").arg(targetFileName, targetHash, suffix);
328+
targetFileName = FS::PathCombine(m_dir.dirName(), targetFileName);
329+
if(!targetFile.rename(targetFileName))
330+
return;
331+
}
332+
if (!QFile::copy(file, target))
333+
return;
334+
}
276335

277-
QString target = FS::PathCombine(m_dir.dirName(), name);
336+
const QString IconList::getIconHash(QFile& file)
337+
{
338+
QByteArray iconByteArray = file.readAll();
339+
const QString iconHash = QString(QCryptographicHash::hash((iconByteArray), QCryptographicHash::Md5).toHex());
340+
return iconHash;
341+
}
278342

279-
QFile::copy(file, target);
343+
const QString IconList::getIconHash(const QString& fileName)
344+
{
345+
QFile file(fileName);
346+
if(!file.open(QIODevice::ReadOnly))
347+
return "";
348+
return getIconHash(file);
280349
}
281350

282351
bool IconList::iconFileExists(const QString &key) const

launcher/icons/IconList.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,13 @@ class IconList : public QAbstractListModel, public IIconList
5454
virtual Qt::ItemFlags flags(const QModelIndex &index) const override;
5555

5656
void installIcons(const QStringList &iconFiles) override;
57-
void installIcon(const QString &file, const QString &name) override;
58-
57+
void installIcon(const QString &file, QString &name) override;
58+
5959
const MMCIcon * icon(const QString &key) const;
6060

61+
const QString getIconHash(QFile& file);
62+
const QString getIconHash(const QString& fileName);
63+
6164
void startWatching();
6265
void stopWatching();
6366

0 commit comments

Comments
 (0)