Files
QtGameMaker/dialogs/spritepropertiesdialog.cpp
T

244 lines
8.1 KiB
C++
Raw Normal View History

2022-01-09 06:42:13 +01:00
#include "spritepropertiesdialog.h"
#include "ui_spritepropertiesdialog.h"
#include <QFileDialog>
#include <QDebug>
#include <QMessageBox>
#include <QSignalBlocker>
2022-01-09 06:42:13 +01:00
#include "projectcontainer.h"
#include "models/projecttreemodel.h"
2022-01-09 06:42:13 +01:00
#include "editspritedialog.h"
2022-01-10 21:49:06 +01:00
#include "maskpropertiesdialog.h"
2022-01-09 06:42:13 +01:00
SpritePropertiesDialog::SpritePropertiesDialog(Sprite &sprite, ProjectTreeModel &projectModel, QWidget *parent) :
2022-01-09 06:42:13 +01:00
QDialog{parent},
m_ui{std::make_unique<Ui::SpritePropertiesDialog>()},
m_sprite{sprite},
2022-01-10 21:49:06 +01:00
m_projectModel{projectModel},
m_pixmaps{m_sprite.pixmaps}
2022-01-09 06:42:13 +01:00
{
m_ui->setupUi(this);
updateTitle();
if (auto button = m_ui->buttonBox->button(QDialogButtonBox::Ok))
button->setIcon(QIcon{":/qtgameengine/icons/ok.png"});
if (auto button = m_ui->buttonBox->button(QDialogButtonBox::Cancel))
button->setIcon(QIcon{":/qtgameengine/icons/delete.png"});
2022-01-09 06:42:13 +01:00
m_ui->lineEditName->setText(m_sprite.name);
updateSpriteInfo();
2022-01-09 06:42:13 +01:00
m_ui->spinBoxOriginX->setValue(m_sprite.origin.x);
m_ui->spinBoxOriginY->setValue(m_sprite.origin.y);
m_ui->checkBoxPreciseCollisionChecking->setChecked(m_sprite.preciseCollisionChecking);
m_ui->checkBoxSeparateCollisionMasks->setChecked(m_sprite.separateCollisionMasks);
connect(&m_projectModel, &ProjectTreeModel::spriteNameChanged,
this, &SpritePropertiesDialog::spriteNameChanged);
2022-01-11 02:35:26 +01:00
connect(m_ui->pushButtonLoad, &QAbstractButton::clicked,
2022-01-09 06:42:13 +01:00
this, &SpritePropertiesDialog::loadSprite);
2022-01-11 02:35:26 +01:00
connect(m_ui->pushButtonSave, &QAbstractButton::clicked,
2022-01-09 06:42:13 +01:00
this, &SpritePropertiesDialog::saveSprite);
2022-01-11 02:35:26 +01:00
connect(m_ui->pushButtonEdit, &QAbstractButton::clicked,
2022-01-09 06:42:13 +01:00
this, &SpritePropertiesDialog::editSprite);
2022-01-11 02:35:26 +01:00
connect(m_ui->pushButtonCenterOrigin, &QAbstractButton::clicked,
2022-01-09 06:42:13 +01:00
this, &SpritePropertiesDialog::centerOrigin);
2022-01-11 02:35:26 +01:00
connect(m_ui->pushButtonModifyCollisionmask, &QAbstractButton::clicked,
2022-01-10 21:49:06 +01:00
this, &SpritePropertiesDialog::modifyMask);
2022-01-09 06:42:13 +01:00
connect(m_ui->lineEditName, &QLineEdit::textChanged,
this, &SpritePropertiesDialog::changed);
connect(m_ui->spinBoxOriginX, &QSpinBox::valueChanged,
this, &SpritePropertiesDialog::changed);
connect(m_ui->spinBoxOriginY, &QSpinBox::valueChanged,
this, &SpritePropertiesDialog::changed);
connect(m_ui->checkBoxPreciseCollisionChecking, &QCheckBox::stateChanged,
this, &SpritePropertiesDialog::changed);
connect(m_ui->checkBoxSeparateCollisionMasks, &QCheckBox::stateChanged,
this, &SpritePropertiesDialog::changed);
}
SpritePropertiesDialog::~SpritePropertiesDialog() = default;
void SpritePropertiesDialog::accept()
{
2022-01-10 21:49:06 +01:00
if (!m_unsavedChanges)
{
QDialog::reject();
return;
}
2022-01-09 06:42:13 +01:00
if (m_sprite.name != m_ui->lineEditName->text())
{
if (!m_projectModel.rename<Sprite>(m_sprite, m_ui->lineEditName->text()))
{
QMessageBox::critical(this, tr("Renaming Sprite failed!"), tr("Renaming Sprite failed!"));
return;
}
2022-01-09 06:42:13 +01:00
}
2022-01-14 23:01:20 +01:00
if (!m_projectModel.setSpritePixmaps(m_sprite, std::move(m_pixmaps)))
{
QMessageBox::critical(this, tr("Setting Sprite pixmaps failed!"), tr("Setting Sprite pixmaps failed!"));
return;
}
2022-01-09 06:42:13 +01:00
m_sprite.origin.x = m_ui->spinBoxOriginX->value();
m_sprite.origin.y = m_ui->spinBoxOriginY->value();
m_sprite.preciseCollisionChecking = m_ui->checkBoxPreciseCollisionChecking->isChecked();
m_sprite.separateCollisionMasks = m_ui->checkBoxSeparateCollisionMasks->isChecked();
QDialog::accept();
}
void SpritePropertiesDialog::reject()
{
if (!m_unsavedChanges)
{
QDialog::reject();
return;
}
const auto result = QMessageBox::warning(
this,
tr("The Sprite has been modified."),
tr("Do you want to save your changes?"),
QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel,
QMessageBox::Save
);
switch (result)
{
case QMessageBox::Save:
accept();
return;
case QMessageBox::Discard:
QDialog::reject();
return;
case QMessageBox::Cancel:
return;
default:
qWarning() << "unexpected dialog result" << result;
}
}
void SpritePropertiesDialog::loadSprite()
{
2022-01-14 23:01:20 +01:00
const auto path = QFileDialog::getOpenFileName(this, tr("Open a Sprite Image..."), {},
QStringLiteral("%0 (*.png);;%1 (*.bmp);;%2 (*.tiff);;%3 (*.jpg *.jpeg);;%4 (*)")
.arg(tr("PNG Files"))
.arg(tr("BMP Files"))
.arg(tr("TIFF Files"))
.arg(tr("JPEG Files"))
.arg(tr("All Files"))
);
2022-01-09 21:07:41 +01:00
if (path.isEmpty())
return;
QPixmap pixmap;
if (!pixmap.load(path))
{
QMessageBox::warning(this, tr("Could not load sprite!"), tr("Could not load sprite!"));
return;
}
2022-01-10 21:49:06 +01:00
m_pixmaps = std::vector<QPixmap>{ std::move(pixmap) };
changed();
updateSpriteInfo();
2022-01-09 06:42:13 +01:00
}
void SpritePropertiesDialog::saveSprite()
{
2022-01-10 21:49:06 +01:00
if (m_pixmaps.empty() || m_pixmaps.front().isNull())
2022-01-09 21:07:41 +01:00
{
QMessageBox::warning(this, tr("No sprites available to save!"), tr("No sprites available to save!"));
return;
}
2022-01-14 23:01:20 +01:00
const auto path = QFileDialog::getSaveFileName(this, tr("Save a Sprite Image..."), m_sprite.name + ".png",
QStringLiteral("%0 (*.png);;%1 (*.bmp);;%2 (*.tiff);;%3 (*.jpg *.jpeg);;%4 (*)")
.arg(tr("PNG Files"))
.arg(tr("BMP Files"))
.arg(tr("TIFF Files"))
.arg(tr("JPEG Files"))
.arg(tr("All Files"))
);
2022-01-09 21:07:41 +01:00
if (path.isEmpty())
return;
2022-01-10 21:49:06 +01:00
if (!m_pixmaps.front().save(path))
2022-01-09 21:07:41 +01:00
{
QMessageBox::warning(this, tr("Could not save Sprite!"), tr("Could not save Sprite!"));
2022-01-09 21:07:41 +01:00
return;
}
2022-01-09 06:42:13 +01:00
}
void SpritePropertiesDialog::editSprite()
{
2022-01-10 21:49:06 +01:00
EditSpriteDialog dialog{m_pixmaps, m_sprite.name, this};
if (dialog.exec() == QDialog::Accepted)
{
m_pixmaps = dialog.pixmaps();
changed();
updateSpriteInfo();
}
2022-01-09 06:42:13 +01:00
}
void SpritePropertiesDialog::centerOrigin()
{
2022-01-10 21:49:06 +01:00
if (m_pixmaps.empty() || m_pixmaps.front().isNull())
2022-01-09 06:42:13 +01:00
{
qDebug() << "unexpected empty pixmaps";
2022-01-10 21:49:06 +01:00
m_ui->spinBoxOriginX->setValue(0);
m_ui->spinBoxOriginY->setValue(0);
2022-01-09 06:42:13 +01:00
return;
}
2022-01-10 21:49:06 +01:00
m_ui->spinBoxOriginX->setValue(m_pixmaps.front().width() / 2);
m_ui->spinBoxOriginY->setValue(m_pixmaps.front().height() / 2);
}
void SpritePropertiesDialog::modifyMask()
{
MaskPropertiesDialog dialog{this};
dialog.exec();
2022-01-09 06:42:13 +01:00
}
void SpritePropertiesDialog::changed()
{
if (!m_unsavedChanges)
{
m_unsavedChanges = true;
2022-01-09 21:07:41 +01:00
updateTitle();
2022-01-09 06:42:13 +01:00
}
}
2022-01-09 21:07:41 +01:00
void SpritePropertiesDialog::spriteNameChanged(const Sprite &sprite)
{
if (&sprite != &m_sprite)
return;
{
QSignalBlocker blocker{m_ui->lineEditName};
m_ui->lineEditName->setText(sprite.name);
}
updateTitle();
}
2022-01-09 21:07:41 +01:00
void SpritePropertiesDialog::updateTitle()
{
setWindowTitle(tr("Sprite Properties: %0%1")
.arg(m_sprite.name)
.arg(m_unsavedChanges ? tr("*") : QString{})
);
}
void SpritePropertiesDialog::updateSpriteInfo()
{
2022-01-10 21:49:06 +01:00
m_ui->labelPreview->setPixmap(m_pixmaps.empty() ? QPixmap{} : m_pixmaps.front());
m_ui->labelWidth->setText(tr("Width: %0").arg(m_pixmaps.empty() ? tr("n/a") : QString::number(m_pixmaps.front().width())));
m_ui->labelHeight->setText(tr("Height: %0").arg(m_pixmaps.empty() ? tr("n/a") : QString::number(m_pixmaps.front().height())));
m_ui->labelSubimages->setText(tr("Number of subimages: %0").arg(m_pixmaps.size()));
}