Use static image when opengl context is not available (#4509)

This commit is contained in:
Alexandru Ionut Tripon
2025-12-18 13:21:00 +02:00
committed by GitHub
4 changed files with 52 additions and 8 deletions

View File

@@ -57,7 +57,12 @@ SkinManageDialog::SkinManageDialog(QWidget* parent, MinecraftAccountPtr acct)
{
m_ui->setupUi(this);
m_skinPreview = new SkinOpenGLWindow(this, palette().color(QPalette::Normal, QPalette::Base));
if (SkinOpenGLWindow::hasOpenGL()) {
m_skinPreview = new SkinOpenGLWindow(this, palette().color(QPalette::Normal, QPalette::Base));
} else {
m_skinPreviewLabel = new QLabel(this);
m_skinPreviewLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
}
setWindowModality(Qt::WindowModal);
@@ -92,7 +97,9 @@ SkinManageDialog::SkinManageDialog(QWidget* parent, MinecraftAccountPtr acct)
connect(contentsWidget->selectionModel(), &QItemSelectionModel::selectionChanged, this, &SkinManageDialog::selectionChanged);
connect(m_ui->listView, &QListView::customContextMenuRequested, this, &SkinManageDialog::show_context_menu);
connect(m_ui->elytraCB, &QCheckBox::stateChanged, this, [this]() {
m_skinPreview->setElytraVisible(m_ui->elytraCB->isChecked());
if (m_skinPreview) {
m_skinPreview->setElytraVisible(m_ui->elytraCB->isChecked());
}
on_capeCombo_currentIndexChanged(0);
});
@@ -103,13 +110,19 @@ SkinManageDialog::SkinManageDialog(QWidget* parent, MinecraftAccountPtr acct)
m_ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel"));
m_ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("OK"));
m_ui->skinLayout->insertWidget(0, QWidget::createWindowContainer(m_skinPreview, this));
if (m_skinPreview) {
m_ui->skinLayout->insertWidget(0, QWidget::createWindowContainer(m_skinPreview, this));
} else {
m_ui->skinLayout->insertWidget(0, m_skinPreviewLabel);
}
}
SkinManageDialog::~SkinManageDialog()
{
delete m_ui;
delete m_skinPreview;
if (m_skinPreview) {
delete m_skinPreview;
}
}
void SkinManageDialog::activated(QModelIndex index)
@@ -131,7 +144,12 @@ void SkinManageDialog::selectionChanged(QItemSelection selected, [[maybe_unused]
if (!skin)
return;
m_skinPreview->updateScene(skin);
if (m_skinPreview) {
m_skinPreview->updateScene(skin);
} else {
m_skinPreviewLabel->setPixmap(
QPixmap::fromImage(skin->getPreview()).scaled(m_skinPreviewLabel->size(), Qt::KeepAspectRatio, Qt::FastTransformation));
}
m_ui->capeCombo->setCurrentIndex(m_capesIdx.value(skin->getCapeId()));
m_ui->steveBtn->setChecked(skin->getModel() == SkinModel::CLASSIC);
m_ui->alexBtn->setChecked(skin->getModel() == SkinModel::SLIM);
@@ -244,10 +262,17 @@ void SkinManageDialog::on_capeCombo_currentIndexChanged(int index)
} else {
m_ui->capeImage->clear();
}
m_skinPreview->updateCape(cape);
if (m_skinPreview) {
m_skinPreview->updateCape(cape);
}
if (auto skin = getSelectedSkin(); skin) {
skin->setCapeId(id.toString());
m_skinPreview->updateScene(skin);
if (m_skinPreview) {
m_skinPreview->updateScene(skin);
} else {
m_skinPreviewLabel->setPixmap(
QPixmap::fromImage(skin->getPreview()).scaled(m_skinPreviewLabel->size(), Qt::KeepAspectRatio, Qt::FastTransformation));
}
}
}
@@ -255,7 +280,12 @@ void SkinManageDialog::on_steveBtn_toggled(bool checked)
{
if (auto skin = getSelectedSkin(); skin) {
skin->setModel(checked ? SkinModel::CLASSIC : SkinModel::SLIM);
m_skinPreview->updateScene(skin);
if (m_skinPreview) {
m_skinPreview->updateScene(skin);
} else {
m_skinPreviewLabel->setPixmap(
QPixmap::fromImage(skin->getPreview()).scaled(m_skinPreviewLabel->size(), Qt::KeepAspectRatio, Qt::FastTransformation));
}
}
}
@@ -545,6 +575,10 @@ void SkinManageDialog::resizeEvent(QResizeEvent* event)
} else {
m_ui->capeImage->clear();
}
if (auto skin = getSelectedSkin(); skin && !m_skinPreview) {
m_skinPreviewLabel->setPixmap(
QPixmap::fromImage(skin->getPreview()).scaled(m_skinPreviewLabel->size(), Qt::KeepAspectRatio, Qt::FastTransformation));
}
}
SkinModel* SkinManageDialog::getSelectedSkin()

View File

@@ -20,6 +20,7 @@
#include <QDialog>
#include <QItemSelection>
#include <QLabel>
#include <QPixmap>
#include "minecraft/auth/MinecraftAccount.h"
@@ -68,4 +69,5 @@ class SkinManageDialog : public QDialog, public SkinProvider {
QHash<QString, QImage> m_capes;
QHash<QString, int> m_capesIdx;
SkinOpenGLWindow* m_skinPreview = nullptr;
QLabel* m_skinPreviewLabel = nullptr;
};

View File

@@ -325,3 +325,9 @@ void SkinOpenGLWindow::setElytraVisible(bool visible)
if (m_scene)
m_scene->setElytraVisible(visible);
}
bool SkinOpenGLWindow::hasOpenGL()
{
QOpenGLContext ctx;
return ctx.create();
}

View File

@@ -45,6 +45,8 @@ class SkinOpenGLWindow : public QOpenGLWindow, protected QOpenGLFunctions {
void updateCape(const QImage& cape);
void setElytraVisible(bool visible);
static bool hasOpenGL();
protected:
void mousePressEvent(QMouseEvent* e) override;
void mouseReleaseEvent(QMouseEvent* e) override;