From 1556185d7ee1ce4711a6c32e83f2287855ef258f Mon Sep 17 00:00:00 2001 From: Hugo Mercier Date: Mon, 17 Jun 2013 14:05:09 +0200 Subject: [PATCH 1/5] Add autocentering of overview Work funded by Tuscany Region - SITA. Contract "Support to the use of GFOSS (Geographic Free and Open Source Software) Desktop tools" (CIG Z3B06FA6D7). --- src/app/composer/qgscomposermapwidget.cpp | 11 ++ src/app/composer/qgscomposermapwidget.h | 1 + src/core/composer/qgscomposermap.cpp | 126 ++++++++++++++++------ src/core/composer/qgscomposermap.h | 15 +++ src/ui/qgscomposermapwidgetbase.ui | 7 ++ 5 files changed, 126 insertions(+), 34 deletions(-) diff --git a/src/app/composer/qgscomposermapwidget.cpp b/src/app/composer/qgscomposermapwidget.cpp index 0c0ab7c82bd..566fb3587f7 100644 --- a/src/app/composer/qgscomposermapwidget.cpp +++ b/src/app/composer/qgscomposermapwidget.cpp @@ -303,6 +303,8 @@ void QgsComposerMapWidget::updateGuiElements() mOverviewBlendModeComboBox->setBlendMode( mComposerMap->overviewBlendMode() ); //overview inverted mOverviewInvertCheckbox->setChecked( mComposerMap->overviewInverted() ); + //center overview + mOverviewCenterCheckbox->setChecked( mComposerMap->overviewCentered() ); //grid if ( mComposerMap->gridEnabled() ) @@ -452,6 +454,7 @@ void QgsComposerMapWidget::blockAllSignals( bool b ) mOverviewFrameStyleButton->blockSignals( b ); mOverviewBlendModeComboBox->blockSignals( b ); mOverviewInvertCheckbox->blockSignals( b ); + mOverviewCenterCheckbox->blockSignals( b ); } void QgsComposerMapWidget::on_mUpdatePreviewButton_clicked() @@ -591,6 +594,14 @@ void QgsComposerMapWidget::on_mOverviewInvertCheckbox_toggled( bool state ) } } +void QgsComposerMapWidget::on_mOverviewCenterCheckbox_toggled( bool state ) +{ + if ( mComposerMap ) + { + mComposerMap->setOverviewCentered( state ); + } +} + void QgsComposerMapWidget::on_mGridCheckBox_toggled( bool state ) { if ( !mComposerMap ) diff --git a/src/app/composer/qgscomposermapwidget.h b/src/app/composer/qgscomposermapwidget.h index d424d1e1829..7604615c0e2 100644 --- a/src/app/composer/qgscomposermapwidget.h +++ b/src/app/composer/qgscomposermapwidget.h @@ -46,6 +46,7 @@ class QgsComposerMapWidget: public QWidget, private Ui::QgsComposerMapWidgetBase void on_mOverviewFrameStyleButton_clicked(); void on_mOverviewBlendModeComboBox_currentIndexChanged( int index ); void on_mOverviewInvertCheckbox_toggled( bool state ); + void on_mOverviewCenterCheckbox_toggled( bool state ); void on_mXMinLineEdit_editingFinished(); void on_mXMaxLineEdit_editingFinished(); diff --git a/src/core/composer/qgscomposermap.cpp b/src/core/composer/qgscomposermap.cpp index bdcc733c3e7..f0efea656da 100644 --- a/src/core/composer/qgscomposermap.cpp +++ b/src/core/composer/qgscomposermap.cpp @@ -41,7 +41,8 @@ QgsComposerMap::QgsComposerMap( QgsComposition *composition, int x, int y, int width, int height ) : QgsComposerItem( x, y, width, height, composition ), mKeepLayerSet( false ), - mOverviewFrameMapId( -1 ), mOverviewBlendMode( QPainter::CompositionMode_SourceOver ), mOverviewInverted( false ), mGridEnabled( false ), mGridStyle( Solid ), + mOverviewFrameMapId( -1 ), mOverviewBlendMode( QPainter::CompositionMode_SourceOver ), mOverviewInverted( false ), mOverviewCentered( false ), + mGridEnabled( false ), mGridStyle( Solid ), mGridIntervalX( 0.0 ), mGridIntervalY( 0.0 ), mGridOffsetX( 0.0 ), mGridOffsetY( 0.0 ), mGridAnnotationFontColor( QColor( 0, 0, 0 ) ), mGridAnnotationPrecision( 3 ), mShowGridAnnotation( false ), mGridBlendMode( QPainter::CompositionMode_SourceOver ), mLeftGridAnnotationPosition( OutsideMapFrame ), mRightGridAnnotationPosition( OutsideMapFrame ), @@ -86,7 +87,8 @@ QgsComposerMap::QgsComposerMap( QgsComposition *composition, int x, int y, int w QgsComposerMap::QgsComposerMap( QgsComposition *composition ) : QgsComposerItem( 0, 0, 10, 10, composition ), mKeepLayerSet( false ), mOverviewFrameMapId( -1 ), - mOverviewBlendMode( QPainter::CompositionMode_SourceOver ), mOverviewInverted( false ), mGridEnabled( false ), mGridStyle( Solid ), + mOverviewBlendMode( QPainter::CompositionMode_SourceOver ), mOverviewInverted( false ), mOverviewCentered( false ), + mGridEnabled( false ), mGridStyle( Solid ), mGridIntervalX( 0.0 ), mGridIntervalY( 0.0 ), mGridOffsetX( 0.0 ), mGridOffsetY( 0.0 ), mGridAnnotationFontColor( QColor( 0, 0, 0 ) ), mGridAnnotationPrecision( 3 ), mShowGridAnnotation( false ), mGridBlendMode( QPainter::CompositionMode_SourceOver ), mLeftGridAnnotationPosition( OutsideMapFrame ), mRightGridAnnotationPosition( OutsideMapFrame ), @@ -116,6 +118,28 @@ QgsComposerMap::QgsComposerMap( QgsComposition *composition ) initGridAnnotationFormatFromProject(); } +void QgsComposerMap::extentCenteredOnOverview( QgsRectangle& extent ) const +{ + extent = mExtent; + if ( ! mOverviewCentered ) { + return; + } + + if ( mOverviewFrameMapId != -1 ) { + const QgsComposerMap* overviewFrameMap = mComposition->getComposerMapById( mOverviewFrameMapId ); + QgsRectangle otherExtent = overviewFrameMap->extent(); + + if ( ! mExtent.contains( otherExtent ) ) { + QgsPoint center = otherExtent.center(); + QgsRectangle movedExtent( center.x() - mExtent.width() / 2, + center.y() - mExtent.height() / 2, + center.x() - mExtent.width() / 2 + mExtent.width(), + center.y() - mExtent.height() / 2 + mExtent.height() ); + extent = movedExtent; + } + } +} + QgsComposerMap::~QgsComposerMap() { delete mOverviewFrameMapSymbol; @@ -297,6 +321,10 @@ void QgsComposerMap::paint( QPainter* painter, const QStyleOptionGraphicsItem* i QgsRectangle requestRectangle; requestedExtent( requestRectangle ); + + QgsRectangle cExtent; + extentCenteredOnOverview( cExtent ); + double horizontalVScaleFactor = horizontalViewScaleFactor(); if ( horizontalVScaleFactor < 0 ) { @@ -305,15 +333,15 @@ void QgsComposerMap::paint( QPainter* painter, const QStyleOptionGraphicsItem* i double imagePixelWidth = mExtent.width() / requestRectangle.width() * mCacheImage.width() ; //how many pixels of the image are for the map extent? double scale = rect().width() / imagePixelWidth; - QgsPoint rotationPoint = QgsPoint(( mExtent.xMaximum() + mExtent.xMinimum() ) / 2.0, ( mExtent.yMaximum() + mExtent.yMinimum() ) / 2.0 ); + QgsPoint rotationPoint = QgsPoint(( cExtent.xMaximum() + cExtent.xMinimum() ) / 2.0, ( cExtent.yMaximum() + cExtent.yMinimum() ) / 2.0 ); //shift such that rotation point is at 0/0 point in the coordinate system double yShiftMM = ( requestRectangle.yMaximum() - rotationPoint.y() ) * mapUnitsToMM(); double xShiftMM = ( requestRectangle.xMinimum() - rotationPoint.x() ) * mapUnitsToMM(); //shift such that top left point of the extent at point 0/0 in item coordinate system - double xTopLeftShift = ( rotationPoint.x() - mExtent.xMinimum() ) * mapUnitsToMM(); - double yTopLeftShift = ( mExtent.yMaximum() - rotationPoint.y() ) * mapUnitsToMM(); + double xTopLeftShift = ( rotationPoint.x() - cExtent.xMinimum() ) * mapUnitsToMM(); + double yTopLeftShift = ( cExtent.yMaximum() - rotationPoint.y() ) * mapUnitsToMM(); painter->save(); @@ -351,16 +379,20 @@ void QgsComposerMap::paint( QPainter* painter, const QStyleOptionGraphicsItem* i QgsRectangle requestRectangle; requestedExtent( requestRectangle ); + QgsRectangle cExtent; + extentCenteredOnOverview( cExtent ); + QSizeF theSize( requestRectangle.width() * mapUnitsToMM(), requestRectangle.height() * mapUnitsToMM() ); - QgsPoint rotationPoint = QgsPoint(( mExtent.xMaximum() + mExtent.xMinimum() ) / 2.0, ( mExtent.yMaximum() + mExtent.yMinimum() ) / 2.0 ); + + QgsPoint rotationPoint = QgsPoint(( cExtent.xMaximum() + cExtent.xMinimum() ) / 2.0, ( cExtent.yMaximum() + cExtent.yMinimum() ) / 2.0 ); //shift such that rotation point is at 0/0 point in the coordinate system double yShiftMM = ( requestRectangle.yMaximum() - rotationPoint.y() ) * mapUnitsToMM(); double xShiftMM = ( requestRectangle.xMinimum() - rotationPoint.x() ) * mapUnitsToMM(); //shift such that top left point of the extent at point 0/0 in item coordinate system - double xTopLeftShift = ( rotationPoint.x() - mExtent.xMinimum() ) * mapUnitsToMM(); - double yTopLeftShift = ( mExtent.yMaximum() - rotationPoint.y() ) * mapUnitsToMM(); + double xTopLeftShift = ( rotationPoint.x() - cExtent.xMinimum() ) * mapUnitsToMM(); + double yTopLeftShift = ( cExtent.yMaximum() - rotationPoint.y() ) * mapUnitsToMM(); painter->save(); painter->translate( mXOffset, mYOffset ); painter->translate( xTopLeftShift, yTopLeftShift ); @@ -757,6 +789,9 @@ bool QgsComposerMap::writeXML( QDomElement& elem, QDomDocument & doc ) const { overviewFrameElem.setAttribute( "overviewInverted", "false" ); } + + overviewFrameElem.setAttribute( "overviewCentered", mOverviewCentered ? "true" : "false" ); + QDomElement overviewFrameStyleElem = QgsSymbolLayerV2Utils::saveSymbol( QString(), mOverviewFrameMapSymbol, doc ); overviewFrameElem.appendChild( overviewFrameStyleElem ); composerMapElem.appendChild( overviewFrameElem ); @@ -874,6 +909,15 @@ bool QgsComposerMap::readXML( const QDomElement& itemElem, const QDomDocument& d setOverviewInverted( false ); } + if ( overviewFrameElem.attribute( "overviewCentered" ).compare( "true", Qt::CaseInsensitive ) == 0 ) + { + setOverviewCentered( true ); + } + else + { + setOverviewCentered( false ); + } + QDomElement overviewFrameSymbolElem = overviewFrameElem.firstChildElement( "symbol" ); if ( !overviewFrameSymbolElem.isNull() ) { @@ -1727,63 +1771,70 @@ double QgsComposerMap::maxExtension() const return maxExtension + mAnnotationFrameDistance + gridFrameDist; } -void QgsComposerMap::mapPolygon( QPolygonF& poly ) const +void QgsComposerMap::mapPolygon( const QgsRectangle& extent, QPolygonF& poly ) const { poly.clear(); if ( mRotation == 0 ) { - poly << QPointF( mExtent.xMinimum(), mExtent.yMaximum() ); - poly << QPointF( mExtent.xMaximum(), mExtent.yMaximum() ); - poly << QPointF( mExtent.xMaximum(), mExtent.yMinimum() ); - poly << QPointF( mExtent.xMinimum(), mExtent.yMinimum() ); + poly << QPointF( extent.xMinimum(), extent.yMaximum() ); + poly << QPointF( extent.xMaximum(), extent.yMaximum() ); + poly << QPointF( extent.xMaximum(), extent.yMinimum() ); + poly << QPointF( extent.xMinimum(), extent.yMinimum() ); return; } //there is rotation - QgsPoint rotationPoint(( mExtent.xMaximum() + mExtent.xMinimum() ) / 2.0, ( mExtent.yMaximum() + mExtent.yMinimum() ) / 2.0 ); + QgsPoint rotationPoint(( extent.xMaximum() + extent.xMinimum() ) / 2.0, ( extent.yMaximum() + extent.yMinimum() ) / 2.0 ); double dx, dy; //x-, y- shift from rotation point to corner point //top left point - dx = rotationPoint.x() - mExtent.xMinimum(); - dy = rotationPoint.y() - mExtent.yMaximum(); + dx = rotationPoint.x() - extent.xMinimum(); + dy = rotationPoint.y() - extent.yMaximum(); rotate( mRotation, dx, dy ); poly << QPointF( rotationPoint.x() + dx, rotationPoint.y() + dy ); //top right point - dx = rotationPoint.x() - mExtent.xMaximum(); - dy = rotationPoint.y() - mExtent.yMaximum(); + dx = rotationPoint.x() - extent.xMaximum(); + dy = rotationPoint.y() - extent.yMaximum(); rotate( mRotation, dx, dy ); poly << QPointF( rotationPoint.x() + dx, rotationPoint.y() + dy ); //bottom right point - dx = rotationPoint.x() - mExtent.xMaximum(); - dy = rotationPoint.y() - mExtent.yMinimum(); + dx = rotationPoint.x() - extent.xMaximum(); + dy = rotationPoint.y() - extent.yMinimum(); rotate( mRotation, dx, dy ); poly << QPointF( rotationPoint.x() + dx, rotationPoint.y() + dy ); //bottom left point - dx = rotationPoint.x() - mExtent.xMinimum(); - dy = rotationPoint.y() - mExtent.yMinimum(); + dx = rotationPoint.x() - extent.xMinimum(); + dy = rotationPoint.y() - extent.yMinimum(); rotate( mRotation, dx, dy ); poly << QPointF( rotationPoint.x() + dx, rotationPoint.y() + dy ); } +void QgsComposerMap::mapPolygon( QPolygonF& poly ) const +{ + return mapPolygon( mExtent, poly ); +} + void QgsComposerMap::requestedExtent( QgsRectangle& extent ) const { + QgsRectangle newExtent; + extentCenteredOnOverview( newExtent ); if ( mRotation == 0 ) { - extent = mExtent; - return; + extent = newExtent; + } + else + { + QPolygonF poly; + mapPolygon( newExtent, poly ); + QRectF bRect = poly.boundingRect(); + extent.setXMinimum( bRect.left() ); + extent.setXMaximum( bRect.right() ); + extent.setYMinimum( bRect.top() ); + extent.setYMaximum( bRect.bottom() ); } - - QPolygonF poly; - mapPolygon( poly ); - QRectF bRect = poly.boundingRect(); - extent.setXMinimum( bRect.left() ); - extent.setXMaximum( bRect.right() ); - extent.setYMinimum( bRect.top() ); - extent.setYMaximum( bRect.bottom() ); - return; } double QgsComposerMap::mapUnitsToMM() const @@ -1836,6 +1887,12 @@ void QgsComposerMap::setOverviewInverted( bool inverted ) update(); } +void QgsComposerMap::setOverviewCentered( bool centered ) +{ + mOverviewCentered = centered; + update(); +} + void QgsComposerMap::setGridLineSymbol( QgsLineSymbolV2* symbol ) { delete mGridLineSymbol; @@ -2165,7 +2222,8 @@ void QgsComposerMap::drawOverviewMapExtent( QPainter* p ) } QgsRectangle otherExtent = overviewFrameMap->extent(); - QgsRectangle thisExtent = extent(); + QgsRectangle thisExtent; + extentCenteredOnOverview( thisExtent ); QgsRectangle intersectRect = thisExtent.intersect( &otherExtent ); QgsRenderContext context; diff --git a/src/core/composer/qgscomposermap.h b/src/core/composer/qgscomposermap.h index 473850833c2..99ebfda7d80 100644 --- a/src/core/composer/qgscomposermap.h +++ b/src/core/composer/qgscomposermap.h @@ -332,6 +332,11 @@ class CORE_EXPORT QgsComposerMap : public QgsComposerItem /** Sets the overview's inversion mode*/ void setOverviewInverted( bool inverted ); + /** Returns true if the extent is forced to center on the overview when the overview is outside the extent */ + bool overviewCentered() const { return mOverviewCentered; } + /** Set the overview's centering mode */ + void setOverviewCentered( bool centered ); + void setGridLineSymbol( QgsLineSymbolV2* symbol ); QgsLineSymbolV2* gridLineSymbol() { return mGridLineSymbol; } @@ -408,6 +413,8 @@ class CORE_EXPORT QgsComposerMap : public QgsComposerItem /**Blend mode for overview*/ QPainter::CompositionMode mOverviewBlendMode; bool mOverviewInverted; + /** Centering mode for overview */ + bool mOverviewCentered; /**Establishes signal/slot connection for update in case of layer change*/ void connectUpdateSlot(); @@ -503,6 +510,9 @@ class CORE_EXPORT QgsComposerMap : public QgsComposerItem @param poly out: the result polygon with the four corner points. The points are clockwise, starting at the top-left point @return true in case of success*/ void mapPolygon( QPolygonF& poly ) const; + /** mapPolygon variant using a given extent */ + void mapPolygon( const QgsRectangle& extent, QPolygonF& poly ) const; + /**Calculates the extent to request and the yShift of the top-left point in case of rotation.*/ void requestedExtent( QgsRectangle& extent ) const; /**Scales a composer map shift (in MM) and rotates it by mRotation @@ -525,6 +535,11 @@ class CORE_EXPORT QgsComposerMap : public QgsComposerItem void createDefaultOverviewFrameSymbol(); void createDefaultGridLineSymbol(); void initGridAnnotationFormatFromProject(); + + /** + * Returns the extent, centered on the overview frame, if needed (when the overview frame is not visible) + */ + void extentCenteredOnOverview( QgsRectangle& extent ) const; }; #endif diff --git a/src/ui/qgscomposermapwidgetbase.ui b/src/ui/qgscomposermapwidgetbase.ui index 456aa1fd03d..bba8d79c319 100644 --- a/src/ui/qgscomposermapwidgetbase.ui +++ b/src/ui/qgscomposermapwidgetbase.ui @@ -697,6 +697,13 @@ + + + + Center on overview when needed + + + From 9d20a69b94400253d69a0f98a520a7eb2946ffed Mon Sep 17 00:00:00 2001 From: Hugo Mercier Date: Mon, 17 Jun 2013 14:34:42 +0200 Subject: [PATCH 2/5] Add unit test for autocentering of overview Work funded by Tuscany Region - SITA. Contract "Support to the use of GFOSS (Geographic Free and Open Source Software) Desktop tools" (CIG Z3B06FA6D7). --- tests/src/core/testqgscomposermap.cpp | 18 ++++++++++++++++++ .../composermap_landsat_overview_center.png | Bin 0 -> 104074 bytes 2 files changed, 18 insertions(+) create mode 100644 tests/testdata/control_images/expected_composermap/composermap_landsat_overview_center.png diff --git a/tests/src/core/testqgscomposermap.cpp b/tests/src/core/testqgscomposermap.cpp index a21fa481be1..f338c5e1c9d 100644 --- a/tests/src/core/testqgscomposermap.cpp +++ b/tests/src/core/testqgscomposermap.cpp @@ -41,6 +41,7 @@ class TestQgsComposerMap: public QObject void overviewMapInvert(); //test if invert of overview map frame works void uniqueId(); //test if map id is adapted when doing copy paste void zebraStyle(); //test zebra map border style + void overviewMapCenter(); //test if centering of overview map frame works private: QgsComposition* mComposition; @@ -216,5 +217,22 @@ void TestQgsComposerMap::zebraStyle() QVERIFY( testResult ); } +void TestQgsComposerMap::overviewMapCenter() +{ + QgsComposerMap* overviewMapCenter = new QgsComposerMap( mComposition, 20, 130, 70, 70 ); + overviewMapCenter->setFrameEnabled( true ); + mComposition->addComposerMap( overviewMapCenter ); + mComposerMap->setNewExtent( QgsRectangle( 785462.375+5000, 3341423.125, 789262.375+5000, 3343323.125 ) ); //zoom in + mComposerMap->setGridEnabled( false ); + overviewMapCenter->setNewExtent( QgsRectangle( 781662.375, 3339523.125, 793062.375, 3350923.125 ) ); + overviewMapCenter->setOverviewFrameMap( mComposerMap->id() ); + overviewMapCenter->setOverviewCentered( true ); + + QgsCompositionChecker checker( "Composer map overview center", mComposition, QString( QString( TEST_DATA_DIR ) + QDir::separator() + + "control_images" + QDir::separator() + "expected_composermap" + QDir::separator() + "composermap_landsat_overview_center.png" ) ); + bool testResult = checker.testComposition(); + mComposition->removeComposerItem( overviewMapCenter ); + QVERIFY( testResult ); +} QTEST_MAIN( TestQgsComposerMap ) #include "moc_testqgscomposermap.cxx" diff --git a/tests/testdata/control_images/expected_composermap/composermap_landsat_overview_center.png b/tests/testdata/control_images/expected_composermap/composermap_landsat_overview_center.png new file mode 100644 index 0000000000000000000000000000000000000000..3f4e6a985d4e56d7e6c853e9da8c3a157dd999ec GIT binary patch literal 104074 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 literal 0 HcmV?d00001 From f0f72ca8a9141dddc4524618fee194e362d0d7d3 Mon Sep 17 00:00:00 2001 From: Hugo Mercier Date: Mon, 17 Jun 2013 15:08:07 +0200 Subject: [PATCH 3/5] Add SIP and Python unit test for overview autocentering. Work funded by Tuscany Region - SITA. Contract "Support to the use of GFOSS (Geographic Free and Open Source Software) Desktop tools" (CIG Z3B06FA6D7). --- python/core/composer/qgscomposermap.sip | 7 ++++++- tests/src/python/test_qgscomposermap.py | 26 +++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/python/core/composer/qgscomposermap.sip b/python/core/composer/qgscomposermap.sip index b646d22e604..a81bf600be5 100644 --- a/python/core/composer/qgscomposermap.sip +++ b/python/core/composer/qgscomposermap.sip @@ -300,7 +300,12 @@ class QgsComposerMap : QgsComposerItem /**Sets flag if overview frame should be inverted @note this function was added in version 1.9*/ void setOverviewInverted( bool inverted ); - bool overviewInverted() const; + bool overviewInverted() const; + + /** Returns true if the extent is forced to center on the overview when the overview is outside the extent */ + bool overviewCentered() const; + /** Set the overview's centering mode */ + void setOverviewCentered( bool centered ); /**Sets mId to a number not yet used in the composition. mId is kept if it is not in use. Usually, this function is called before adding the composer map to the composition*/ diff --git a/tests/src/python/test_qgscomposermap.py b/tests/src/python/test_qgscomposermap.py index 72c1895e6b4..4fe23712028 100644 --- a/tests/src/python/test_qgscomposermap.py +++ b/tests/src/python/test_qgscomposermap.py @@ -181,6 +181,32 @@ class TestQgsComposerMap(TestCase): self.mComposition.removeComposerItem(overviewMap) assert myTestResult == True, myMessage + def testOverviewMapCenter(self): + overviewMap = QgsComposerMap(self.mComposition, 20, 130, 70, 70) + overviewMap.setFrameEnabled(True) + self.mComposition.addComposerMap(overviewMap) + # zoom in + myRectangle = QgsRectangle(785462.375+5000, 3341423.125, + 789262.375+5000, 3343323.125) + self.mComposerMap.setNewExtent(myRectangle) + myRectangle2 = QgsRectangle(781662.375, 3339523.125, + 793062.375, 3350923.125) + overviewMap.setNewExtent(myRectangle2) + overviewMap.setOverviewFrameMap(self.mComposerMap.id()) + overviewMap.setOverviewInverted(False) + overviewMap.setOverviewCentered(True) + checker = QgsCompositionChecker() + myPngPath = os.path.join(TEST_DATA_DIR, + 'control_images', + 'expected_composermap', + 'composermap_landsat_overview_center.png') + myTestResult, myMessage = checker.testComposition( + 'Composer map overview centered', + self.mComposition, + myPngPath) + self.mComposition.removeComposerItem(overviewMap) + assert myTestResult == True, myMessage + # Fails because addItemsFromXML has been commented out in sip @expectedFailure def testuniqueId(self): From 5c4f2ed984f0c7c64b9b5345cd9c30030d62f55c Mon Sep 17 00:00:00 2001 From: Hugo Mercier Date: Wed, 19 Jun 2013 09:15:56 +0200 Subject: [PATCH 4/5] Fix overview autocentering: always center, not only when the overview is not visible. Work funded by Tuscany Region - SITA. Contract "Support to the use of GFOSS (Geographic Free and Open Source Software) Desktop tools" (CIG Z3B06FA6D7). --- python/core/composer/qgscomposermap.sip | 2 +- src/core/composer/qgscomposermap.cpp | 14 ++++++-------- src/core/composer/qgscomposermap.h | 4 ++-- src/ui/qgscomposermapwidgetbase.ui | 8 ++++---- 4 files changed, 13 insertions(+), 15 deletions(-) diff --git a/python/core/composer/qgscomposermap.sip b/python/core/composer/qgscomposermap.sip index a81bf600be5..5d8e6260b2c 100644 --- a/python/core/composer/qgscomposermap.sip +++ b/python/core/composer/qgscomposermap.sip @@ -302,7 +302,7 @@ class QgsComposerMap : QgsComposerItem void setOverviewInverted( bool inverted ); bool overviewInverted() const; - /** Returns true if the extent is forced to center on the overview when the overview is outside the extent */ + /** Returns true if the extent is forced to center on the overview */ bool overviewCentered() const; /** Set the overview's centering mode */ void setOverviewCentered( bool centered ); diff --git a/src/core/composer/qgscomposermap.cpp b/src/core/composer/qgscomposermap.cpp index f0efea656da..14803604db8 100644 --- a/src/core/composer/qgscomposermap.cpp +++ b/src/core/composer/qgscomposermap.cpp @@ -129,14 +129,12 @@ void QgsComposerMap::extentCenteredOnOverview( QgsRectangle& extent ) const const QgsComposerMap* overviewFrameMap = mComposition->getComposerMapById( mOverviewFrameMapId ); QgsRectangle otherExtent = overviewFrameMap->extent(); - if ( ! mExtent.contains( otherExtent ) ) { - QgsPoint center = otherExtent.center(); - QgsRectangle movedExtent( center.x() - mExtent.width() / 2, - center.y() - mExtent.height() / 2, - center.x() - mExtent.width() / 2 + mExtent.width(), - center.y() - mExtent.height() / 2 + mExtent.height() ); - extent = movedExtent; - } + QgsPoint center = otherExtent.center(); + QgsRectangle movedExtent( center.x() - mExtent.width() / 2, + center.y() - mExtent.height() / 2, + center.x() - mExtent.width() / 2 + mExtent.width(), + center.y() - mExtent.height() / 2 + mExtent.height() ); + extent = movedExtent; } } diff --git a/src/core/composer/qgscomposermap.h b/src/core/composer/qgscomposermap.h index 99ebfda7d80..790367fc279 100644 --- a/src/core/composer/qgscomposermap.h +++ b/src/core/composer/qgscomposermap.h @@ -332,7 +332,7 @@ class CORE_EXPORT QgsComposerMap : public QgsComposerItem /** Sets the overview's inversion mode*/ void setOverviewInverted( bool inverted ); - /** Returns true if the extent is forced to center on the overview when the overview is outside the extent */ + /** Returns true if the extent is forced to center on the overview */ bool overviewCentered() const { return mOverviewCentered; } /** Set the overview's centering mode */ void setOverviewCentered( bool centered ); @@ -537,7 +537,7 @@ class CORE_EXPORT QgsComposerMap : public QgsComposerItem void initGridAnnotationFormatFromProject(); /** - * Returns the extent, centered on the overview frame, if needed (when the overview frame is not visible) + * Returns the extent, centered on the overview frame */ void extentCenteredOnOverview( QgsRectangle& extent ) const; }; diff --git a/src/ui/qgscomposermapwidgetbase.ui b/src/ui/qgscomposermapwidgetbase.ui index bba8d79c319..a8034ac6c2b 100644 --- a/src/ui/qgscomposermapwidgetbase.ui +++ b/src/ui/qgscomposermapwidgetbase.ui @@ -54,9 +54,9 @@ 0 - 0 - 438 - 1454 + -376 + 439 + 1439 @@ -700,7 +700,7 @@ - Center on overview when needed + Center on overview From 00041e6d1d62a4854bfa525959bbf447679f1904 Mon Sep 17 00:00:00 2001 From: Hugo Mercier Date: Tue, 25 Jun 2013 12:08:56 +0200 Subject: [PATCH 5/5] Add an update of overview on centering mode switch --- src/app/composer/qgscomposermapwidget.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/app/composer/qgscomposermapwidget.cpp b/src/app/composer/qgscomposermapwidget.cpp index 566fb3587f7..14f448c942d 100644 --- a/src/app/composer/qgscomposermapwidget.cpp +++ b/src/app/composer/qgscomposermapwidget.cpp @@ -600,6 +600,10 @@ void QgsComposerMapWidget::on_mOverviewCenterCheckbox_toggled( bool state ) { mComposerMap->setOverviewCentered( state ); } + mComposerMap->beginCommand( tr( "Overview centering mode changed" ) ); + mComposerMap->cache(); + mComposerMap->update(); + mComposerMap->endCommand(); } void QgsComposerMapWidget::on_mGridCheckBox_toggled( bool state )