Skip to content

Commit b40e3c0

Browse files
committed
[composer] Ensure that extent of new map items is centered on current centre of map
1 parent 52c59da commit b40e3c0

File tree

3 files changed

+32
-2
lines changed

3 files changed

+32
-2
lines changed

src/app/composer/qgscomposermapwidget.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ void QgsComposerMapWidget::on_mSetToMapCanvasExtentButton_clicked()
185185
newExtent.setYMinimum( newExtent.yMinimum() - deltaHeight / 2 );
186186
newExtent.setYMaximum( newExtent.yMaximum() + deltaHeight / 2 );
187187
}
188-
else if ( currentWidthHeightRatio > newWidthHeightRatio )
188+
else
189189
{
190190
//enlarge width of new extent, ensuring the map center stays the same
191191
double newWidth = currentWidthHeightRatio * newExtent.height();

src/core/composer/qgscomposermap.cpp

+27-1
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,10 @@ QgsComposerMap::QgsComposerMap( QgsComposition *composition, int x, int y, int w
8585
//calculate mExtent based on width/height ratio and map canvas extent
8686
if ( mMapRenderer )
8787
{
88-
mExtent = mMapRenderer->extent();
88+
QgsRectangle mapExtent = mMapRenderer->extent();
89+
//make extent make item shape while keeping centre unchanged
90+
adjustExtentToItemShape( width, height, mapExtent );
91+
mExtent = mapExtent;
8992
}
9093
setSceneRect( QRectF( x, y, width, height ) );
9194
setToolTip( tr( "Map %1" ).arg( mId ) );
@@ -126,6 +129,29 @@ QgsComposerMap::QgsComposerMap( QgsComposition *composition )
126129
initGridAnnotationFormatFromProject();
127130
}
128131

132+
void QgsComposerMap::adjustExtentToItemShape( double itemWidth, double itemHeight, QgsRectangle& extent ) const
133+
{
134+
double itemWidthHeightRatio = itemWidth / itemHeight;
135+
double newWidthHeightRatio = extent.width() / extent.height();
136+
137+
if ( itemWidthHeightRatio <= newWidthHeightRatio )
138+
{
139+
//enlarge height of new extent, ensuring the map center stays the same
140+
double newHeight = extent.width() / itemWidthHeightRatio;
141+
double deltaHeight = newHeight - extent.height();
142+
extent.setYMinimum( extent.yMinimum() - deltaHeight / 2 );
143+
extent.setYMaximum( extent.yMaximum() + deltaHeight / 2 );
144+
}
145+
else
146+
{
147+
//enlarge width of new extent, ensuring the map center stays the same
148+
double newWidth = itemWidthHeightRatio * extent.height();
149+
double deltaWidth = newWidth - extent.width();
150+
extent.setXMinimum( extent.xMinimum() - deltaWidth / 2 );
151+
extent.setXMaximum( extent.xMaximum() + deltaWidth / 2 );
152+
}
153+
}
154+
129155
void QgsComposerMap::extentCenteredOnOverview( QgsRectangle& extent ) const
130156
{
131157
extent = mExtent;

src/core/composer/qgscomposermap.h

+4
Original file line numberDiff line numberDiff line change
@@ -479,6 +479,10 @@ class CORE_EXPORT QgsComposerMap : public QgsComposerItem
479479
/**True if annotation items, rubber band, etc. from the main canvas should be displayed*/
480480
bool mDrawCanvasItems;
481481

482+
/**Adjusts an extent rectangle to match the provided item width and height, so that extent
483+
* center of extent remains the same */
484+
void adjustExtentToItemShape( double itemWidth, double itemHeight, QgsRectangle& extent ) const;
485+
482486
/**Draws the map grid*/
483487
void drawGrid( QPainter* p );
484488
void drawGridFrame( QPainter* p, const QList< QPair< double, QLineF > >& hLines, const QList< QPair< double, QLineF > >& vLines );

0 commit comments

Comments
 (0)