diff --git a/src/core/layout/qgslayoutitemmap.cpp b/src/core/layout/qgslayoutitemmap.cpp index 574bafd5d16..841eb7ce2d7 100644 --- a/src/core/layout/qgslayoutitemmap.cpp +++ b/src/core/layout/qgslayoutitemmap.cpp @@ -50,8 +50,7 @@ QgsLayoutItemMap::QgsLayoutItemMap( QgsLayout *layout ) connect( this, &QgsLayoutItem::sizePositionChanged, this, [ = ] { - updateBoundingRect(); - update(); + shapeChanged(); } ); # if 0 @@ -945,6 +944,29 @@ void QgsLayoutItemMap::painterJobFinished() update(); } +void QgsLayoutItemMap::shapeChanged() +{ + // keep center as center + QgsPointXY oldCenter = mExtent.center(); + + double w = rect().width(); + double h = rect().height(); + + // keep same width as before + double newWidth = mExtent.width(); + // but scale height to match item's aspect ratio + double newHeight = newWidth * h / w; + + mExtent = QgsRectangle::fromCenterAndSize( oldCenter, newWidth, newHeight ); + + //recalculate data defined scale and extents + refreshMapExtents(); + updateBoundingRect(); + invalidateCache(); + emit changed(); + emit extentChanged(); +} + void QgsLayoutItemMap::connectUpdateSlot() { //connect signal from layer registry to update in case of new or deleted layers diff --git a/src/core/layout/qgslayoutitemmap.h b/src/core/layout/qgslayoutitemmap.h index 2fa281fa415..38e1ed63877 100644 --- a/src/core/layout/qgslayoutitemmap.h +++ b/src/core/layout/qgslayoutitemmap.h @@ -507,6 +507,8 @@ class CORE_EXPORT QgsLayoutItemMap : public QgsLayoutItem void painterJobFinished(); + void shapeChanged(); + private: @@ -619,11 +621,6 @@ class CORE_EXPORT QgsLayoutItemMap : public QgsLayoutItem //! True if annotation items, rubber band, etc. from the main canvas should be displayed bool mDrawAnnotations = true; - /** - * Adjusts an extent rectangle to match the provided item width and height, so that extent - * center of extent remains the same */ - void adjustExtentToItemShape( double itemWidth, double itemHeight, QgsRectangle &extent ) const; - //! True if map is being controlled by an atlas bool mAtlasDriven = false; //! Current atlas scaling mode