2020-06-25 06:32:42 +01:00
|
|
|
#include "config.h"
|
2018-09-30 22:15:04 +01:00
|
|
|
#include "metatilelayersitem.h"
|
|
|
|
#include "imageproviders.h"
|
|
|
|
#include <QPainter>
|
|
|
|
|
2024-01-05 07:47:23 +00:00
|
|
|
static const QList<QPoint> tilePositions = {
|
|
|
|
QPoint(0, 0),
|
|
|
|
QPoint(1, 0),
|
|
|
|
QPoint(0, 1),
|
|
|
|
QPoint(1, 1),
|
|
|
|
QPoint(2, 0),
|
|
|
|
QPoint(3, 0),
|
|
|
|
QPoint(2, 1),
|
|
|
|
QPoint(3, 1),
|
|
|
|
QPoint(4, 0),
|
|
|
|
QPoint(5, 0),
|
|
|
|
QPoint(4, 1),
|
|
|
|
QPoint(5, 1),
|
|
|
|
};
|
2018-09-30 22:15:04 +01:00
|
|
|
|
2024-01-05 07:47:23 +00:00
|
|
|
void MetatileLayersItem::draw() {
|
2023-12-20 02:21:16 +00:00
|
|
|
const int numLayers = projectConfig.getNumLayersInMetatile();
|
|
|
|
QPixmap pixmap(numLayers * 32, 32);
|
2018-09-30 22:15:04 +01:00
|
|
|
QPainter painter(&pixmap);
|
2023-12-20 02:21:16 +00:00
|
|
|
|
|
|
|
// Draw tile images
|
2024-10-16 16:04:25 +01:00
|
|
|
int numTiles = qMin(projectConfig.getNumTilesInMetatile(), this->metatile ? this->metatile->tiles.length() : 0);
|
2020-06-25 06:32:42 +01:00
|
|
|
for (int i = 0; i < numTiles; i++) {
|
2021-02-16 17:14:27 +00:00
|
|
|
Tile tile = this->metatile->tiles.at(i);
|
2021-11-24 04:53:41 +00:00
|
|
|
QImage tileImage = getPalettedTileImage(tile.tileId, this->primaryTileset, this->secondaryTileset, tile.palette, true)
|
2018-09-30 22:15:04 +01:00
|
|
|
.mirrored(tile.xflip, tile.yflip)
|
|
|
|
.scaled(16, 16);
|
2024-01-05 07:47:23 +00:00
|
|
|
painter.drawImage(tilePositions.at(i) * 16, tileImage);
|
2018-09-30 22:15:04 +01:00
|
|
|
}
|
2023-12-20 02:21:16 +00:00
|
|
|
if (this->showGrid) {
|
|
|
|
// Draw grid
|
|
|
|
painter.setPen(Qt::white);
|
|
|
|
for (int i = 1; i < numLayers; i++) {
|
|
|
|
int x = i * 32;
|
|
|
|
painter.drawLine(x, 0, x, 32);
|
|
|
|
}
|
|
|
|
}
|
2018-09-30 22:15:04 +01:00
|
|
|
|
|
|
|
this->setPixmap(pixmap);
|
|
|
|
}
|
|
|
|
|
|
|
|
void MetatileLayersItem::setMetatile(Metatile *metatile) {
|
|
|
|
this->metatile = metatile;
|
2018-10-06 23:07:36 +01:00
|
|
|
this->clearLastModifiedCoords();
|
2024-01-05 07:47:23 +00:00
|
|
|
this->clearLastHoveredCoords();
|
2018-09-30 22:15:04 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void MetatileLayersItem::setTilesets(Tileset *primaryTileset, Tileset *secondaryTileset) {
|
|
|
|
this->primaryTileset = primaryTileset;
|
|
|
|
this->secondaryTileset = secondaryTileset;
|
|
|
|
this->draw();
|
2018-10-06 23:07:36 +01:00
|
|
|
this->clearLastModifiedCoords();
|
2024-01-05 07:47:23 +00:00
|
|
|
this->clearLastHoveredCoords();
|
2018-09-30 22:15:04 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void MetatileLayersItem::mousePressEvent(QGraphicsSceneMouseEvent *event) {
|
2018-10-06 21:49:26 +01:00
|
|
|
if (event->buttons() & Qt::RightButton) {
|
|
|
|
SelectablePixmapItem::mousePressEvent(event);
|
|
|
|
QPoint selectionOrigin = this->getSelectionStart();
|
|
|
|
QPoint dimensions = this->getSelectionDimensions();
|
|
|
|
emit this->selectedTilesChanged(selectionOrigin, dimensions.x(), dimensions.y());
|
|
|
|
this->drawSelection();
|
|
|
|
} else {
|
2024-01-05 07:47:23 +00:00
|
|
|
const QPoint pos = this->getBoundedPos(event->pos());
|
|
|
|
this->prevChangedPos = pos;
|
|
|
|
this->clearLastHoveredCoords();
|
|
|
|
emit this->tileChanged(pos.x(), pos.y());
|
2018-10-06 21:49:26 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void MetatileLayersItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) {
|
|
|
|
if (event->buttons() & Qt::RightButton) {
|
|
|
|
SelectablePixmapItem::mouseMoveEvent(event);
|
|
|
|
QPoint selectionOrigin = this->getSelectionStart();
|
|
|
|
QPoint dimensions = this->getSelectionDimensions();
|
|
|
|
emit this->selectedTilesChanged(selectionOrigin, dimensions.x(), dimensions.y());
|
|
|
|
this->drawSelection();
|
|
|
|
} else {
|
2024-01-05 07:47:23 +00:00
|
|
|
const QPoint pos = this->getBoundedPos(event->pos());
|
|
|
|
if (prevChangedPos != pos) {
|
|
|
|
this->prevChangedPos = pos;
|
|
|
|
this->clearLastHoveredCoords();
|
|
|
|
emit this->tileChanged(pos.x(), pos.y());
|
2018-10-06 23:07:36 +01:00
|
|
|
}
|
2018-10-06 21:49:26 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void MetatileLayersItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) {
|
|
|
|
if (event->buttons() & Qt::RightButton) {
|
|
|
|
SelectablePixmapItem::mouseReleaseEvent(event);
|
|
|
|
QPoint selectionOrigin = this->getSelectionStart();
|
|
|
|
QPoint dimensions = this->getSelectionDimensions();
|
|
|
|
emit this->selectedTilesChanged(selectionOrigin, dimensions.x(), dimensions.y());
|
|
|
|
}
|
|
|
|
|
|
|
|
this->draw();
|
2018-09-30 22:15:04 +01:00
|
|
|
}
|
2018-10-06 23:07:36 +01:00
|
|
|
|
2024-01-05 07:47:23 +00:00
|
|
|
void MetatileLayersItem::hoverMoveEvent(QGraphicsSceneHoverEvent * event) {
|
|
|
|
const QPoint pos = this->getBoundedPos(event->pos());
|
|
|
|
if (pos == this->prevHoveredPos)
|
|
|
|
return;
|
|
|
|
this->prevHoveredPos = pos;
|
|
|
|
|
|
|
|
int tileIndex = tilePositions.indexOf(pos);
|
|
|
|
if (tileIndex < 0 || tileIndex >= this->metatile->tiles.length())
|
|
|
|
return;
|
|
|
|
|
|
|
|
emit this->hoveredTileChanged(this->metatile->tiles.at(tileIndex).tileId);
|
|
|
|
}
|
|
|
|
|
|
|
|
void MetatileLayersItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *) {
|
|
|
|
this->clearLastHoveredCoords();
|
|
|
|
emit this->hoveredTileCleared();
|
|
|
|
}
|
|
|
|
|
2018-10-06 23:07:36 +01:00
|
|
|
void MetatileLayersItem::clearLastModifiedCoords() {
|
2024-01-05 07:47:23 +00:00
|
|
|
this->prevChangedPos = QPoint(-1, -1);
|
|
|
|
}
|
|
|
|
|
|
|
|
void MetatileLayersItem::clearLastHoveredCoords() {
|
|
|
|
this->prevHoveredPos = QPoint(-1, -1);
|
2018-10-06 23:07:36 +01:00
|
|
|
}
|
|
|
|
|
2024-01-05 07:47:23 +00:00
|
|
|
QPoint MetatileLayersItem::getBoundedPos(const QPointF &pos) {
|
|
|
|
int x, y;
|
2022-10-04 02:28:16 +01:00
|
|
|
int maxX = (projectConfig.getNumLayersInMetatile() * 2) - 1;
|
2024-01-05 07:47:23 +00:00
|
|
|
x = static_cast<int>(pos.x()) / 16;
|
|
|
|
y = static_cast<int>(pos.y()) / 16;
|
|
|
|
if (x < 0) x = 0;
|
|
|
|
if (y < 0) y = 0;
|
|
|
|
if (x > maxX) x = maxX;
|
|
|
|
if (y > 1) y = 1;
|
|
|
|
return QPoint(x, y);
|
2018-10-06 23:07:36 +01:00
|
|
|
}
|