Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions src/libtiled/tileset.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -503,6 +503,17 @@ QList<int> Tileset::relocateTiles(const QList<Tile *> &tiles, int location)
return prevLocations;
}

void Tileset::swapTiles(Tile *tileA, Tile *tileB)
{
const int indexA = mTiles.indexOf(tileA);
const int indexB = mTiles.indexOf(tileB);

Q_ASSERT(indexA != -1);
Q_ASSERT(indexB != -1);

mTiles.swapItemsAt(indexA, indexB);
}

bool Tileset::anyTileOutOfOrder() const
{
int tileId = 0;
Expand Down
1 change: 1 addition & 0 deletions src/libtiled/tileset.h
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,7 @@ class TILEDSHARED_EXPORT Tileset : public Object, public QEnableSharedFromThis<T
void removeTiles(const QList<Tile *> &tiles);
void deleteTile(int id);
QList<int> relocateTiles(const QList<Tile *> &tiles, int location);
void swapTiles(Tile *tileA, Tile *tileB);

bool anyTileOutOfOrder() const;
void resetTileOrder();
Expand Down
16 changes: 16 additions & 0 deletions src/tiled/relocatetiles.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,4 +53,20 @@ void RelocateTiles::redo()
mPrevLocations = mTilesetDocument->relocateTiles(mTiles, mLocation);
}

SwapTilesetTiles::SwapTilesetTiles(TilesetDocument *tilesetDocument,
Tile *tileA,
Tile *tileB)
: QUndoCommand(QCoreApplication::translate("Undo Commands",
"Swap Tiles"))
, mTilesetDocument(tilesetDocument)
, mTileA(tileA)
, mTileB(tileB)
{
}

void SwapTilesetTiles::swap()
{
mTilesetDocument->swapTiles(mTileA, mTileB);
}

} // namespace Tiled
21 changes: 21 additions & 0 deletions src/tiled/relocatetiles.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,4 +57,25 @@ class RelocateTiles : public QUndoCommand
QList<int> mPrevLocations;
};

/**
* A command that swaps the display order of two tiles in a tileset.
*/
class SwapTilesetTiles : public QUndoCommand
{
public:
SwapTilesetTiles(TilesetDocument *tilesetDocument,
Tile *tileA,
Tile *tileB);

void undo() override { swap(); }
void redo() override { swap(); }

private:
void swap();

TilesetDocument * const mTilesetDocument;
Tile * const mTileA;
Tile * const mTileB;
};

} // namespace Tiled
6 changes: 6 additions & 0 deletions src/tiled/tilesetdocument.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -367,6 +367,12 @@ QList<int> TilesetDocument::relocateTiles(const QList<Tile *> &tiles, int locati
return prevLocations;
}

void TilesetDocument::swapTiles(Tile *tileA, Tile *tileB)
{
mTileset->swapTiles(tileA, tileB);
emit tilesetChanged(mTileset.data());
}
Comment on lines +370 to +374

void TilesetDocument::setSelectedTiles(const QList<Tile*> &selectedTiles)
{
mSelectedTiles = selectedTiles;
Expand Down
1 change: 1 addition & 0 deletions src/tiled/tilesetdocument.h
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ class TilesetDocument final : public Document
void addTiles(const QList<Tile*> &tiles);
void removeTiles(const QList<Tile*> &tiles);
QList<int> relocateTiles(const QList<Tile *> &tiles, int location);
void swapTiles(Tile *tileA, Tile *tileB);

const QList<Tile*> &selectedTiles() const;
void setSelectedTiles(const QList<Tile*> &selectedTiles);
Expand Down
15 changes: 15 additions & 0 deletions src/tiled/tileseteditor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
#endif
#include "preferences.h"
#include "propertiesdock.h"
#include "relocatetiles.h"
#include "scriptmanager.h"
#include "session.h"
#include "templatesdock.h"
Expand Down Expand Up @@ -306,6 +307,7 @@ void TilesetEditor::addDocument(Document *document)
connect(view, &TilesetView::wangColorImageSelected, this, &TilesetEditor::setWangColorImage);
connect(view, &TilesetView::wangIdUsedChanged, mWangDock, &WangDock::onWangIdUsedChanged);
connect(view, &TilesetView::currentWangIdChanged, mWangDock, &WangDock::onCurrentWangIdChanged);
connect(view, &TilesetView::swapTilesRequested, this, &TilesetEditor::swapTiles);

QItemSelectionModel *s = view->selectionModel();
connect(s, &QItemSelectionModel::selectionChanged, this, &TilesetEditor::selectionChanged);
Expand Down Expand Up @@ -838,6 +840,19 @@ void TilesetEditor::addTiles(const QList<QUrl> &urls)
mCurrentTilesetDocument->undoStack()->push(new AddTiles(mCurrentTilesetDocument, tiles));
}

void TilesetEditor::swapTiles(Tile *tileA, Tile *tileB)
{
if (!mCurrentTilesetDocument || !tileA || !tileB || tileA == tileB)
return;

Tileset *tileset = mCurrentTilesetDocument->tileset().data();
if (tileA->tileset() != tileset || tileB->tileset() != tileset)
return;

mCurrentTilesetDocument->undoStack()->push(
new SwapTilesetTiles(mCurrentTilesetDocument, tileA, tileB));
}

static bool hasTileReferences(MapDocument *mapDocument,
std::function<bool(const Cell &)> condition)
{
Expand Down
1 change: 1 addition & 0 deletions src/tiled/tileseteditor.h
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ class TilesetEditor final : public Editor
void openAddTilesDialog();
void addTiles(const QList<QUrl> &urls);
void removeTiles();
void swapTiles(Tile *tileA, Tile *tileB);

void setRelocateTiles(bool relocateTiles);
void setEditCollision(bool editCollision);
Expand Down
7 changes: 7 additions & 0 deletions src/tiled/tilesetview.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -802,6 +802,13 @@ void TilesetView::contextMenuEvent(QContextMenuEvent *event)
}

if (mTilesetDocument) {
const bool exactlyTwoTilesSelected =
(selectionModel()->selectedIndexes().size() == 2);

QAction *swapTilesAction = menu.addAction(tr("&Swap Tiles"));
swapTilesAction->setEnabled(exactlyTwoTilesSelected);
Comment on lines +805 to +809
connect(swapTilesAction, &QAction::triggered, this, &TilesetView::swapTiles);

const QIcon propIcon(QStringLiteral(":images/16/document-properties.png"));
QAction *tileProperties = menu.addAction(propIcon,
tr("Tile &Properties..."));
Expand Down
Loading