Skip to content

Commit

Permalink
Fix selection
Browse files Browse the repository at this point in the history
Signed-off-by: Tomas Slusny <[email protected]>
  • Loading branch information
deathbeam committed Feb 12, 2025
1 parent ce435b2 commit 1e633cb
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 7 deletions.
29 changes: 22 additions & 7 deletions src/tiled/tilesetmodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand All @@ -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();
Expand Down Expand Up @@ -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"
2 changes: 2 additions & 0 deletions src/tiled/tilesetmodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,8 @@ public slots:

void refreshTileIds();

QPoint snapToGrid(const QPoint &pos, int gridSize) const;

TilesetDocument *mTilesetDocument;
QList<int> mTileIds;
int mColumnCountOverride = 0;
Expand Down
9 changes: 9 additions & 0 deletions src/tiled/tilesetview.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand Down
1 change: 1 addition & 0 deletions src/tiled/tilesetview.h
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down

0 comments on commit 1e633cb

Please sign in to comment.