diff --git a/src/editor/dialogs/createspritedialog.cpp b/src/editor/dialogs/createspritedialog.cpp index 8f44475..6beb3c6 100644 --- a/src/editor/dialogs/createspritedialog.cpp +++ b/src/editor/dialogs/createspritedialog.cpp @@ -1,6 +1,7 @@ #include "createspritedialog.h" #include "ui_createspritedialog.h" +#include #include #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(); +} diff --git a/src/editor/dialogs/createspritedialog.h b/src/editor/dialogs/createspritedialog.h index 2c143c4..84ae24d 100644 --- a/src/editor/dialogs/createspritedialog.h +++ b/src/editor/dialogs/createspritedialog.h @@ -17,6 +17,9 @@ public: QSize spriteSize() const; +public slots: + void accept() override; + private: const std::unique_ptr m_ui; }; diff --git a/src/editor/dialogs/createspritedialog.ui b/src/editor/dialogs/createspritedialog.ui index 1e84c41..893caba 100644 --- a/src/editor/dialogs/createspritedialog.ui +++ b/src/editor/dialogs/createspritedialog.ui @@ -19,7 +19,7 @@ - Qt::Horizontal + Qt::Orientation::Horizontal @@ -54,7 +54,7 @@ - 0 + 1 2147483647 @@ -66,6 +66,9 @@ + + 1 + 2147483647 @@ -81,10 +84,10 @@ - Qt::Horizontal + Qt::Orientation::Horizontal - QDialogButtonBox::Cancel|QDialogButtonBox::Ok + QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok diff --git a/src/editor/dialogs/editspritedialog.cpp b/src/editor/dialogs/editspritedialog.cpp index 69fd41f..9ce1dde 100644 --- a/src/editor/dialogs/editspritedialog.cpp +++ b/src/editor/dialogs/editspritedialog.cpp @@ -53,6 +53,30 @@ EditSpriteDialog::EditSpriteDialog(const std::vector &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 &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() diff --git a/src/editor/dialogs/editspritedialog.h b/src/editor/dialogs/editspritedialog.h index 898b5d0..d339188 100644 --- a/src/editor/dialogs/editspritedialog.h +++ b/src/editor/dialogs/editspritedialog.h @@ -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(); diff --git a/src/editor/models/spritesmodel.h b/src/editor/models/spritesmodel.h index 650ac52..ae4609f 100644 --- a/src/editor/models/spritesmodel.h +++ b/src/editor/models/spritesmodel.h @@ -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 &m_pixmaps; };