diff --git a/NEWS.md b/NEWS.md index 6f354c0854..66a375fcb9 100644 --- a/NEWS.md +++ b/NEWS.md @@ -8,6 +8,8 @@ * Added button to toggle Terrain Brush to full tile mode (by Finlay Pearson, #3407) * Added square selection and expand-from-center to Rectangular Select tool (#4201) * Added status info for various Stamp Brush, Terrain Brush and Eraser modes (#3092, #4201) +* Added Escape to clear tile selection when any tile related tool is selected (#4243) +* Added Escape to cancel tile selection and shape drawing operations * Added export plugin for Remixed Dungeon (by Mikhael Danilov, #4158) * Added "World > World Properties" menu action (with dogboydog, #4190) * Added Delete shortcut to Remove Tiles action by default and avoid ambiguity (#4201) diff --git a/docs/reference/support-for-tmx-maps.rst b/docs/reference/support-for-tmx-maps.rst index 9d2a6301f5..fb6d801ae1 100644 --- a/docs/reference/support-for-tmx-maps.rst +++ b/docs/reference/support-for-tmx-maps.rst @@ -388,6 +388,13 @@ Monkey X rendering TMX files. Supports orthogonal and isometric maps as both CSV and Base64 (uncompressed). +NICO Game Framework +~~~~~~~~~~~~~~~~~~~ + +- `NICO `__ is a game framework for the Nim + programming language that supports loading and saving Tiled maps in JSON format + (see the `Tilemap API documentation `__). + Node.js ~~~~~~~ diff --git a/src/tiled/abstracttiletool.cpp b/src/tiled/abstracttiletool.cpp index 77a38062c2..56c6f9714d 100644 --- a/src/tiled/abstracttiletool.cpp +++ b/src/tiled/abstracttiletool.cpp @@ -21,6 +21,7 @@ #include "abstracttiletool.h" #include "brushitem.h" +#include "changeselectedarea.h" #include "map.h" #include "mapdocument.h" #include "maprenderer.h" @@ -152,6 +153,20 @@ void AbstractTileTool::mousePressed(QGraphicsSceneMouseEvent *event) event->ignore(); } +void AbstractTileTool::keyPressed(QKeyEvent *event) +{ + if (event->key() == Qt::Key_Escape) { + MapDocument *document = mapDocument(); + if (document && !document->selectedArea().isEmpty()) { + QUndoCommand *cmd = new ChangeSelectedArea(document, QRegion()); + document->undoStack()->push(cmd); + return; + } + } + + AbstractTool::keyPressed(event); +} + void AbstractTileTool::mapDocumentChanged(MapDocument *oldDocument, MapDocument *newDocument) { diff --git a/src/tiled/abstracttiletool.h b/src/tiled/abstracttiletool.h index 8cf38b5421..db8362c3bc 100644 --- a/src/tiled/abstracttiletool.h +++ b/src/tiled/abstracttiletool.h @@ -60,6 +60,8 @@ class AbstractTileTool : public AbstractTool void mouseMoved(const QPointF &pos, Qt::KeyboardModifiers modifiers) override; void mousePressed(QGraphicsSceneMouseEvent *event) override; + void keyPressed(QKeyEvent *event) override; + protected: void mapDocumentChanged(MapDocument *oldDocument, MapDocument *newDocument) override; diff --git a/src/tiled/shapefilltool.cpp b/src/tiled/shapefilltool.cpp index 22db8c4a02..3f44dd0b28 100644 --- a/src/tiled/shapefilltool.cpp +++ b/src/tiled/shapefilltool.cpp @@ -28,11 +28,10 @@ #include #include +#include #include #include -#include - using namespace Tiled; ShapeFillTool::ShapeFillTool(QObject *parent) @@ -86,9 +85,7 @@ void ShapeFillTool::mousePressed(QGraphicsSceneMouseEvent *event) { // Right-click cancels drawing a shape if (mToolBehavior == MakingShape && event->button() == Qt::RightButton) { - mToolBehavior = Free; - clearOverlay(); - updateStatusInfo(); + cancelMakingShape(); return; } @@ -139,6 +136,18 @@ void ShapeFillTool::modifiersChanged(Qt::KeyboardModifiers modifiers) updateFillOverlay(); } +void ShapeFillTool::keyPressed(QKeyEvent *event) +{ + if (event->key() == Qt::Key_Escape) { + if (mToolBehavior == MakingShape) { + cancelMakingShape(); + return; + } + } + + AbstractTileFillTool::keyPressed(event); +} + void ShapeFillTool::languageChanged() { setName(tr("Shape Fill Tool")); @@ -153,7 +162,7 @@ void ShapeFillTool::populateToolBar(QToolBar *toolBar) { AbstractTileFillTool::populateToolBar(toolBar); - QActionGroup *actionGroup = new QActionGroup(toolBar); + auto *actionGroup = new QActionGroup(toolBar); actionGroup->addAction(mRectFill); actionGroup->addAction(mCircleFill); @@ -194,6 +203,13 @@ void ShapeFillTool::setCurrentShape(Shape shape) mCurrentShape = shape; } +void ShapeFillTool::cancelMakingShape() +{ + mToolBehavior = Free; + clearOverlay(); + updateStatusInfo(); +} + void ShapeFillTool::updateFillOverlay() { int dx = tilePosition().x() - mStartCorner.x(); diff --git a/src/tiled/shapefilltool.h b/src/tiled/shapefilltool.h index 0db7c5199f..03270c06f1 100644 --- a/src/tiled/shapefilltool.h +++ b/src/tiled/shapefilltool.h @@ -41,6 +41,8 @@ class ShapeFillTool : public AbstractTileFillTool void modifiersChanged(Qt::KeyboardModifiers) override; + void keyPressed(QKeyEvent *event) override; + void languageChanged() override; void populateToolBar(QToolBar *toolBar) override; @@ -73,6 +75,7 @@ class ShapeFillTool : public AbstractTileFillTool void setActionsEnabled(bool enabled); void setCurrentShape(Shape shape); + void cancelMakingShape(); void updateFillOverlay(); }; diff --git a/src/tiled/tileselectiontool.cpp b/src/tiled/tileselectiontool.cpp index 0125a4bad9..4fdc30fa97 100644 --- a/src/tiled/tileselectiontool.cpp +++ b/src/tiled/tileselectiontool.cpp @@ -26,6 +26,7 @@ #include "mapscene.h" #include +#include using namespace Tiled; @@ -174,6 +175,22 @@ void TileSelectionTool::modifiersChanged(Qt::KeyboardModifiers modifiers) mLastModifiers = modifiers; } +void TileSelectionTool::keyPressed(QKeyEvent *event) +{ + if (event->key() == Qt::Key_Escape) { + if (mSelecting) { + // Cancel the ongoing selection + mSelecting = false; + mMouseDown = false; + brushItem()->setTileRegion(QRegion()); + updateStatusInfo(); + return; + } + } + + AbstractTileSelectionTool::keyPressed(event); +} + void TileSelectionTool::languageChanged() { setName(tr("Rectangular Select")); diff --git a/src/tiled/tileselectiontool.h b/src/tiled/tileselectiontool.h index 0103c9692b..a3dea2b9ef 100644 --- a/src/tiled/tileselectiontool.h +++ b/src/tiled/tileselectiontool.h @@ -37,6 +37,8 @@ class TileSelectionTool : public AbstractTileSelectionTool void modifiersChanged(Qt::KeyboardModifiers modifiers) override; + void keyPressed(QKeyEvent *event) override; + void languageChanged() override; protected: