From 177e7b272ba85f1eb25e13e26db1ac98de6b6d8c Mon Sep 17 00:00:00 2001 From: Trial97 Date: Tue, 16 Dec 2025 13:36:28 +0200 Subject: [PATCH 1/2] Use static image when opengl context is not available Signed-off-by: Trial97 --- .../ui/dialogs/skins/SkinManageDialog.cpp | 51 ++++++++++++++++--- launcher/ui/dialogs/skins/SkinManageDialog.h | 2 + .../dialogs/skins/draw/SkinOpenGLWindow.cpp | 6 +++ .../ui/dialogs/skins/draw/SkinOpenGLWindow.h | 2 + 4 files changed, 53 insertions(+), 8 deletions(-) diff --git a/launcher/ui/dialogs/skins/SkinManageDialog.cpp b/launcher/ui/dialogs/skins/SkinManageDialog.cpp index cecde236a..f127aca1e 100644 --- a/launcher/ui/dialogs/skins/SkinManageDialog.cpp +++ b/launcher/ui/dialogs/skins/SkinManageDialog.cpp @@ -21,6 +21,7 @@ #include "ui_SkinManageDialog.h" #include +#include #include #include #include @@ -57,7 +58,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 +98,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 +111,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 +145,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 +263,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 +281,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 +576,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() diff --git a/launcher/ui/dialogs/skins/SkinManageDialog.h b/launcher/ui/dialogs/skins/SkinManageDialog.h index c6a6c9fcd..27bdb93a8 100644 --- a/launcher/ui/dialogs/skins/SkinManageDialog.h +++ b/launcher/ui/dialogs/skins/SkinManageDialog.h @@ -20,6 +20,7 @@ #include #include +#include #include #include "minecraft/auth/MinecraftAccount.h" @@ -68,4 +69,5 @@ class SkinManageDialog : public QDialog, public SkinProvider { QHash m_capes; QHash m_capesIdx; SkinOpenGLWindow* m_skinPreview = nullptr; + QLabel* m_skinPreviewLabel = nullptr; }; diff --git a/launcher/ui/dialogs/skins/draw/SkinOpenGLWindow.cpp b/launcher/ui/dialogs/skins/draw/SkinOpenGLWindow.cpp index 962717a30..169d33819 100644 --- a/launcher/ui/dialogs/skins/draw/SkinOpenGLWindow.cpp +++ b/launcher/ui/dialogs/skins/draw/SkinOpenGLWindow.cpp @@ -325,3 +325,9 @@ void SkinOpenGLWindow::setElytraVisible(bool visible) if (m_scene) m_scene->setElytraVisible(visible); } + +bool SkinOpenGLWindow::hasOpenGL() +{ + QOpenGLContext ctx; + return ctx.create(); +} diff --git a/launcher/ui/dialogs/skins/draw/SkinOpenGLWindow.h b/launcher/ui/dialogs/skins/draw/SkinOpenGLWindow.h index 7b88fca9c..6ddc345cf 100644 --- a/launcher/ui/dialogs/skins/draw/SkinOpenGLWindow.h +++ b/launcher/ui/dialogs/skins/draw/SkinOpenGLWindow.h @@ -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; From 3c570f9e9c5d418f265927e64f117dfafb39eb28 Mon Sep 17 00:00:00 2001 From: Alexandru Ionut Tripon Date: Tue, 16 Dec 2025 20:56:41 +0200 Subject: [PATCH 2/2] Update launcher/ui/dialogs/skins/SkinManageDialog.cpp Signed-off-by: Alexandru Ionut Tripon --- launcher/ui/dialogs/skins/SkinManageDialog.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/launcher/ui/dialogs/skins/SkinManageDialog.cpp b/launcher/ui/dialogs/skins/SkinManageDialog.cpp index f127aca1e..d2b6a83e3 100644 --- a/launcher/ui/dialogs/skins/SkinManageDialog.cpp +++ b/launcher/ui/dialogs/skins/SkinManageDialog.cpp @@ -21,7 +21,6 @@ #include "ui_SkinManageDialog.h" #include -#include #include #include #include