mirror of
https://github.com/MultiMC/MultiMC5.git
synced 2025-03-14 13:20:59 +00:00
GH-5560 fix issues with handling slim skins
This actually dumbs down detection of skins that would be broken as 'Classic' skins, but maybe we can do that better later.
This commit is contained in:
parent
9e4da6399c
commit
9352c7336c
@ -18,15 +18,7 @@ namespace Skins {
|
||||
SkinEntry::SkinEntry(const QString& name, const QString& path, const QImage& image, const QString& textureID, const QByteArray data) : name(name), filename(path)
|
||||
{
|
||||
internal = false;
|
||||
if (qAlpha(image.pixel(54, 20)) == 0)
|
||||
{
|
||||
// slim-only textures will have this pixel fully transparent
|
||||
slimVariant = SkinData{data, image, textureID};
|
||||
}
|
||||
else
|
||||
{
|
||||
classicVariant = SkinData{data, image, textureID};
|
||||
}
|
||||
fileVariant = SkinData{data, image, textureID};
|
||||
}
|
||||
|
||||
SkinEntry::SkinEntry(const QString& name, const QString& pathSlim, const QString& pathClassic): name(name)
|
||||
@ -56,73 +48,59 @@ SkinEntry::SkinEntry(const QString& name, const QString& pathSlim, const QString
|
||||
|
||||
const QImage& SkinEntry::getTextureFor(Model model) const
|
||||
{
|
||||
switch(model)
|
||||
if(internal)
|
||||
{
|
||||
case Model::Slim:
|
||||
switch(model)
|
||||
{
|
||||
if(slimVariant)
|
||||
{
|
||||
case Model::Slim:
|
||||
return slimVariant->texture;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case Model::Classic:
|
||||
{
|
||||
if(classicVariant)
|
||||
{
|
||||
case Model::Classic:
|
||||
return classicVariant->texture;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if(fileVariant)
|
||||
{
|
||||
return fileVariant->texture;
|
||||
}
|
||||
return nullImage;
|
||||
}
|
||||
|
||||
QString Skins::SkinEntry::getTextureIDFor(Model model) const
|
||||
{
|
||||
switch(model)
|
||||
if(internal)
|
||||
{
|
||||
case Model::Slim:
|
||||
switch(model)
|
||||
{
|
||||
if(slimVariant)
|
||||
{
|
||||
case Model::Slim:
|
||||
return slimVariant->textureID;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case Model::Classic:
|
||||
{
|
||||
if(classicVariant)
|
||||
{
|
||||
case Model::Classic:
|
||||
return classicVariant->textureID;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if(fileVariant)
|
||||
{
|
||||
return fileVariant->textureID;
|
||||
}
|
||||
return QString();
|
||||
}
|
||||
|
||||
QByteArray Skins::SkinEntry::getTextureDataFor(Model model) const
|
||||
{
|
||||
switch(model)
|
||||
if(internal)
|
||||
{
|
||||
case Model::Slim:
|
||||
switch(model)
|
||||
{
|
||||
if(slimVariant)
|
||||
{
|
||||
case Model::Slim:
|
||||
return slimVariant->data;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case Model::Classic:
|
||||
{
|
||||
if(classicVariant)
|
||||
{
|
||||
case Model::Classic:
|
||||
return classicVariant->data;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if(fileVariant)
|
||||
return fileVariant->data;
|
||||
return QByteArray();
|
||||
}
|
||||
|
||||
@ -251,47 +229,39 @@ const QImage & SkinData::getListTexture(Model model) const
|
||||
|
||||
const QImage & SkinEntry::getListTexture() const
|
||||
{
|
||||
if(slimVariant)
|
||||
if(internal)
|
||||
{
|
||||
return slimVariant->getListTexture(Model::Slim);
|
||||
}
|
||||
else if(classicVariant)
|
||||
|
||||
if(fileVariant)
|
||||
{
|
||||
return classicVariant->getListTexture(Model::Classic);
|
||||
return fileVariant->getListTexture(Model::Classic);
|
||||
}
|
||||
return nullImage;
|
||||
}
|
||||
|
||||
bool SkinEntry::hasModel(Model model) const
|
||||
bool SkinEntry::matchesId(const QString& textureID) const
|
||||
{
|
||||
switch(model)
|
||||
if(internal)
|
||||
{
|
||||
case Model::Slim:
|
||||
if(slimVariant && slimVariant->textureID == textureID)
|
||||
{
|
||||
return !!slimVariant;
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case Model::Classic:
|
||||
if(classicVariant && classicVariant->textureID == textureID)
|
||||
{
|
||||
return !!classicVariant;
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
return false;
|
||||
}
|
||||
|
||||
if(fileVariant && fileVariant->textureID == textureID)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
nonstd::optional<Model> SkinEntry::matchesId(const QString& textureID) const
|
||||
{
|
||||
if(slimVariant && slimVariant->textureID == textureID)
|
||||
{
|
||||
return Model::Slim;
|
||||
}
|
||||
if(classicVariant && classicVariant->textureID == textureID)
|
||||
{
|
||||
return Model::Classic;
|
||||
}
|
||||
return nonstd::nullopt;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@ -40,23 +40,25 @@ struct SkinEntry
|
||||
SkinEntry(const QString& name, const QString& pathSlim, const QString& pathClassic);
|
||||
SkinEntry() {};
|
||||
|
||||
nonstd::optional<Model> matchesId(const QString& textureID) const;
|
||||
bool matchesId(const QString& textureID) const;
|
||||
bool isNull() const
|
||||
{
|
||||
return !slimVariant && !classicVariant;
|
||||
if(internal)
|
||||
return !slimVariant && !classicVariant;
|
||||
return !fileVariant;
|
||||
}
|
||||
|
||||
const QImage& getListTexture() const;
|
||||
const QImage& getTextureFor(Model model) const;
|
||||
QString getTextureIDFor(Model model) const;
|
||||
QByteArray getTextureDataFor(Model model) const;
|
||||
bool hasModel(Model model) const;
|
||||
|
||||
bool internal = false;
|
||||
QString name;
|
||||
QString filename;
|
||||
nonstd::optional<SkinData> slimVariant;
|
||||
nonstd::optional<SkinData> classicVariant;
|
||||
nonstd::optional<SkinData> fileVariant;
|
||||
};
|
||||
|
||||
struct CapeEntry
|
||||
|
@ -470,7 +470,7 @@ const Skins::SkinEntry & SkinsModel::skinEntryByTextureID(const QString& texture
|
||||
{
|
||||
for(const auto& entry: m_skins)
|
||||
{
|
||||
if(entry.matchesId(textureID) != nonstd::nullopt)
|
||||
if(entry.matchesId(textureID))
|
||||
{
|
||||
return entry;
|
||||
}
|
||||
|
@ -219,7 +219,6 @@ void AccountsDialog::revertEdits()
|
||||
m_skinEdit = nonstd::nullopt;
|
||||
ui->btnApplyChanges->setEnabled(false);
|
||||
ui->btnResetChanges->setEnabled(false);
|
||||
updateModelToMatchSkin();
|
||||
updateSkinDisplay();
|
||||
}
|
||||
|
||||
@ -285,7 +284,6 @@ void AccountsDialog::editSkin(const Skins::SkinEntry& newEntry)
|
||||
return;
|
||||
|
||||
m_skinEdit->skinEntry = newEntry;
|
||||
updateModelToMatchSkin();
|
||||
updateSkinDisplay();
|
||||
}
|
||||
|
||||
@ -442,44 +440,9 @@ void AccountsDialog::updateStates()
|
||||
(!maybeEntry.isNull()) ? maybeEntry : Skins::SkinEntry("player", "", image, textureID, playerSkinData)
|
||||
};
|
||||
|
||||
updateModelToMatchSkin();
|
||||
updateSkinDisplay();
|
||||
}
|
||||
|
||||
void AccountsDialog::updateModelToMatchSkin()
|
||||
{
|
||||
auto& skinEntry = effectiveSkin();
|
||||
auto model = effectiveModel();
|
||||
bool hasClassic = skinEntry.hasModel(Skins::Model::Classic);
|
||||
bool hasSlim = skinEntry.hasModel(Skins::Model::Slim);
|
||||
|
||||
if(m_skinEdit)
|
||||
{
|
||||
if(model == Skins::Model::Classic && !hasClassic)
|
||||
{
|
||||
m_skinEdit->model = Skins::Model::Slim;
|
||||
ui->radioSlim->setChecked(true);
|
||||
}
|
||||
if(model == Skins::Model::Slim && !hasSlim)
|
||||
{
|
||||
m_skinEdit->model = Skins::Model::Classic;
|
||||
ui->radioClassic->setChecked(true);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(model == Skins::Model::Classic && !hasClassic)
|
||||
{
|
||||
ui->radioSlim->setChecked(true);
|
||||
}
|
||||
if(model == Skins::Model::Slim && !hasSlim)
|
||||
{
|
||||
ui->radioClassic->setChecked(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void AccountsDialog::updateSkinDisplay()
|
||||
{
|
||||
QImage capeImage;
|
||||
@ -492,10 +455,6 @@ void AccountsDialog::updateSkinDisplay()
|
||||
auto& skin = effectiveSkin();
|
||||
auto model = effectiveModel();
|
||||
|
||||
bool hasClassic = skin.hasModel(Skins::Model::Classic);
|
||||
bool hasSlim = skin.hasModel(Skins::Model::Slim);
|
||||
ui->radioClassic->setEnabled(hasClassic);
|
||||
ui->radioSlim->setEnabled(hasSlim);
|
||||
auto textureID = skin.getTextureIDFor(model);
|
||||
ui->saveSkinButton->setEnabled(m_skinsModel->skinEntryByTextureID(textureID).isNull());
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user