2018-09-29 20:13:07 +01:00
|
|
|
#include "tileseteditor.h"
|
|
|
|
#include "ui_tileseteditor.h"
|
2018-09-30 20:54:38 +01:00
|
|
|
#include "imageproviders.h"
|
2018-09-29 21:24:35 +01:00
|
|
|
#include <QDebug>
|
2018-09-29 20:13:07 +01:00
|
|
|
|
2018-09-29 21:24:35 +01:00
|
|
|
TilesetEditor::TilesetEditor(Project *project, QString primaryTilesetLabel, QString secondaryTilesetLabel, QWidget *parent) :
|
2018-09-29 20:13:07 +01:00
|
|
|
QMainWindow(parent),
|
|
|
|
ui(new Ui::TilesetEditor)
|
|
|
|
{
|
|
|
|
ui->setupUi(this);
|
|
|
|
this->project = project;
|
|
|
|
|
2018-09-30 20:54:38 +01:00
|
|
|
this->tileXFlip = ui->checkBox_xFlip->isChecked();
|
|
|
|
this->tileYFlip = ui->checkBox_yFlip->isChecked();
|
|
|
|
this->paletteId = ui->spinBox_paletteSelector->value();
|
2018-09-29 21:24:35 +01:00
|
|
|
this->primaryTilesetLabel = primaryTilesetLabel;
|
|
|
|
this->secondaryTilesetLabel = secondaryTilesetLabel;
|
|
|
|
|
2018-09-30 20:54:38 +01:00
|
|
|
ui->spinBox_paletteSelector->setMinimum(0);
|
|
|
|
ui->spinBox_paletteSelector->setMaximum(Project::getNumPalettesTotal() - 1);
|
|
|
|
this->initMetatileSelector();
|
2018-09-30 22:15:04 +01:00
|
|
|
this->initMetatileLayersItem();
|
2018-09-30 20:54:38 +01:00
|
|
|
this->initTileSelector();
|
|
|
|
this->initSelectedTileItem();
|
2018-09-30 22:15:04 +01:00
|
|
|
this->metatileSelector->select(0);
|
2018-09-29 20:13:07 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
TilesetEditor::~TilesetEditor()
|
|
|
|
{
|
|
|
|
delete ui;
|
|
|
|
}
|
|
|
|
|
2018-09-30 18:33:58 +01:00
|
|
|
void TilesetEditor::initMetatileSelector()
|
2018-09-29 20:13:07 +01:00
|
|
|
{
|
|
|
|
Tileset *primaryTileset = this->project->getTileset(this->primaryTilesetLabel);
|
2018-09-29 21:24:35 +01:00
|
|
|
Tileset *secondaryTileset = this->project->getTileset(this->secondaryTilesetLabel);
|
|
|
|
this->metatileSelector = new TilesetEditorMetatileSelector(primaryTileset, secondaryTileset);
|
|
|
|
connect(this->metatileSelector, SIGNAL(hoveredMetatileChanged(uint16_t)),
|
|
|
|
this, SLOT(onHoveredMetatileChanged(uint16_t)));
|
|
|
|
connect(this->metatileSelector, SIGNAL(hoveredMetatileCleared()),
|
|
|
|
this, SLOT(onHoveredMetatileCleared()));
|
|
|
|
connect(this->metatileSelector, SIGNAL(selectedMetatileChanged(uint16_t)),
|
|
|
|
this, SLOT(onSelectedMetatileChanged(uint16_t)));
|
|
|
|
|
|
|
|
this->metatilesScene = new QGraphicsScene;
|
|
|
|
this->metatilesScene->addItem(this->metatileSelector);
|
|
|
|
this->metatileSelector->draw();
|
|
|
|
|
|
|
|
this->ui->graphicsView_Metatiles->setScene(this->metatilesScene);
|
|
|
|
this->ui->graphicsView_Metatiles->setFixedSize(this->metatileSelector->pixmap().width() + 2, this->metatileSelector->pixmap().height() + 2);
|
|
|
|
}
|
|
|
|
|
2018-09-30 18:33:58 +01:00
|
|
|
void TilesetEditor::initTileSelector()
|
|
|
|
{
|
|
|
|
Tileset *primaryTileset = this->project->getTileset(this->primaryTilesetLabel);
|
|
|
|
Tileset *secondaryTileset = this->project->getTileset(this->secondaryTilesetLabel);
|
|
|
|
this->tileSelector = new TilesetEditorTileSelector(primaryTileset, secondaryTileset);
|
|
|
|
connect(this->tileSelector, SIGNAL(hoveredTileChanged(uint16_t)),
|
|
|
|
this, SLOT(onHoveredTileChanged(uint16_t)));
|
|
|
|
connect(this->tileSelector, SIGNAL(hoveredTileCleared()),
|
|
|
|
this, SLOT(onHoveredTileCleared()));
|
|
|
|
connect(this->tileSelector, SIGNAL(selectedTileChanged(uint16_t)),
|
|
|
|
this, SLOT(onSelectedTileChanged(uint16_t)));
|
|
|
|
|
|
|
|
this->tilesScene = new QGraphicsScene;
|
|
|
|
this->tilesScene->addItem(this->tileSelector);
|
|
|
|
this->tileSelector->select(0);
|
|
|
|
this->tileSelector->draw();
|
|
|
|
|
|
|
|
this->ui->graphicsView_Tiles->setScene(this->tilesScene);
|
|
|
|
this->ui->graphicsView_Tiles->setFixedSize(this->tileSelector->pixmap().width() + 2, this->tileSelector->pixmap().height() + 2);
|
|
|
|
}
|
|
|
|
|
2018-09-30 20:54:38 +01:00
|
|
|
void TilesetEditor::initSelectedTileItem() {
|
|
|
|
this->selectedTileScene = new QGraphicsScene;
|
|
|
|
this->drawSelectedTile();
|
|
|
|
this->ui->graphicsView_selectedTile->setScene(this->selectedTileScene);
|
|
|
|
}
|
|
|
|
|
|
|
|
void TilesetEditor::drawSelectedTile() {
|
|
|
|
if (!this->selectedTileScene) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2018-09-30 22:15:04 +01:00
|
|
|
this->selectedTileScene->clear();
|
2018-09-30 20:54:38 +01:00
|
|
|
Tileset *primaryTileset = this->project->getTileset(this->primaryTilesetLabel);
|
|
|
|
Tileset *secondaryTileset = this->project->getTileset(this->secondaryTilesetLabel);
|
|
|
|
QImage tileImage = getColoredTileImage(this->tileSelector->getSelectedTile(), primaryTileset, secondaryTileset, this->paletteId)
|
|
|
|
.mirrored(this->tileXFlip, this->tileYFlip);
|
|
|
|
this->selectedTilePixmapItem = new QGraphicsPixmapItem(QPixmap::fromImage(tileImage).scaled(32, 32));
|
|
|
|
this->selectedTileScene->addItem(this->selectedTilePixmapItem);
|
|
|
|
}
|
|
|
|
|
2018-09-30 22:15:04 +01:00
|
|
|
void TilesetEditor::initMetatileLayersItem() {
|
|
|
|
Tileset *primaryTileset = this->project->getTileset(this->primaryTilesetLabel);
|
|
|
|
Tileset *secondaryTileset = this->project->getTileset(this->secondaryTilesetLabel);
|
|
|
|
Metatile *metatile = Tileset::getMetatile(this->metatileSelector->getSelectedMetatile(), primaryTileset, secondaryTileset);
|
|
|
|
this->metatileLayersItem = new MetatileLayersItem(metatile, primaryTileset, secondaryTileset);
|
|
|
|
connect(this->metatileLayersItem, SIGNAL(tileChanged(int)),
|
|
|
|
this, SLOT(onMetatileLayerTileChanged(int)));
|
|
|
|
|
|
|
|
this->metatileLayersScene = new QGraphicsScene;
|
|
|
|
this->metatileLayersScene->addItem(this->metatileLayersItem);
|
|
|
|
this->ui->graphicsView_metatileLayers->setScene(this->metatileLayersScene);
|
|
|
|
}
|
|
|
|
|
2018-09-29 21:24:35 +01:00
|
|
|
void TilesetEditor::onHoveredMetatileChanged(uint16_t metatileId) {
|
|
|
|
QString message = QString("Metatile: 0x%1")
|
|
|
|
.arg(QString("%1").arg(metatileId, 3, 16, QChar('0')).toUpper());
|
|
|
|
this->ui->statusbar->showMessage(message);
|
|
|
|
}
|
|
|
|
|
|
|
|
void TilesetEditor::onHoveredMetatileCleared() {
|
|
|
|
this->ui->statusbar->clearMessage();
|
|
|
|
}
|
|
|
|
|
2018-09-30 22:15:04 +01:00
|
|
|
void TilesetEditor::onSelectedMetatileChanged(uint16_t metatileId) {
|
|
|
|
Tileset *primaryTileset = this->project->getTileset(this->primaryTilesetLabel);
|
|
|
|
Tileset *secondaryTileset = this->project->getTileset(this->secondaryTilesetLabel);
|
|
|
|
this->metatile = Tileset::getMetatile(metatileId, primaryTileset, secondaryTileset);
|
|
|
|
this->metatileLayersItem->setMetatile(metatile);
|
|
|
|
this->metatileLayersItem->draw();
|
2018-09-29 20:13:07 +01:00
|
|
|
}
|
2018-09-30 18:33:58 +01:00
|
|
|
|
|
|
|
void TilesetEditor::onHoveredTileChanged(uint16_t tile) {
|
|
|
|
QString message = QString("Tile: 0x%1")
|
|
|
|
.arg(QString("%1").arg(tile, 3, 16, QChar('0')).toUpper());
|
|
|
|
this->ui->statusbar->showMessage(message);
|
|
|
|
}
|
|
|
|
|
|
|
|
void TilesetEditor::onHoveredTileCleared() {
|
|
|
|
this->ui->statusbar->clearMessage();
|
|
|
|
}
|
|
|
|
|
2018-09-30 22:15:04 +01:00
|
|
|
void TilesetEditor::onSelectedTileChanged(uint16_t) {
|
2018-09-30 20:54:38 +01:00
|
|
|
this->drawSelectedTile();
|
|
|
|
}
|
2018-09-30 18:33:58 +01:00
|
|
|
|
2018-09-30 22:15:04 +01:00
|
|
|
void TilesetEditor::onMetatileLayerTileChanged(int tileIndex) {
|
|
|
|
Tile tile = this->metatile->tiles->at(tileIndex);
|
|
|
|
tile.tile = this->tileSelector->getSelectedTile();
|
|
|
|
tile.xflip = this->tileXFlip;
|
|
|
|
tile.yflip = this->tileYFlip;
|
|
|
|
tile.palette = this->paletteId;
|
|
|
|
(*this->metatile->tiles)[tileIndex] = tile;
|
|
|
|
this->metatileSelector->draw();
|
|
|
|
this->metatileLayersItem->draw();
|
|
|
|
}
|
|
|
|
|
2018-09-30 20:54:38 +01:00
|
|
|
void TilesetEditor::on_spinBox_paletteSelector_valueChanged(int paletteId)
|
|
|
|
{
|
|
|
|
this->paletteId = paletteId;
|
|
|
|
this->tileSelector->setPaletteId(paletteId);
|
|
|
|
this->drawSelectedTile();
|
|
|
|
}
|
|
|
|
|
|
|
|
void TilesetEditor::on_checkBox_xFlip_stateChanged(int checked)
|
|
|
|
{
|
|
|
|
this->tileXFlip = checked;
|
|
|
|
this->drawSelectedTile();
|
|
|
|
}
|
|
|
|
|
|
|
|
void TilesetEditor::on_checkBox_yFlip_stateChanged(int checked)
|
|
|
|
{
|
|
|
|
this->tileYFlip = checked;
|
|
|
|
this->drawSelectedTile();
|
2018-09-30 18:33:58 +01:00
|
|
|
}
|