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:
Petr Mrázek 2025-01-15 02:41:10 +01:00
parent 9e4da6399c
commit 9352c7336c
4 changed files with 48 additions and 117 deletions

View File

@ -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;
}
}

View File

@ -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

View File

@ -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;
}

View File

@ -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());