Skip to content

GH-3068 Fix icons overwriting each other if not needed #4085

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: develop
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions launcher/InstanceImportTask.cpp
Original file line number Diff line number Diff line change
@@ -107,7 +107,7 @@ void InstanceImportTask::processZipPack()
root = mmcFound;
m_modpackType = ModpackType::MultiMC;
}
else if (technicFound)
else if(technicFound)
{
// process as Technic pack
qDebug() << "Technic:" << technicFound;
@@ -445,11 +445,11 @@ void InstanceImportTask::processMultiMC()
{
// import icon
auto iconList = ENV.icons();
if (iconList->iconFileExists(m_instIcon))
if (!iconList->iconFileExists(m_instIcon))
{
iconList->deleteIcon(m_instIcon);
iconList->installIcon(importIconPath, m_instIcon);
}
iconList->installIcons({importIconPath});

}
}
emitSucceeded();
2 changes: 1 addition & 1 deletion launcher/icons/IIconList.h
Original file line number Diff line number Diff line change
@@ -21,5 +21,5 @@ class IIconList
virtual void saveIcon(const QString &key, const QString &path, const char * format) const = 0;
virtual bool iconFileExists(const QString &key) const = 0;
virtual void installIcons(const QStringList &iconFiles) = 0;
virtual void installIcon(const QString &file, const QString &name) = 0;
virtual void installIcon(const QString &file, QString &name) = 0;
};
86 changes: 78 additions & 8 deletions launcher/icons/IconList.cpp
Original file line number Diff line number Diff line change
@@ -22,6 +22,7 @@
#include <QFileSystemWatcher>
#include <QSet>
#include <QDebug>
#include <QCryptographicHash>

#define MAX_SIZE 1024

@@ -255,28 +256,97 @@ void IconList::installIcons(const QStringList &iconFiles)
for (QString file : iconFiles)
{
QFileInfo fileinfo(file);
if (!fileinfo.isReadable() || !fileinfo.isFile())
if(!fileinfo.isReadable() || !fileinfo.isFile())
continue;
QString target = FS::PathCombine(m_dir.dirName(), fileinfo.fileName());

QFile sourceFile(file);
if(!sourceFile.open(QIODevice::ReadOnly))
continue;

QString suffix = fileinfo.suffix();
if (suffix != "jpeg" && suffix != "png" && suffix != "jpg" && suffix != "ico" && suffix != "svg" && suffix != "gif")
continue;

const QString sourceHash = getIconHash(sourceFile);
QString sourceFileName = fileinfo.baseName().remove("_" + sourceHash).remove(sourceHash);
sourceFileName = QString("%1_%2.%3").arg(sourceFileName, sourceHash, suffix);
QString target = FS::PathCombine(m_dir.dirName(), sourceFileName);

if(QFile::exists(target))
{
QFile targetFile(target);
if(!targetFile.open(QIODevice::ReadOnly))
continue;

const QString targetHash = getIconHash(targetFile);

if(sourceHash == targetHash)
continue;

QString targetFileName = fileinfo.baseName().remove("_" + targetHash).remove(targetHash);
targetFileName = QString("%1_%2.%3").arg(targetFileName, targetHash, suffix);
targetFileName = FS::PathCombine(m_dir.dirName(), targetFileName);
if(!targetFile.rename(targetFileName))
continue;
}
if (!QFile::copy(file, target))
continue;
}
}

void IconList::installIcon(const QString &file, const QString &name)
void IconList::installIcon(const QString &file, QString &name)
{
QFileInfo fileinfo(file);
if(!fileinfo.isReadable() || !fileinfo.isFile())
return;
QFileInfo fileinfo(file);
if(!fileinfo.isReadable() || !fileinfo.isFile())
return;

QFile sourceFile(file);
if(!sourceFile.open(QIODevice::ReadOnly))
return;

QString suffix = fileinfo.suffix();
if (suffix != "jpeg" && suffix != "png" && suffix != "jpg" && suffix != "ico" && suffix != "svg" && suffix != "gif")
return;

const QString sourceHash = getIconHash(sourceFile);
name = name.remove("_" + sourceHash).remove(sourceHash);
name = QString("%1_%2.%3").arg(name, sourceHash, suffix);
QString target = FS::PathCombine(m_dir.dirName(), name);

if(QFile::exists(target))
{
QFile targetFile(target);
if(!targetFile.open(QIODevice::ReadOnly))
return;

const QString targetHash = getIconHash(targetFile);

if(sourceHash == targetHash)
return;

QString targetFileName = QString(name).remove("_" + targetHash).remove(targetHash);
targetFileName = QString("%1_%2.%3").arg(targetFileName, targetHash, suffix);
targetFileName = FS::PathCombine(m_dir.dirName(), targetFileName);
if(!targetFile.rename(targetFileName))
return;
}
if (!QFile::copy(file, target))
return;
}

QString target = FS::PathCombine(m_dir.dirName(), name);
const QString IconList::getIconHash(QFile& file)
{
QByteArray iconByteArray = file.readAll();
const QString iconHash = QString(QCryptographicHash::hash((iconByteArray), QCryptographicHash::Md5).toHex());
return iconHash;
}

QFile::copy(file, target);
const QString IconList::getIconHash(const QString& fileName)
{
QFile file(fileName);
if(!file.open(QIODevice::ReadOnly))
return "";
return getIconHash(file);
}

bool IconList::iconFileExists(const QString &key) const
7 changes: 5 additions & 2 deletions launcher/icons/IconList.h
Original file line number Diff line number Diff line change
@@ -54,10 +54,13 @@ class IconList : public QAbstractListModel, public IIconList
virtual Qt::ItemFlags flags(const QModelIndex &index) const override;

void installIcons(const QStringList &iconFiles) override;
void installIcon(const QString &file, const QString &name) override;

void installIcon(const QString &file, QString &name) override;
const MMCIcon * icon(const QString &key) const;

const QString getIconHash(QFile& file);
const QString getIconHash(const QString& fileName);

void startWatching();
void stopWatching();