Track metatile in MetatileLayersItem using ID instead of pointer

This commit is contained in:
GriffinR 2025-11-25 16:39:13 -05:00
parent c7e417b044
commit a20f14b93d
4 changed files with 16 additions and 16 deletions

View File

@ -18,6 +18,7 @@ and this project somewhat adheres to [Semantic Versioning](https://semver.org/sp
### Fixed
- Fix crash on older versions of Qt when reopening a project with certain windows open.
- Fix potential crash when painting and the cursor leaves the map area.
- Fix potential crash when changing maps with the Tileset Editor open.
- Fix rare crash while quitting Porymap.
- Fix `Edit > Clear Map Entries` in the Region Map Editor not saving the applied changes.
- Fix `Edit > Undo/Redo` appearing enabled even when they don't do anything.

View File

@ -9,14 +9,14 @@
class MetatileLayersItem: public SelectablePixmapItem {
Q_OBJECT
public:
MetatileLayersItem(Metatile *metatile,
MetatileLayersItem(uint16_t metatileId,
Tileset *primaryTileset,
Tileset *secondaryTileset,
Qt::Orientation orientation = Qt::Vertical);
void draw() override;
void setTilesets(Tileset*, Tileset*);
void setMetatile(Metatile*);
void setMetatileId(uint16_t);
bool hasCursor() const { return this->cursorCellPos != QPoint(-1,-1); }
Tile tileUnderCursor() const;
@ -29,7 +29,7 @@ public:
bool showGrid;
private:
Metatile* metatile;
uint16_t metatileId = 0;
Tileset *primaryTileset;
Tileset *secondaryTileset;
Qt::Orientation orientation;
@ -41,6 +41,7 @@ private:
QPoint getBoundedPos(const QPointF &);
void updateSelection();
bool setCursorCellPos(const QPoint &pos);
Metatile* getMetatile() const { return Tileset::getMetatile(this->metatileId, this->primaryTileset, this->secondaryTileset); }
signals:
void tileChanged(const QPoint &pos);
void paletteChanged(const QPoint &pos);

View File

@ -3,9 +3,9 @@
#include "imageproviders.h"
#include <QPainter>
MetatileLayersItem::MetatileLayersItem(Metatile *metatile, Tileset *primaryTileset, Tileset *secondaryTileset, Qt::Orientation orientation)
MetatileLayersItem::MetatileLayersItem(uint16_t metatileId, Tileset *primaryTileset, Tileset *secondaryTileset, Qt::Orientation orientation)
: SelectablePixmapItem(16, 16, Metatile::tileWidth(), Metatile::tileHeight()),
metatile(metatile),
metatileId(metatileId),
primaryTileset(primaryTileset),
secondaryTileset(secondaryTileset)
{
@ -60,9 +60,10 @@ void MetatileLayersItem::draw() {
QPainter painter(&pixmap);
// Draw tile images
int numTiles = qMin(projectConfig.getNumTilesInMetatile(), this->metatile ? this->metatile->tiles.length() : 0);
const Metatile* metatile = getMetatile();
int numTiles = qMin(projectConfig.getNumTilesInMetatile(), metatile ? metatile->tiles.length() : 0);
for (int i = 0; i < numTiles; i++) {
Tile tile = this->metatile->tiles.at(i);
Tile tile = metatile->tiles.at(i);
QImage tileImage = getPalettedTileImage(tile.tileId,
this->primaryTileset,
this->secondaryTileset,
@ -92,8 +93,8 @@ void MetatileLayersItem::draw() {
this->setPixmap(pixmap);
}
void MetatileLayersItem::setMetatile(Metatile *metatile) {
this->metatile = metatile;
void MetatileLayersItem::setMetatileId(uint16_t metatileId) {
this->metatileId = metatileId;
draw();
}
@ -167,10 +168,8 @@ void MetatileLayersItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *) {
Tile MetatileLayersItem::tileUnderCursor() const {
int tileIndex = posToTileIndex(this->cursorCellPos);
if (tileIndex < 0 || !this->metatile || tileIndex >= this->metatile->tiles.length()) {
return Tile();
}
return this->metatile->tiles.at(tileIndex);
const Metatile* metatile = getMetatile();
return metatile ? metatile->tiles.value(tileIndex) : Tile();
}
QPoint MetatileLayersItem::getBoundedPos(const QPointF &pos) {

View File

@ -309,8 +309,7 @@ void TilesetEditor::addWidgetToMetatileProperties(QWidget *w, int *row, int rowS
}
void TilesetEditor::initMetatileLayersItem() {
Metatile *metatile = Tileset::getMetatile(this->getSelectedMetatileId(), this->primaryTileset, this->secondaryTileset);
this->metatileLayersItem = new MetatileLayersItem(metatile, this->primaryTileset, this->secondaryTileset);
this->metatileLayersItem = new MetatileLayersItem(getSelectedMetatileId(), this->primaryTileset, this->secondaryTileset);
connect(this->metatileLayersItem, &MetatileLayersItem::tileChanged, [this](const QPoint &pos) { paintSelectedLayerTiles(pos); });
connect(this->metatileLayersItem, &MetatileLayersItem::paletteChanged, [this](const QPoint &pos) { paintSelectedLayerTiles(pos, true); });
connect(this->metatileLayersItem, &MetatileLayersItem::selectedTilesChanged, this, &TilesetEditor::onMetatileLayerSelectionChanged);
@ -504,7 +503,7 @@ void TilesetEditor::onSelectedMetatileChanged(uint16_t metatileId) {
if (updatedMetatile) *this->metatile = *updatedMetatile;
}
this->metatileLayersItem->setMetatile(metatile);
this->metatileLayersItem->setMetatileId(metatileId);
MetatileLabelPair labels = Tileset::getMetatileLabelPair(metatileId, this->primaryTileset, this->secondaryTileset);
this->ui->lineEdit_MetatileLabel->setText(labels.owned);