Use static image when opengl context is not available (#4509)
This commit is contained in:
@@ -57,7 +57,12 @@ SkinManageDialog::SkinManageDialog(QWidget* parent, MinecraftAccountPtr acct)
|
|||||||
{
|
{
|
||||||
m_ui->setupUi(this);
|
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);
|
setWindowModality(Qt::WindowModal);
|
||||||
|
|
||||||
@@ -92,7 +97,9 @@ SkinManageDialog::SkinManageDialog(QWidget* parent, MinecraftAccountPtr acct)
|
|||||||
connect(contentsWidget->selectionModel(), &QItemSelectionModel::selectionChanged, this, &SkinManageDialog::selectionChanged);
|
connect(contentsWidget->selectionModel(), &QItemSelectionModel::selectionChanged, this, &SkinManageDialog::selectionChanged);
|
||||||
connect(m_ui->listView, &QListView::customContextMenuRequested, this, &SkinManageDialog::show_context_menu);
|
connect(m_ui->listView, &QListView::customContextMenuRequested, this, &SkinManageDialog::show_context_menu);
|
||||||
connect(m_ui->elytraCB, &QCheckBox::stateChanged, this, [this]() {
|
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);
|
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::Cancel)->setText(tr("Cancel"));
|
||||||
m_ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("OK"));
|
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()
|
SkinManageDialog::~SkinManageDialog()
|
||||||
{
|
{
|
||||||
delete m_ui;
|
delete m_ui;
|
||||||
delete m_skinPreview;
|
if (m_skinPreview) {
|
||||||
|
delete m_skinPreview;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SkinManageDialog::activated(QModelIndex index)
|
void SkinManageDialog::activated(QModelIndex index)
|
||||||
@@ -131,7 +144,12 @@ void SkinManageDialog::selectionChanged(QItemSelection selected, [[maybe_unused]
|
|||||||
if (!skin)
|
if (!skin)
|
||||||
return;
|
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->capeCombo->setCurrentIndex(m_capesIdx.value(skin->getCapeId()));
|
||||||
m_ui->steveBtn->setChecked(skin->getModel() == SkinModel::CLASSIC);
|
m_ui->steveBtn->setChecked(skin->getModel() == SkinModel::CLASSIC);
|
||||||
m_ui->alexBtn->setChecked(skin->getModel() == SkinModel::SLIM);
|
m_ui->alexBtn->setChecked(skin->getModel() == SkinModel::SLIM);
|
||||||
@@ -244,10 +262,17 @@ void SkinManageDialog::on_capeCombo_currentIndexChanged(int index)
|
|||||||
} else {
|
} else {
|
||||||
m_ui->capeImage->clear();
|
m_ui->capeImage->clear();
|
||||||
}
|
}
|
||||||
m_skinPreview->updateCape(cape);
|
if (m_skinPreview) {
|
||||||
|
m_skinPreview->updateCape(cape);
|
||||||
|
}
|
||||||
if (auto skin = getSelectedSkin(); skin) {
|
if (auto skin = getSelectedSkin(); skin) {
|
||||||
skin->setCapeId(id.toString());
|
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) {
|
if (auto skin = getSelectedSkin(); skin) {
|
||||||
skin->setModel(checked ? SkinModel::CLASSIC : SkinModel::SLIM);
|
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 {
|
} else {
|
||||||
m_ui->capeImage->clear();
|
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()
|
SkinModel* SkinManageDialog::getSelectedSkin()
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
|
|
||||||
#include <QDialog>
|
#include <QDialog>
|
||||||
#include <QItemSelection>
|
#include <QItemSelection>
|
||||||
|
#include <QLabel>
|
||||||
#include <QPixmap>
|
#include <QPixmap>
|
||||||
|
|
||||||
#include "minecraft/auth/MinecraftAccount.h"
|
#include "minecraft/auth/MinecraftAccount.h"
|
||||||
@@ -68,4 +69,5 @@ class SkinManageDialog : public QDialog, public SkinProvider {
|
|||||||
QHash<QString, QImage> m_capes;
|
QHash<QString, QImage> m_capes;
|
||||||
QHash<QString, int> m_capesIdx;
|
QHash<QString, int> m_capesIdx;
|
||||||
SkinOpenGLWindow* m_skinPreview = nullptr;
|
SkinOpenGLWindow* m_skinPreview = nullptr;
|
||||||
|
QLabel* m_skinPreviewLabel = nullptr;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -325,3 +325,9 @@ void SkinOpenGLWindow::setElytraVisible(bool visible)
|
|||||||
if (m_scene)
|
if (m_scene)
|
||||||
m_scene->setElytraVisible(visible);
|
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 updateCape(const QImage& cape);
|
||||||
void setElytraVisible(bool visible);
|
void setElytraVisible(bool visible);
|
||||||
|
|
||||||
|
static bool hasOpenGL();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void mousePressEvent(QMouseEvent* e) override;
|
void mousePressEvent(QMouseEvent* e) override;
|
||||||
void mouseReleaseEvent(QMouseEvent* e) override;
|
void mouseReleaseEvent(QMouseEvent* e) override;
|
||||||
|
|||||||
Reference in New Issue
Block a user