Implemented lots of actions in EditSpriteDialog

This commit is contained in:
2025-11-30 00:13:00 +01:00
parent 1d3d391842
commit 7d1c2c7d15
6 changed files with 249 additions and 11 deletions
+17
View File
@@ -1,6 +1,7 @@
#include "createspritedialog.h"
#include "ui_createspritedialog.h"
#include <QMessageBox>
#include <QPushButton>
#include "editorguiutils.h"
@@ -32,3 +33,19 @@ QSize CreateSpriteDialog::spriteSize() const
{
return QSize{m_ui->spinBoxWidth->value(), m_ui->spinBoxHeight->value()};
}
void CreateSpriteDialog::accept()
{
const auto size = spriteSize();
if (size.width() < 1)
{
QMessageBox::warning(this, tr("Zero width not possible!"), tr("Zero width not possible!"));
return;
}
if (size.height() < 1)
{
QMessageBox::warning(this, tr("Zero height not possible!"), tr("Zero height not possible!"));
return;
}
QDialog::accept();
}
+3
View File
@@ -17,6 +17,9 @@ public:
QSize spriteSize() const;
public slots:
void accept() override;
private:
const std::unique_ptr<Ui::CreateSpriteDialog> m_ui;
};
+7 -4
View File
@@ -19,7 +19,7 @@
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -54,7 +54,7 @@
<item row="0" column="1">
<widget class="QSpinBox" name="spinBoxWidth">
<property name="minimum">
<number>0</number>
<number>1</number>
</property>
<property name="maximum">
<number>2147483647</number>
@@ -66,6 +66,9 @@
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="spinBoxHeight">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>2147483647</number>
</property>
@@ -81,10 +84,10 @@
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
<set>QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok</set>
</property>
</widget>
</item>
+203 -6
View File
@@ -53,6 +53,30 @@ EditSpriteDialog::EditSpriteDialog(const std::vector<QPixmap> &pixmaps, const QS
this, &EditSpriteDialog::createFromStrip);
connect(m_ui->actionAddFromStrip, &QAction::triggered,
this, &EditSpriteDialog::addFromStrip);
connect(m_ui->actionUndo, &QAction::triggered,
this, &EditSpriteDialog::undo);
connect(m_ui->actionRedo, &QAction::triggered,
this, &EditSpriteDialog::redo);
connect(m_ui->actionCut, &QAction::triggered,
this, &EditSpriteDialog::cut);
connect(m_ui->actionCopy, &QAction::triggered,
this, &EditSpriteDialog::copy);
connect(m_ui->actionPaste, &QAction::triggered,
this, &EditSpriteDialog::paste);
connect(m_ui->actionErase, &QAction::triggered,
this, &EditSpriteDialog::erase);
connect(m_ui->actionDelete, &QAction::triggered,
this, &EditSpriteDialog::delete_);
connect(m_ui->actionMoveLeft, &QAction::triggered,
this, &EditSpriteDialog::moveLeft);
connect(m_ui->actionMoveRight, &QAction::triggered,
this, &EditSpriteDialog::moveRight);
connect(m_ui->actionAddEmpty, &QAction::triggered,
this, &EditSpriteDialog::addEmpty);
connect(m_ui->actionInsertEmpty, &QAction::triggered,
this, &EditSpriteDialog::insertEmpty);
connect(m_ui->actionEdit, &QAction::triggered,
this, &EditSpriteDialog::edit);
connect(m_ui->actionSetTransparencyBackground, &QAction::triggered,
this, &EditSpriteDialog::transparentBackgroundSettings);
@@ -60,7 +84,13 @@ EditSpriteDialog::EditSpriteDialog(const std::vector<QPixmap> &pixmaps, const QS
this, &EditSpriteDialog::activated);
connect(m_ui->listView->selectionModel(), &QItemSelectionModel::currentChanged,
this, &EditSpriteDialog::currentChanged);
currentChanged(m_ui->listView->currentIndex());
connect(m_model.get(), &QAbstractItemModel::rowsInserted,
this, &EditSpriteDialog::currentChanged);
connect(m_model.get(), &QAbstractItemModel::rowsMoved,
this, &EditSpriteDialog::currentChanged);
connect(m_model.get(), &QAbstractItemModel::rowsRemoved,
this, &EditSpriteDialog::currentChanged);
currentChanged();
}
EditSpriteDialog::~EditSpriteDialog() = default;
@@ -158,17 +188,18 @@ void EditSpriteDialog::addFromFile()
void EditSpriteDialog::saveAsPng()
{
auto index = m_ui->listView->currentIndex();
const auto index = m_ui->listView->currentIndex();
if (!index.isValid())
return;
if (index.row() < 0 || (size_t)index.row() >= m_pixmaps.size())
const int row = index.row();
if (row < 0 || size_t(row) >= m_pixmaps.size())
{
qWarning() << "invalid row" << index.row();
qWarning() << "invalid row" << row;
return;
}
const auto &pixmap = m_pixmaps[index.row()];
const auto &pixmap = m_pixmaps[row];
if (pixmap.isNull())
{
QMessageBox::warning(this, tr("Invalid sprite!"), tr("The sprite you tried to save is invalid!"));
@@ -188,6 +219,166 @@ void EditSpriteDialog::addFromStrip()
QMessageBox::warning(this, tr("Not yet implemented"), tr("Not yet implemented"));
}
void EditSpriteDialog::undo()
{
QMessageBox::warning(this, tr("Not yet implemented"), tr("Not yet implemented"));
}
void EditSpriteDialog::redo()
{
QMessageBox::warning(this, tr("Not yet implemented"), tr("Not yet implemented"));
}
void EditSpriteDialog::cut()
{
QMessageBox::warning(this, tr("Not yet implemented"), tr("Not yet implemented"));
}
void EditSpriteDialog::copy()
{
QMessageBox::warning(this, tr("Not yet implemented"), tr("Not yet implemented"));
}
void EditSpriteDialog::paste()
{
QMessageBox::warning(this, tr("Not yet implemented"), tr("Not yet implemented"));
}
void EditSpriteDialog::erase()
{
QMessageBox::warning(this, tr("Not yet implemented"), tr("Not yet implemented"));
}
void EditSpriteDialog::delete_()
{
const auto index = m_ui->listView->currentIndex();
if (!index.isValid())
return;
const int row = index.row();
if (row < 0 || size_t(row) >= m_pixmaps.size())
{
qWarning() << "unexpected row" << row;
return;
}
m_model->beginRemoveRows({}, row, row);
m_pixmaps.erase(std::begin(m_pixmaps) + row);
m_model->endRemoveRows();
changed();
}
void EditSpriteDialog::moveLeft()
{
const auto index = m_ui->listView->currentIndex();
if (!index.isValid())
return;
const size_t row = index.row();
if (row < 1 || row >= m_pixmaps.size())
{
qWarning() << "unexpected row" << row;
return;
}
m_model->beginMoveRows({}, row, row, {}, row-1);
std::swap(m_pixmaps[row-1], m_pixmaps[row]);
m_model->endMoveRows();
changed();
}
void EditSpriteDialog::moveRight()
{
const auto index = m_ui->listView->currentIndex();
if (!index.isValid())
return;
const int row = index.row();
if (row < 0 || size_t(row) >= m_pixmaps.size() - 1)
{
qWarning() << "unexpected row" << row;
return;
}
m_model->beginMoveRows({}, row, row, {}, row+2);
std::swap(m_pixmaps[row+1], m_pixmaps[row]);
m_model->endMoveRows();
changed();
}
void EditSpriteDialog::addEmpty()
{
QSize size;
if (!m_pixmaps.empty())
size = m_pixmaps.front().size();
if (size.isEmpty())
{
CreateSpriteDialog dialog{this};
if (dialog.exec() == QDialog::Accepted)
size = dialog.spriteSize();
else
return;
}
QPixmap pixmap{size};
pixmap.fill(Qt::transparent);
m_model->beginInsertRows({}, m_pixmaps.size(), m_pixmaps.size());
m_pixmaps.emplace_back(std::move(pixmap));
m_model->endInsertRows();
changed();
}
void EditSpriteDialog::insertEmpty()
{
int row{};
const auto index = m_ui->listView->currentIndex();
if (index.isValid())
{
row = index.row();
if (row < 0 || size_t(row) >= m_pixmaps.size())
{
qWarning() << "unexpected row" << row;
row = 0;
}
}
QSize size;
if (!m_pixmaps.empty())
size = m_pixmaps.front().size();
if (size.isEmpty())
{
CreateSpriteDialog dialog{this};
if (dialog.exec() == QDialog::Accepted)
size = dialog.spriteSize();
else
return;
}
QPixmap pixmap{size};
pixmap.fill(Qt::transparent);
m_model->beginInsertRows({}, row, row);
m_pixmaps.emplace(std::begin(m_pixmaps) + row, std::move(pixmap));
m_model->endInsertRows();
}
void EditSpriteDialog::edit()
{
const auto index = m_ui->listView->currentIndex();
if (!index.isValid())
return;
activated(index);
}
void EditSpriteDialog::transparentBackgroundSettings()
{
TransparentBackgroundSettingsDialog dialog{this};
@@ -215,9 +406,15 @@ void EditSpriteDialog::activated(const QModelIndex &index)
}
}
void EditSpriteDialog::currentChanged(const QModelIndex &index)
void EditSpriteDialog::currentChanged()
{
const auto index = m_ui->listView->currentIndex();
m_ui->actionSaveAsPngFile->setEnabled(index.isValid());
m_ui->actionCut->setEnabled(index.isValid());
m_ui->actionCopy->setEnabled(index.isValid());
m_ui->actionDelete->setEnabled(index.isValid());
m_ui->actionMoveLeft->setEnabled(index.isValid() && index.row() > 0);
m_ui->actionMoveRight->setEnabled(index.isValid() && size_t(index.row()) < m_pixmaps.size() - 1);
}
void EditSpriteDialog::changed()
+13 -1
View File
@@ -30,10 +30,22 @@ private slots:
void saveAsPng();
void createFromStrip();
void addFromStrip();
void undo();
void redo();
void cut();
void copy();
void paste();
void erase();
void delete_();
void moveLeft();
void moveRight();
void addEmpty();
void insertEmpty();
void edit();
void transparentBackgroundSettings();
void activated(const QModelIndex &index);
void currentChanged(const QModelIndex &index);
void currentChanged();
void changed();
+6
View File
@@ -23,6 +23,12 @@ public:
using QAbstractListModel::beginInsertRows;
using QAbstractListModel::endInsertRows;
using QAbstractListModel::beginRemoveRows;
using QAbstractListModel::endRemoveRows;
using QAbstractListModel::beginMoveRows;
using QAbstractListModel::endMoveRows;
private:
const std::vector<QPixmap> &m_pixmaps;
};