diff --git a/forms/tileseteditor.ui b/forms/tileseteditor.ui
index 735606d2..3a2a2efb 100644
--- a/forms/tileseteditor.ui
+++ b/forms/tileseteditor.ui
@@ -186,8 +186,8 @@
- 32
- 32
+ 64
+ 64
@@ -215,7 +215,7 @@
0
0
309
- 415
+ 409
diff --git a/include/ui/metatilelayersitem.h b/include/ui/metatilelayersitem.h
index d2b7d243..b6599e58 100644
--- a/include/ui/metatilelayersitem.h
+++ b/include/ui/metatilelayersitem.h
@@ -21,7 +21,7 @@ private:
Tileset *primaryTileset;
Tileset *secondaryTileset;
signals:
- void tileChanged(int);
+ void tileChanged(int, int);
protected:
void mousePressEvent(QGraphicsSceneMouseEvent*);
};
diff --git a/include/ui/tileseteditor.h b/include/ui/tileseteditor.h
index 9b6d6e67..434e89ea 100644
--- a/include/ui/tileseteditor.h
+++ b/include/ui/tileseteditor.h
@@ -26,8 +26,8 @@ private slots:
void onSelectedMetatileChanged(uint16_t);
void onHoveredTileChanged(uint16_t);
void onHoveredTileCleared();
- void onSelectedTileChanged(uint16_t);
- void onMetatileLayerTileChanged(int);
+ void onSelectedTilesChanged();
+ void onMetatileLayerTileChanged(int, int);
void on_spinBox_paletteSelector_valueChanged(int arg1);
@@ -50,7 +50,7 @@ private:
void initTileSelector();
void initSelectedTileItem();
void initMetatileLayersItem();
- void drawSelectedTile();
+ void drawSelectedTiles();
void importTilesetTiles(Tileset*, bool);
void refresh();
Ui::TilesetEditor *ui;
diff --git a/include/ui/tileseteditortileselector.h b/include/ui/tileseteditortileselector.h
index 7369babb..62a14e2b 100644
--- a/include/ui/tileseteditortileselector.h
+++ b/include/ui/tileseteditortileselector.h
@@ -7,7 +7,7 @@
class TilesetEditorTileSelector: public SelectablePixmapItem {
Q_OBJECT
public:
- TilesetEditorTileSelector(Tileset *primaryTileset, Tileset *secondaryTileset): SelectablePixmapItem(16, 16, 1, 1) {
+ TilesetEditorTileSelector(Tileset *primaryTileset, Tileset *secondaryTileset): SelectablePixmapItem(16, 16, 2, 2) {
this->primaryTileset = primaryTileset;
this->secondaryTileset = secondaryTileset;
this->numTilesWide = 16;
@@ -18,7 +18,8 @@ public:
void select(uint16_t metatileId);
void setTilesets(Tileset*, Tileset*);
void setPaletteId(int);
- uint16_t getSelectedTile();
+ void setTileFlips(bool, bool);
+ QList getSelectedTiles();
protected:
void mousePressEvent(QGraphicsSceneMouseEvent*);
@@ -30,10 +31,12 @@ protected:
private:
Tileset *primaryTileset;
Tileset *secondaryTileset;
- uint16_t selectedTile;
+ QList selectedTiles;
int numTilesWide;
int paletteId;
- void updateSelectedTile();
+ bool xFlip;
+ bool yFlip;
+ void updateSelectedTiles();
uint16_t getTileId(int x, int y);
QPoint getTileCoords(uint16_t);
QList getCurPaletteTable();
@@ -41,7 +44,7 @@ private:
signals:
void hoveredTileChanged(uint16_t);
void hoveredTileCleared();
- void selectedTileChanged(uint16_t);
+ void selectedTilesChanged();
};
#endif // TILESETEDITORTILESELECTOR_H
diff --git a/src/ui/metatilelayersitem.cpp b/src/ui/metatilelayersitem.cpp
index 50e6afaa..fe8b164f 100644
--- a/src/ui/metatilelayersitem.cpp
+++ b/src/ui/metatilelayersitem.cpp
@@ -41,6 +41,5 @@ void MetatileLayersItem::mousePressEvent(QGraphicsSceneMouseEvent *event) {
QPointF pos = event->pos();
int x = static_cast(pos.x()) / 16;
int y = static_cast(pos.y()) / 16;
- int tileIndex = (x / 2 * 4) + (y * 2) + (x % 2);
- emit this->tileChanged(tileIndex);
+ emit this->tileChanged(x, y);
}
diff --git a/src/ui/tileseteditor.cpp b/src/ui/tileseteditor.cpp
index 606fdc93..c0403585 100644
--- a/src/ui/tileseteditor.cpp
+++ b/src/ui/tileseteditor.cpp
@@ -58,12 +58,13 @@ void TilesetEditor::refresh() {
this->tileSelector->setTilesets(this->primaryTileset, this->secondaryTileset);
this->metatileLayersItem->setTilesets(this->primaryTileset, this->secondaryTileset);
this->metatileSelector->select(this->metatileSelector->getSelectedMetatile());
- this->drawSelectedTile();
+ this->drawSelectedTiles();
this->ui->graphicsView_Tiles->setSceneRect(0, 0, this->tileSelector->pixmap().width() + 2, this->tileSelector->pixmap().height() + 2);
this->ui->graphicsView_Tiles->setFixedSize(this->tileSelector->pixmap().width() + 2, this->tileSelector->pixmap().height() + 2);
this->ui->graphicsView_Metatiles->setSceneRect(0, 0, this->metatileSelector->pixmap().width() + 2, this->metatileSelector->pixmap().height() + 2);
this->ui->graphicsView_Metatiles->setFixedSize(this->metatileSelector->pixmap().width() + 2, this->metatileSelector->pixmap().height() + 2);
+ this->ui->graphicsView_selectedTile->setFixedSize(this->selectedTilePixmapItem->pixmap().width(), this->selectedTilePixmapItem->pixmap().height());
}
void TilesetEditor::initMetatileSelector()
@@ -91,8 +92,8 @@ void TilesetEditor::initTileSelector()
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)));
+ connect(this->tileSelector, SIGNAL(selectedTilesChanged()),
+ this, SLOT(onSelectedTilesChanged()));
this->tilesScene = new QGraphicsScene;
this->tilesScene->addItem(this->tileSelector);
@@ -105,27 +106,42 @@ void TilesetEditor::initTileSelector()
void TilesetEditor::initSelectedTileItem() {
this->selectedTileScene = new QGraphicsScene;
- this->drawSelectedTile();
+ this->drawSelectedTiles();
this->ui->graphicsView_selectedTile->setScene(this->selectedTileScene);
+ this->ui->graphicsView_selectedTile->setFixedSize(this->selectedTilePixmapItem->pixmap().width(), this->selectedTilePixmapItem->pixmap().height());
}
-void TilesetEditor::drawSelectedTile() {
+void TilesetEditor::drawSelectedTiles() {
if (!this->selectedTileScene) {
return;
}
this->selectedTileScene->clear();
- QImage tileImage = getColoredTileImage(this->tileSelector->getSelectedTile(), this->primaryTileset, this->secondaryTileset, this->paletteId)
- .mirrored(this->tileXFlip, this->tileYFlip);
- this->selectedTilePixmapItem = new QGraphicsPixmapItem(QPixmap::fromImage(tileImage).scaled(32, 32));
+ QList tiles = this->tileSelector->getSelectedTiles();
+ QPoint dimensions = this->tileSelector->getSelectionDimensions();
+ QImage selectionImage(32 * dimensions.x(), 32 * dimensions.y(), QImage::Format_RGBA8888);
+ QPainter painter(&selectionImage);
+ int tileIndex = 0;
+ for (int j = 0; j < dimensions.y(); j++) {
+ for (int i = 0; i < dimensions.x(); i++) {
+ QImage tileImage = getColoredTileImage(tiles.at(tileIndex), this->primaryTileset, this->secondaryTileset, this->paletteId)
+ .mirrored(this->tileXFlip, this->tileYFlip)
+ .scaled(32, 32);
+ tileIndex++;
+ painter.drawImage(i * 32, j * 32, tileImage);
+ }
+ }
+
+ this->selectedTilePixmapItem = new QGraphicsPixmapItem(QPixmap::fromImage(selectionImage));
this->selectedTileScene->addItem(this->selectedTilePixmapItem);
+ this->ui->graphicsView_selectedTile->setFixedSize(this->selectedTilePixmapItem->pixmap().width(), this->selectedTilePixmapItem->pixmap().height());
}
void TilesetEditor::initMetatileLayersItem() {
Metatile *metatile = Tileset::getMetatile(this->metatileSelector->getSelectedMetatile(), this->primaryTileset, this->secondaryTileset);
this->metatileLayersItem = new MetatileLayersItem(metatile, this->primaryTileset, this->secondaryTileset);
- connect(this->metatileLayersItem, SIGNAL(tileChanged(int)),
- this, SLOT(onMetatileLayerTileChanged(int)));
+ connect(this->metatileLayersItem, SIGNAL(tileChanged(int, int)),
+ this, SLOT(onMetatileLayerTileChanged(int, int)));
this->metatileLayersScene = new QGraphicsScene;
this->metatileLayersScene->addItem(this->metatileLayersItem);
@@ -160,17 +176,30 @@ void TilesetEditor::onHoveredTileCleared() {
this->ui->statusbar->clearMessage();
}
-void TilesetEditor::onSelectedTileChanged(uint16_t) {
- this->drawSelectedTile();
+void TilesetEditor::onSelectedTilesChanged() {
+ this->drawSelectedTiles();
}
-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;
+void TilesetEditor::onMetatileLayerTileChanged(int x, int y) {
+ int maxTileIndex = x < 2 ? 3 : 7;
+ QPoint dimensions = this->tileSelector->getSelectionDimensions();
+ QList tiles = this->tileSelector->getSelectedTiles();
+ int selectedTileIndex = 0;
+ for (int j = 0; j < dimensions.y(); j++) {
+ for (int i = 0; i < dimensions.x(); i++) {
+ int tileIndex = ((x + i) / 2 * 4) + ((y + j) * 2) + ((x + i) % 2);
+ if (tileIndex <= maxTileIndex) {
+ Tile tile = this->metatile->tiles->at(tileIndex);
+ tile.tile = tiles.at(selectedTileIndex);
+ tile.xflip = this->tileXFlip;
+ tile.yflip = this->tileYFlip;
+ tile.palette = this->paletteId;
+ (*this->metatile->tiles)[tileIndex] = tile;
+ }
+ selectedTileIndex++;
+ }
+ }
+
this->metatileSelector->draw();
this->metatileLayersItem->draw();
}
@@ -179,19 +208,21 @@ void TilesetEditor::on_spinBox_paletteSelector_valueChanged(int paletteId)
{
this->paletteId = paletteId;
this->tileSelector->setPaletteId(paletteId);
- this->drawSelectedTile();
+ this->drawSelectedTiles();
}
void TilesetEditor::on_checkBox_xFlip_stateChanged(int checked)
{
this->tileXFlip = checked;
- this->drawSelectedTile();
+ this->tileSelector->setTileFlips(this->tileXFlip, this->tileYFlip);
+ this->drawSelectedTiles();
}
void TilesetEditor::on_checkBox_yFlip_stateChanged(int checked)
{
this->tileYFlip = checked;
- this->drawSelectedTile();
+ this->tileSelector->setTileFlips(this->tileXFlip, this->tileYFlip);
+ this->drawSelectedTiles();
}
void TilesetEditor::on_comboBox_metatileBehaviors_currentIndexChanged(const QString &metatileBehavior)
diff --git a/src/ui/tileseteditortileselector.cpp b/src/ui/tileseteditortileselector.cpp
index 09bc2d60..6d323f46 100644
--- a/src/ui/tileseteditortileselector.cpp
+++ b/src/ui/tileseteditortileselector.cpp
@@ -35,7 +35,7 @@ void TilesetEditorTileSelector::draw() {
int y = tile / this->numTilesWide;
int x = tile % this->numTilesWide;
QPoint origin = QPoint(x * 16, y * 16);
- painter.drawImage(origin, tileImage);
+ painter.drawImage(origin, tileImage.mirrored(this->xFlip, this->yFlip));
}
painter.end();
@@ -46,8 +46,8 @@ void TilesetEditorTileSelector::draw() {
void TilesetEditorTileSelector::select(uint16_t tile) {
QPoint coords = this->getTileCoords(tile);
SelectablePixmapItem::select(coords.x(), coords.y(), 0, 0);
- this->selectedTile = tile;
- emit selectedTileChanged(tile);
+ this->updateSelectedTiles();
+ emit selectedTilesChanged();
}
void TilesetEditorTileSelector::setTilesets(Tileset *primaryTileset, Tileset *secondaryTileset) {
@@ -61,13 +61,26 @@ void TilesetEditorTileSelector::setPaletteId(int paletteId) {
this->draw();
}
-void TilesetEditorTileSelector::updateSelectedTile() {
- QPoint origin = this->getSelectionStart();
- this->selectedTile = this->getTileId(origin.x(), origin.y());
+void TilesetEditorTileSelector::setTileFlips(bool xFlip, bool yFlip) {
+ this->xFlip = xFlip;
+ this->yFlip = yFlip;
+ this->draw();
}
-uint16_t TilesetEditorTileSelector::getSelectedTile() {
- return this->selectedTile;
+void TilesetEditorTileSelector::updateSelectedTiles() {
+ this->selectedTiles.clear();
+ QPoint origin = this->getSelectionStart();
+ QPoint dimensions = this->getSelectionDimensions();
+ for (int j = 0; j < dimensions.y(); j++) {
+ for (int i = 0; i < dimensions.x(); i++) {
+ uint16_t metatileId = this->getTileId(origin.x() + i, origin.y() + j);
+ this->selectedTiles.append(metatileId);
+ }
+ }
+}
+
+QList TilesetEditorTileSelector::getSelectedTiles() {
+ return this->selectedTiles;
}
uint16_t TilesetEditorTileSelector::getTileId(int x, int y) {
@@ -76,24 +89,24 @@ uint16_t TilesetEditorTileSelector::getTileId(int x, int y) {
void TilesetEditorTileSelector::mousePressEvent(QGraphicsSceneMouseEvent *event) {
SelectablePixmapItem::mousePressEvent(event);
- this->updateSelectedTile();
- emit selectedTileChanged(this->selectedTile);
+ this->updateSelectedTiles();
+ emit selectedTilesChanged();
}
void TilesetEditorTileSelector::mouseMoveEvent(QGraphicsSceneMouseEvent *event) {
SelectablePixmapItem::mouseMoveEvent(event);
- this->updateSelectedTile();
+ this->updateSelectedTiles();
QPoint pos = this->getCellPos(event->pos());
uint16_t tile = this->getTileId(pos.x(), pos.y());
emit hoveredTileChanged(tile);
- emit selectedTileChanged(tile);
+ emit selectedTilesChanged();
}
void TilesetEditorTileSelector::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) {
SelectablePixmapItem::mouseReleaseEvent(event);
- this->updateSelectedTile();
- emit selectedTileChanged(this->selectedTile);
+ this->updateSelectedTiles();
+ emit selectedTilesChanged();
}
void TilesetEditorTileSelector::hoverMoveEvent(QGraphicsSceneHoverEvent *event) {