diff --git a/src/tiled/tilesetmodel.cpp b/src/tiled/tilesetmodel.cpp index f5ba0e0233..9ba47bf676 100644 --- a/src/tiled/tilesetmodel.cpp +++ b/src/tiled/tilesetmodel.cpp @@ -206,11 +206,17 @@ bool TilesetModel::dropMimeData(const QMimeData *data, Qt::DropAction action, Tile *TilesetModel::tileAt(const QModelIndex &index) const { if (tileset()->isAtlas()) { - const int tileIndex = index.column() - 1; - if (tileIndex < mTileIds.size() && tileIndex >= 0) { - const int tileId = mTileIds.at(tileIndex); - return tileset()->findTile(tileId); + if (!index.isValid()) + return nullptr; + + const int gridSize = tileset()->tileWidth(); + const QPoint gridPos((index.column() - 1) * gridSize, index.row() * gridSize); + for (Tile *tile : tileset()->tiles()) { + const QPoint snappedPos = snapToGrid(tile->imageRect().bottomLeft(), gridSize); + if (snappedPos == gridPos) + return tile; } + return nullptr; } @@ -229,9 +235,10 @@ QModelIndex TilesetModel::tileIndex(const Tile *tile) const { Q_ASSERT(tile->tileset() == tileset()); if (tileset()->isAtlas()) { - const int tileIndex = mTileIds.indexOf(tile->id()); - Q_ASSERT(tileIndex != -1); - return index(0, tileIndex + 1); + const int gridSize = tileset()->tileWidth(); + const QPoint snappedPos = snapToGrid(tile->imageRect().bottomLeft(), gridSize); + return index(snappedPos.y() / gridSize, + (snappedPos.x() / gridSize) + 1); } const int columnCount = TilesetModel::columnCount(); @@ -315,4 +322,12 @@ void TilesetModel::refreshTileIds() mTileIds.append(tile->id()); } +QPoint TilesetModel::snapToGrid(const QPoint &pos, int gridSize) const +{ + // Snap to nearest grid position, avoiding overlaps + const int x = (pos.x() + gridSize / 2) / gridSize * gridSize; + const int y = (pos.y() + gridSize / 2) / gridSize * gridSize; + return QPoint(x, y); +} + #include "moc_tilesetmodel.cpp" diff --git a/src/tiled/tilesetmodel.h b/src/tiled/tilesetmodel.h index 4f9bf2175e..c3bc776ec8 100644 --- a/src/tiled/tilesetmodel.h +++ b/src/tiled/tilesetmodel.h @@ -130,6 +130,8 @@ public slots: void refreshTileIds(); + QPoint snapToGrid(const QPoint &pos, int gridSize) const; + TilesetDocument *mTilesetDocument; QList mTileIds; int mColumnCountOverride = 0; diff --git a/src/tiled/tilesetview.cpp b/src/tiled/tilesetview.cpp index 23a3438b19..547bc5b4cc 100644 --- a/src/tiled/tilesetview.cpp +++ b/src/tiled/tilesetview.cpp @@ -869,6 +869,15 @@ QModelIndex TilesetView::indexAt(const QPoint &pos) const return QTableView::indexAt(pos); } +void TilesetView::selectionChanged(const QItemSelection &selected, const QItemSelection &deselected) +{ + QTableView::selectionChanged(selected, deselected); + + if (tilesetModel() && tilesetModel()->tileset()->isAtlas()) { + viewport()->update(); + } +} + QRect TilesetView::visualRect(const QModelIndex &index) const { if (!index.isValid()) diff --git a/src/tiled/tilesetview.h b/src/tiled/tilesetview.h index eb5b05077b..51c2d29fc2 100644 --- a/src/tiled/tilesetview.h +++ b/src/tiled/tilesetview.h @@ -119,6 +119,7 @@ class TilesetView : public QTableView void resizeEvent(QResizeEvent *event) override; void paintEvent(QPaintEvent *event) override; QModelIndex indexAt(const QPoint &pos) const override; + void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected) override; QRect visualRect(const QModelIndex &index) const override; private: