diff --git a/src/libtiled/minimaprenderer.cpp b/src/libtiled/minimaprenderer.cpp index 9fa40a33cc..023f1637c9 100644 --- a/src/libtiled/minimaprenderer.cpp +++ b/src/libtiled/minimaprenderer.cpp @@ -147,11 +147,11 @@ void MiniMapRenderer::renderToImage(QImage& image, RenderFlags renderFlags) cons if (image.isNull()) return; - bool drawObjects = renderFlags.testFlag(RenderFlag::DrawMapObjects); - bool drawTileLayers = renderFlags.testFlag(RenderFlag::DrawTileLayers); - bool drawImageLayers = renderFlags.testFlag(RenderFlag::DrawImageLayers); - bool drawTileGrid = renderFlags.testFlag(RenderFlag::DrawGrid); - bool visibleLayersOnly = renderFlags.testFlag(RenderFlag::IgnoreInvisibleLayer); + const bool drawObjects = renderFlags.testFlag(RenderFlag::DrawMapObjects); + const bool drawTileLayers = renderFlags.testFlag(RenderFlag::DrawTileLayers); + const bool drawImageLayers = renderFlags.testFlag(RenderFlag::DrawImageLayers); + const bool drawTileGrid = renderFlags.testFlag(RenderFlag::DrawGrid); + const bool visibleLayersOnly = renderFlags.testFlag(RenderFlag::IgnoreInvisibleLayer); QRect mapBoundingRect = mRenderer->mapBoundingRect(); @@ -164,8 +164,8 @@ void MiniMapRenderer::renderToImage(QImage& image, RenderFlags renderFlags) cons mapSize.setHeight(mapSize.height() + margins.top() + margins.bottom()); // Determine the largest possible scale - qreal scale = qMin(static_cast(image.width()) / mapSize.width(), - static_cast(image.height()) / mapSize.height()); + const qreal scale = qMin(static_cast(image.width()) / mapSize.width(), + static_cast(image.height()) / mapSize.height()); if (renderFlags.testFlag(DrawBackground) && mMap->backgroundColor().isValid()) image.fill(mMap->backgroundColor()); @@ -176,9 +176,9 @@ void MiniMapRenderer::renderToImage(QImage& image, RenderFlags renderFlags) cons painter.setRenderHints(QPainter::SmoothPixmapTransform, renderFlags.testFlag(SmoothPixmapTransform)); // Center the map in the requested size - QSize scaledMapSize = mapSize * scale; - QPointF centerOffset((image.width() - scaledMapSize.width()) / 2, - (image.height() - scaledMapSize.height()) / 2); + const QSize scaledMapSize = mapSize * scale; + const QPointF centerOffset((image.width() - scaledMapSize.width()) / 2, + (image.height() - scaledMapSize.height()) / 2); painter.translate(centerOffset); painter.scale(scale, scale); @@ -252,4 +252,17 @@ void MiniMapRenderer::renderToImage(QImage& image, RenderFlags renderFlags) cons if (drawTileGrid) mRenderer->drawGrid(&painter, mapBoundingRect, mGridColor); + + if (drawObjects && mRenderObjectLabelCallback) { + for (const Layer *layer : mMap->objectGroups()) { + if (visibleLayersOnly && layer->isHidden()) + continue; + + const ObjectGroup *objectGroup = static_cast(layer); + + for (const MapObject *object : objectGroup->objects()) + if (object->isVisible()) + mRenderObjectLabelCallback(painter, object, *mRenderer); + } + } } diff --git a/src/libtiled/minimaprenderer.h b/src/libtiled/minimaprenderer.h index 0c3e7a94d8..659ec72710 100644 --- a/src/libtiled/minimaprenderer.h +++ b/src/libtiled/minimaprenderer.h @@ -34,14 +34,19 @@ #include +#include + namespace Tiled { class Map; +class MapObject; class MapRenderer; class TILEDSHARED_EXPORT MiniMapRenderer { public: + using RenderObjectLabelCallback = std::function; + enum RenderFlag { DrawMapObjects = 0x0001, DrawTileLayers = 0x0002, @@ -59,6 +64,7 @@ class TILEDSHARED_EXPORT MiniMapRenderer ~MiniMapRenderer(); void setGridColor(const QColor &color); + void setRenderObjectLabelCallback(const RenderObjectLabelCallback &cb); QSize mapSize() const; @@ -74,6 +80,7 @@ class TILEDSHARED_EXPORT MiniMapRenderer #else QColor mGridColor = QColorConstants::Black; #endif + RenderObjectLabelCallback mRenderObjectLabelCallback; }; @@ -82,6 +89,11 @@ inline void MiniMapRenderer::setGridColor(const QColor &color) mGridColor = color; } +inline void MiniMapRenderer::setRenderObjectLabelCallback(const RenderObjectLabelCallback &cb) +{ + mRenderObjectLabelCallback = cb; +} + } // namespace Tiled Q_DECLARE_OPERATORS_FOR_FLAGS(Tiled::MiniMapRenderer::RenderFlags) diff --git a/src/tiled/exportasimagedialog.cpp b/src/tiled/exportasimagedialog.cpp index cb5b299ed3..5cc7d5934c 100644 --- a/src/tiled/exportasimagedialog.cpp +++ b/src/tiled/exportasimagedialog.cpp @@ -29,6 +29,7 @@ #include "maprenderer.h" #include "minimaprenderer.h" #include "objectgroup.h" +#include "objectselectionitem.h" #include "preferences.h" #include "session.h" #include "tilelayer.h" @@ -44,6 +45,7 @@ namespace session { static SessionOption visibleLayersOnly { "exportAsImage.visibleLayersOnly", true }; static SessionOption useCurrentScale { "exportAsImage.useCurrentScale", true }; static SessionOption drawTileGrid { "exportAsImage.drawTileGrid", false }; +static SessionOption drawObjectLabels { "exportAsImage.drawObjectLabels", false }; static SessionOption includeBackgroundColor { "exportAsImage.includeBackgroundColor", false }; } // namespace session @@ -92,6 +94,7 @@ ExportAsImageDialog::ExportAsImageDialog(MapDocument *mapDocument, mUi->visibleLayersOnly->setChecked(session::visibleLayersOnly); mUi->currentZoomLevel->setChecked(session::useCurrentScale); mUi->drawTileGrid->setChecked(session::drawTileGrid); + mUi->drawObjectLabels->setChecked(session::drawObjectLabels); mUi->includeBackgroundColor->setChecked(session::includeBackgroundColor); connect(mUi->browseButton, &QAbstractButton::clicked, this, &ExportAsImageDialog::browse); @@ -136,11 +139,31 @@ void ExportAsImageDialog::accept() session::visibleLayersOnly = mUi->visibleLayersOnly->isChecked(); session::useCurrentScale = mUi->currentZoomLevel->isChecked(); session::drawTileGrid = mUi->drawTileGrid->isChecked(); + session::drawObjectLabels = mUi->drawObjectLabels->isChecked(); session::includeBackgroundColor = mUi->includeBackgroundColor->isChecked(); MiniMapRenderer miniMapRenderer(mMapDocument->map()); miniMapRenderer.setGridColor(Preferences::instance()->gridColor()); + if (session::drawObjectLabels) { + miniMapRenderer.setRenderObjectLabelCallback([] (QPainter &painter, const MapObject *object, const MapRenderer &renderer) { + if (object->name().isEmpty()) + return; + + MapObjectLabel label { object }; + label.syncWithMapObject(renderer); + + const auto invertScale = 1 / renderer.painterScale(); + painter.save(); + painter.translate(label.pos()); + painter.scale(invertScale, invertScale); + + label.paint(&painter, nullptr, nullptr); + + painter.restore(); + }); + } + MiniMapRenderer::RenderFlags renderFlags(MiniMapRenderer::DrawTileLayers | MiniMapRenderer::DrawMapObjects | MiniMapRenderer::DrawImageLayers); diff --git a/src/tiled/exportasimagedialog.ui b/src/tiled/exportasimagedialog.ui index 012796d19a..d2a3b6b0b3 100644 --- a/src/tiled/exportasimagedialog.ui +++ b/src/tiled/exportasimagedialog.ui @@ -7,7 +7,7 @@ 0 0 337 - 231 + 402 @@ -76,6 +76,13 @@ + + + + Draw object &names + + + diff --git a/src/tiled/objectselectionitem.cpp b/src/tiled/objectselectionitem.cpp index c4ae84018f..bdb2df0cb0 100644 --- a/src/tiled/objectselectionitem.cpp +++ b/src/tiled/objectselectionitem.cpp @@ -145,33 +145,14 @@ void MapObjectOutline::timerEvent(QTimerEvent *event) } -class MapObjectLabel : public QGraphicsItem +MapObjectLabel::MapObjectLabel(const MapObject *object, QGraphicsItem *parent) + : QGraphicsItem(parent) + , mObject(object) + , mColor(mObject->effectiveColor()) { -public: - MapObjectLabel(MapObject *object, QGraphicsItem *parent = nullptr) - : QGraphicsItem(parent) - , mObject(object) - , mColor(mObject->effectiveColor()) - { - setFlags(QGraphicsItem::ItemIgnoresTransformations | - QGraphicsItem::ItemIgnoresParentOpacity); - } - - MapObject *mapObject() const { return mObject; } - void syncWithMapObject(const MapRenderer &renderer); - void updateColor(); - - QRectF boundingRect() const override; - void paint(QPainter *painter, - const QStyleOptionGraphicsItem *, - QWidget *) override; - -private: - QRectF mBoundingRect; - QPointF mTextPos; - MapObject *mObject; - QColor mColor; -}; + setFlags(QGraphicsItem::ItemIgnoresTransformations | + QGraphicsItem::ItemIgnoresParentOpacity); +} void MapObjectLabel::syncWithMapObject(const MapRenderer &renderer) { @@ -611,7 +592,7 @@ void ObjectSelectionItem::tilesetTilePositioningChanged(Tileset *tileset) void ObjectSelectionItem::tileTypeChanged(Tile *tile) { - auto isObjectAffected = [tile] (MapObject *object) -> bool { + auto isObjectAffected = [tile] (const MapObject *object) -> bool { if (!object->type().isEmpty()) return false; diff --git a/src/tiled/objectselectionitem.h b/src/tiled/objectselectionitem.h index 6872e1a38e..eb2be42d44 100644 --- a/src/tiled/objectselectionitem.h +++ b/src/tiled/objectselectionitem.h @@ -32,15 +32,36 @@ namespace Tiled { class GroupLayer; class Layer; class MapObject; +class MapRenderer; class Tile; class Tileset; class MapDocument; class MapObjectItem; -class MapObjectLabel; class MapObjectOutline; class ObjectReferenceItem; +class MapObjectLabel : public QGraphicsItem +{ +public: + MapObjectLabel(const MapObject *object, QGraphicsItem *parent = nullptr); + + const MapObject *mapObject() const { return mObject; } + void syncWithMapObject(const MapRenderer &renderer); + void updateColor(); + + QRectF boundingRect() const override; + void paint(QPainter *painter, + const QStyleOptionGraphicsItem *, + QWidget *) override; + +private: + QRectF mBoundingRect; + QPointF mTextPos; + const MapObject *mObject; + QColor mColor; +}; + /** * A graphics item displaying object selection. *