diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c39d3d1..b26b5289 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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. diff --git a/include/ui/metatilelayersitem.h b/include/ui/metatilelayersitem.h index 18e799f4..8fb637f5 100644 --- a/include/ui/metatilelayersitem.h +++ b/include/ui/metatilelayersitem.h @@ -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); diff --git a/src/ui/metatilelayersitem.cpp b/src/ui/metatilelayersitem.cpp index c540f4c4..63b1fc54 100644 --- a/src/ui/metatilelayersitem.cpp +++ b/src/ui/metatilelayersitem.cpp @@ -3,9 +3,9 @@ #include "imageproviders.h" #include -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) { diff --git a/src/ui/tileseteditor.cpp b/src/ui/tileseteditor.cpp index 38a41bf2..c97c7d75 100644 --- a/src/ui/tileseteditor.cpp +++ b/src/ui/tileseteditor.cpp @@ -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);