diff --git a/NEWS.md b/NEWS.md index 0f1c08079c9..f3dbe84cb39 100644 --- a/NEWS.md +++ b/NEWS.md @@ -3,6 +3,7 @@ * Added support for setting custom properties on the project (#2903) * Removed Space and Ctrl+Space shortcuts from Layers view to avoid conflict with panning (#3672) * Scripting: Added API for editing tile layers using terrain sets (with a-morphous, #3758) +* Scripting: Support erasing tiles in Tool.preview and TileMap.merge * Fixed object preview position with parallax factor on group layer (#3669) * Fixed hover highlight rendering with active parallax factor (#3669) * Fixed updating of object selection outlines when changing parallax factor (#3669) diff --git a/src/libtiled/map.cpp b/src/libtiled/map.cpp index f9f84f03542..45fc178d613 100644 --- a/src/libtiled/map.cpp +++ b/src/libtiled/map.cpp @@ -518,12 +518,12 @@ QRect Map::tileBoundingRect() const return mapBounds; } -QRegion Map::tileRegion() const +QRegion Map::modifiedTileRegion() const { QRegion region; LayerIterator it(this, Layer::TileLayerType); while (auto tileLayer = static_cast(it.next())) - region |= tileLayer->region(); + region |= tileLayer->modifiedRegion(); return region; } diff --git a/src/libtiled/map.h b/src/libtiled/map.h index 36bf7293453..0abee3233e7 100644 --- a/src/libtiled/map.h +++ b/src/libtiled/map.h @@ -314,7 +314,7 @@ class TILEDSHARED_EXPORT Map : public Object MapObject *findObjectById(int objectId) const; QRect tileBoundingRect() const; - QRegion tileRegion() const; + QRegion modifiedTileRegion() const; private: friend class GroupLayer; // so it can call adoptLayer diff --git a/src/libtiled/tilelayer.h b/src/libtiled/tilelayer.h index cda636ec09d..5607e76affb 100644 --- a/src/libtiled/tilelayer.h +++ b/src/libtiled/tilelayer.h @@ -380,6 +380,7 @@ class TILEDSHARED_EXPORT TileLayer : public Layer QRegion region(std::function condition) const; QRegion region() const; + QRegion modifiedRegion() const; const Cell &cellAt(int x, int y) const; const Cell &cellAt(QPoint point) const; @@ -626,6 +627,17 @@ inline QRegion TileLayer::region() const return region([] (const Cell &cell) { return !cell.isEmpty(); }); } +/** + * Calculates the modified region of this layer. This includes both all + * non-empty cells as well as any cells that were marked as "checked". + */ +inline QRegion TileLayer::modifiedRegion() const +{ + return region([] (const Cell &cell) { + return !cell.isEmpty() || cell.checked(); + }); +} + /** * Returns a read-only reference to the cell at the given coordinates. The * coordinates have to be within this layer. diff --git a/src/tiled/brushitem.cpp b/src/tiled/brushitem.cpp index 1139548e64f..23056b6d31e 100644 --- a/src/tiled/brushitem.cpp +++ b/src/tiled/brushitem.cpp @@ -73,11 +73,8 @@ void BrushItem::clear() */ void BrushItem::setTileLayer(const SharedTileLayer &tileLayer) { - mTileLayer = tileLayer; - mRegion = tileLayer ? tileLayer->region() : QRegion(); - - updateBoundingRect(); - update(); + setTileLayer(tileLayer, + tileLayer ? tileLayer->modifiedRegion() : QRegion()); } /** @@ -97,11 +94,7 @@ void BrushItem::setTileLayer(const SharedTileLayer &tileLayer, void BrushItem::setMap(const SharedMap &map) { - mMap = map; - mRegion = map->tileRegion(); - - updateBoundingRect(); - update(); + setMap(map, map->modifiedTileRegion()); } void BrushItem::setMap(const SharedMap &map, const QRegion ®ion) diff --git a/src/tiled/brushitem.h b/src/tiled/brushitem.h index 30a88eabf35..8c313cad2f0 100644 --- a/src/tiled/brushitem.h +++ b/src/tiled/brushitem.h @@ -65,7 +65,7 @@ class BrushItem : public QGraphicsItem QWidget *widget = nullptr) override; protected: - MapDocument *mapDocument() const { return mMapDocument; } + MapDocument *mapDocument() const { return mMapDocument; } private: void updateBoundingRect(); diff --git a/src/tiled/capturestamphelper.cpp b/src/tiled/capturestamphelper.cpp index 3ece4979d15..be6b21d6d83 100644 --- a/src/tiled/capturestamphelper.cpp +++ b/src/tiled/capturestamphelper.cpp @@ -22,7 +22,6 @@ #include "map.h" #include "mapdocument.h" -#include "tilelayer.h" #include diff --git a/src/tiled/mapdocument.cpp b/src/tiled/mapdocument.cpp index 49455e9a70d..d8bb893f7a0 100644 --- a/src/tiled/mapdocument.cpp +++ b/src/tiled/mapdocument.cpp @@ -992,8 +992,8 @@ void MapDocument::paintTileLayers(const Map &map, bool mergeable, auto source = sourceLayers[i]; auto target = targetLayers[i]; - const QRegion editedRegion = source->region(); - if (editedRegion.isEmpty()) + const QRegion paintRegion = source->modifiedRegion(); + if (paintRegion.isEmpty()) continue; std::unique_ptr newLayer; @@ -1018,7 +1018,7 @@ void MapDocument::paintTileLayers(const Map &map, bool mergeable, source->x(), source->y(), source, - editedRegion); + paintRegion); if (missingTilesets && !missingTilesets->isEmpty()) { for (const SharedTileset &tileset : std::as_const(*missingTilesets)) { @@ -1058,7 +1058,7 @@ void MapDocument::paintTileLayers(const Map &map, bool mergeable, paintCommand->setMergeable(mergeable); undoStack()->push(paintCommand); - regions[target] |= editedRegion; + regions[target] |= paintRegion; mergeable = true; // further paints are always mergeable } diff --git a/src/tiled/stampbrush.cpp b/src/tiled/stampbrush.cpp index 89cce23b68b..70660d51542 100644 --- a/src/tiled/stampbrush.cpp +++ b/src/tiled/stampbrush.cpp @@ -529,7 +529,7 @@ void StampBrush::drawPreviewLayer(const QVector &points) if (regionCache.contains(map)) { stampRegion = regionCache.value(map); } else { - stampRegion = map->tileRegion(); + stampRegion = map->modifiedTileRegion(); regionCache.insert(map, stampRegion); } @@ -635,7 +635,7 @@ void StampBrush::updatePreview(QPoint tilePos) } if (mPreviewMap) - tileRegion = mPreviewMap->tileRegion(); + tileRegion = mPreviewMap->modifiedTileRegion(); if (tileRegion.isEmpty()) tileRegion = QRect(tilePos, tilePos);