mirror of
https://github.com/PrismLauncher/PrismLauncher.git
synced 2026-06-29 01:54:20 +03:00
[Backport release-10.x] Use static image when opengl context is not available (#4519)
This commit is contained in:
commit
79be92ca74
4 changed files with 52 additions and 8 deletions
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -325,3 +325,9 @@ void SkinOpenGLWindow::setElytraVisible(bool visible)
|
|||
if (m_scene)
|
||||
m_scene->setElytraVisible(visible);
|
||||
}
|
||||
|
||||
bool SkinOpenGLWindow::hasOpenGL()
|
||||
{
|
||||
QOpenGLContext ctx;
|
||||
return ctx.create();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue