Skip to content

Commit f32d11b

Browse files
committedJan 16, 2017
[composer] Use largest map in composition as reference map if no
reference map is explicitly set
1 parent e0934d7 commit f32d11b

File tree

3 files changed

+53
-2
lines changed

3 files changed

+53
-2
lines changed
 

‎src/core/composer/qgscomposition.cpp

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -791,7 +791,24 @@ void QgsComposition::setPrintResolution( const int dpi )
791791

792792
QgsComposerMap* QgsComposition::referenceMap() const
793793
{
794-
return dynamic_cast< QgsComposerMap* >( const_cast< QgsComposerItem* >( getComposerItemByUuid( mWorldFileMapId ) ) );
794+
// prefer explicitly set reference map
795+
if ( QgsComposerMap* map = dynamic_cast< QgsComposerMap* >( const_cast< QgsComposerItem* >( getComposerItemByUuid( mWorldFileMapId ) ) ) )
796+
return map;
797+
798+
// else try to find largest map
799+
QList< const QgsComposerMap* > maps = composerMapItems();
800+
const QgsComposerMap* largestMap = nullptr;
801+
double largestMapArea = 0;
802+
Q_FOREACH ( const QgsComposerMap* map, maps )
803+
{
804+
double area = map->rect().width() * map->rect().height();
805+
if ( area > largestMapArea )
806+
{
807+
largestMapArea = area;
808+
largestMap = map;
809+
}
810+
}
811+
return const_cast< QgsComposerMap* >( largestMap );
795812
}
796813

797814
void QgsComposition::setReferenceMap( QgsComposerMap* map )

‎src/core/composer/qgscomposition.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -424,7 +424,8 @@ class CORE_EXPORT QgsComposition : public QGraphicsScene, public QgsExpressionCo
424424
void setGenerateWorldFile( bool enabled ) { mGenerateWorldFile = enabled; }
425425

426426
/** Returns the map item which will be used to generate corresponding world files when the
427-
* composition is exported, or nullptr if no corresponding map is set.
427+
* composition is exported. If no map was explicitly set via setReferenceMap(), the largest
428+
* map in the composition will be returned (or nullptr if there are no maps in the composition).
428429
* @see setReferenceMap()
429430
* @see generateWorldFile()
430431
*/

‎tests/src/core/testqgscomposition.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ class TestQgsComposition : public QObject
5757
void georeference();
5858
void variablesEdited();
5959
void itemVariablesFunction();
60+
void referenceMap();
6061

6162
private:
6263
QgsComposition *mComposition;
@@ -639,5 +640,37 @@ void TestQgsComposition::itemVariablesFunction()
639640
delete composition;
640641
}
641642

643+
void TestQgsComposition::referenceMap()
644+
{
645+
QgsRectangle extent( 2000, 2800, 2500, 2900 );
646+
QgsMapSettings ms;
647+
ms.setExtent( extent );
648+
QgsComposition* composition = new QgsComposition( ms, QgsProject::instance() );
649+
650+
// no maps
651+
QVERIFY( !composition->referenceMap() );
652+
653+
QgsComposerMap* map = new QgsComposerMap( composition );
654+
map->setNewExtent( extent );
655+
map->setSceneRect( QRectF( 30, 60, 200, 100 ) );
656+
composition->addComposerMap( map );
657+
658+
QCOMPARE( composition->referenceMap(), map );
659+
660+
// add a larger map
661+
QgsComposerMap* map2 = new QgsComposerMap( composition );
662+
map2->setNewExtent( extent );
663+
map2->setSceneRect( QRectF( 30, 60, 250, 150 ) );
664+
composition->addComposerMap( map2 );
665+
666+
QCOMPARE( composition->referenceMap(), map2 );
667+
668+
// explicitly set reference map
669+
composition->setReferenceMap( map );
670+
QCOMPARE( composition->referenceMap(), map );
671+
672+
delete composition;
673+
}
674+
642675
QGSTEST_MAIN( TestQgsComposition )
643676
#include "testqgscomposition.moc"

0 commit comments

Comments
 (0)
Please sign in to comment.