Skip to content

Commit a18db24

Browse files
committed
Merge branch 'composer_overview_map'
2 parents c372772 + ea2f74a commit a18db24

File tree

7 files changed

+288
-18
lines changed

7 files changed

+288
-18
lines changed

python/core/qgscomposermap.sip

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,13 @@ class QgsComposerMap : QgsComposerItem
254254

255255
void updateItem();
256256

257+
/**Sets overview frame map. -1 disables the overview frame
258+
@note: this function was added in version 1.9*/
259+
void setOverviewFrameMap( int mapId );
260+
/**Returns id of overview frame (or -1 if no overfiew frame)
261+
@note: this function was added in version 1.9*/
262+
int overviewFrameMapId() const;
263+
257264
public slots:
258265

259266
/**Called if map canvas has changed*/

src/app/composer/qgscomposermapwidget.cpp

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@
1818
#include "qgscomposermapwidget.h"
1919
#include "qgscomposeritemwidget.h"
2020
#include "qgsmaprenderer.h"
21+
#include "qgsstylev2.h"
22+
#include "qgssymbolv2.h"
23+
//#include "qgssymbolv2propertiesdialog.h"
24+
#include "qgssymbolv2selectordialog.h"
25+
#include "qgssymbollayerv2utils.h"
2126
#include <QColorDialog>
2227
#include <QFontDialog>
2328

@@ -64,6 +69,27 @@ QgsComposerMapWidget::QgsComposerMapWidget( QgsComposerMap* composerMap ): QWidg
6469
connect( composerMap, SIGNAL( itemChanged() ), this, SLOT( setGuiElementValues() ) );
6570
}
6671

72+
if ( mComposerMap )
73+
{
74+
//insert available maps into mMapComboBox
75+
mOverviewFrameMapComboBox->addItem( tr( "None" ), -1 );
76+
const QgsComposition* composition = mComposerMap->composition();
77+
if ( composition )
78+
{
79+
QList<const QgsComposerMap*> availableMaps = composition->composerMapItems();
80+
QList<const QgsComposerMap*>::const_iterator mapItemIt = availableMaps.constBegin();
81+
for ( ; mapItemIt != availableMaps.constEnd(); ++mapItemIt )
82+
{
83+
if (( *mapItemIt )->id() != mComposerMap->id() )
84+
{
85+
mOverviewFrameMapComboBox->addItem( tr( "Map %1" ).arg(( *mapItemIt )->id() ), ( *mapItemIt )->id() );
86+
}
87+
}
88+
}
89+
}
90+
91+
updateOverviewSymbolMarker();
92+
6793
updateGuiElements();
6894
blockAllSignals( false );
6995
}
@@ -322,6 +348,10 @@ void QgsComposerMapWidget::updateGuiElements()
322348
mDrawCanvasItemsCheckBox->setCheckState( Qt::Unchecked );
323349
}
324350

351+
//overview frame
352+
int overviewMapFrameId = mComposerMap->overviewFrameMapId();
353+
mOverviewFrameMapComboBox->setCurrentIndex( mOverviewFrameMapComboBox->findData( overviewMapFrameId ) );
354+
325355
//grid
326356
if ( mComposerMap->gridEnabled() )
327357
{
@@ -459,6 +489,8 @@ void QgsComposerMapWidget::blockAllSignals( bool b )
459489
mDrawCanvasItemsCheckBox->blockSignals( b );
460490
mFrameStyleComboBox->blockSignals( b );
461491
mFrameWidthSpinBox->blockSignals( b );
492+
mOverviewFrameMapComboBox->blockSignals( b );
493+
mOverviewFrameStyleButton->blockSignals( b );
462494
}
463495

464496
void QgsComposerMapWidget::on_mUpdatePreviewButton_clicked()
@@ -519,6 +551,68 @@ void QgsComposerMapWidget::on_mDrawCanvasItemsCheckBox_stateChanged( int state )
519551
mComposerMap->endCommand();
520552
}
521553

554+
void QgsComposerMapWidget::on_mOverviewFrameMapComboBox_currentIndexChanged( const QString& text )
555+
{
556+
if ( !mComposerMap )
557+
{
558+
return;
559+
}
560+
561+
if ( text == tr( "None" ) )
562+
{
563+
mComposerMap->setOverviewFrameMap( -1 );
564+
}
565+
566+
//get composition
567+
const QgsComposition* composition = mComposerMap->composition();
568+
if ( !composition )
569+
{
570+
return;
571+
}
572+
573+
//extract id
574+
int id;
575+
bool conversionOk;
576+
QStringList textSplit = text.split( " " );
577+
if ( textSplit.size() < 1 )
578+
{
579+
return;
580+
}
581+
582+
QString idString = textSplit.at( textSplit.size() - 1 );
583+
id = idString.toInt( &conversionOk );
584+
585+
if ( !conversionOk )
586+
{
587+
return;
588+
}
589+
590+
const QgsComposerMap* composerMap = composition->getComposerMapById( id );
591+
if ( !composerMap )
592+
{
593+
return;
594+
}
595+
596+
mComposerMap->setOverviewFrameMap( id );
597+
mComposerMap->update();
598+
}
599+
600+
void QgsComposerMapWidget::on_mOverviewFrameStyleButton_clicked()
601+
{
602+
if ( !mComposerMap )
603+
{
604+
return;
605+
}
606+
607+
QgsSymbolV2SelectorDialog d( mComposerMap->overviewFrameMapSymbol(), QgsStyleV2::defaultStyle(), 0 );
608+
609+
//QgsSymbolV2PropertiesDialog d( mComposerMap->overviewFrameMapSymbol(), 0, this );
610+
if ( d.exec() == QDialog::Accepted )
611+
{
612+
updateOverviewSymbolMarker();
613+
}
614+
}
615+
522616
void QgsComposerMapWidget::on_mGridCheckBox_toggled( bool state )
523617
{
524618
if ( !mComposerMap )
@@ -896,3 +990,12 @@ void QgsComposerMapWidget::initAnnotationDirectionBox( QComboBox* c, QgsComposer
896990
c->setCurrentIndex( c->findText( tr( "Horizontal" ) ) );
897991
}
898992
}
993+
994+
void QgsComposerMapWidget::updateOverviewSymbolMarker()
995+
{
996+
if ( mComposerMap )
997+
{
998+
QIcon icon = QgsSymbolLayerV2Utils::symbolPreviewIcon( mComposerMap->overviewFrameMapSymbol(), mOverviewFrameStyleButton->iconSize() );
999+
mOverviewFrameStyleButton->setIcon( icon );
1000+
}
1001+
}

src/app/composer/qgscomposermapwidget.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ class QgsComposerMapWidget: public QWidget, private Ui::QgsComposerMapWidgetBase
4343
void on_mUpdatePreviewButton_clicked();
4444
void on_mKeepLayerListCheckBox_stateChanged( int state );
4545
void on_mDrawCanvasItemsCheckBox_stateChanged( int state );
46+
void on_mOverviewFrameMapComboBox_currentIndexChanged( const QString& text );
47+
void on_mOverviewFrameStyleButton_clicked();
4648

4749
void on_mXMinLineEdit_editingFinished();
4850
void on_mXMaxLineEdit_editingFinished();
@@ -104,6 +106,8 @@ class QgsComposerMapWidget: public QWidget, private Ui::QgsComposerMapWidgetBase
104106

105107
void initAnnotationPositionBox( QComboBox* c, QgsComposerMap::GridAnnotationPosition pos );
106108
void initAnnotationDirectionBox( QComboBox* c, QgsComposerMap::GridAnnotationDirection dir );
109+
110+
void updateOverviewSymbolMarker();
107111
};
108112

109113
#endif

src/core/composer/qgscomposermap.cpp

Lines changed: 113 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,16 @@
3838
#include <cmath>
3939

4040
QgsComposerMap::QgsComposerMap( QgsComposition *composition, int x, int y, int width, int height )
41-
: QgsComposerItem( x, y, width, height, composition ), mKeepLayerSet( false ), mGridEnabled( false ), mGridStyle( Solid ),
41+
: QgsComposerItem( x, y, width, height, composition ), mKeepLayerSet( false ), mOverviewFrameMapId( -1 ), mGridEnabled( false ), mGridStyle( Solid ),
4242
mGridIntervalX( 0.0 ), mGridIntervalY( 0.0 ), mGridOffsetX( 0.0 ), mGridOffsetY( 0.0 ), mGridAnnotationPrecision( 3 ), mShowGridAnnotation( false ),
4343
mLeftGridAnnotationPosition( OutsideMapFrame ), mRightGridAnnotationPosition( OutsideMapFrame ), mTopGridAnnotationPosition( OutsideMapFrame ),
4444
mBottomGridAnnotationPosition( OutsideMapFrame ), mAnnotationFrameDistance( 1.0 ), mLeftGridAnnotationDirection( Horizontal ), mRightGridAnnotationDirection( Horizontal ),
4545
mTopGridAnnotationDirection( Horizontal ), mBottomGridAnnotationDirection( Horizontal ), mGridFrameStyle( NoGridFrame ), mGridFrameWidth( 2.0 ),
4646
mCrossLength( 3 ), mMapCanvas( 0 ), mDrawCanvasItems( true )
4747
{
4848
mComposition = composition;
49+
mOverviewFrameMapSymbol = 0;
50+
createDefaultOverviewFrameSymbol();
4951

5052
//mId = mComposition->composerMapItems().size();
5153
int maxId = -1;
@@ -85,13 +87,16 @@ QgsComposerMap::QgsComposerMap( QgsComposition *composition, int x, int y, int w
8587
}
8688

8789
QgsComposerMap::QgsComposerMap( QgsComposition *composition )
88-
: QgsComposerItem( 0, 0, 10, 10, composition ), mKeepLayerSet( false ), mGridEnabled( false ), mGridStyle( Solid ),
90+
: QgsComposerItem( 0, 0, 10, 10, composition ), mKeepLayerSet( false ), mOverviewFrameMapId( -1 ), mGridEnabled( false ), mGridStyle( Solid ),
8991
mGridIntervalX( 0.0 ), mGridIntervalY( 0.0 ), mGridOffsetX( 0.0 ), mGridOffsetY( 0.0 ), mGridAnnotationPrecision( 3 ), mShowGridAnnotation( false ),
9092
mLeftGridAnnotationPosition( OutsideMapFrame ), mRightGridAnnotationPosition( OutsideMapFrame ), mTopGridAnnotationPosition( OutsideMapFrame ),
9193
mBottomGridAnnotationPosition( OutsideMapFrame ), mAnnotationFrameDistance( 1.0 ), mLeftGridAnnotationDirection( Horizontal ), mRightGridAnnotationDirection( Horizontal ),
9294
mTopGridAnnotationDirection( Horizontal ), mBottomGridAnnotationDirection( Horizontal ), mGridFrameStyle( NoGridFrame ), mGridFrameWidth( 2.0 ), mCrossLength( 3 ),
9395
mMapCanvas( 0 ), mDrawCanvasItems( true )
9496
{
97+
mOverviewFrameMapSymbol = 0;
98+
createDefaultOverviewFrameSymbol();
99+
95100
//Offset
96101
mXOffset = 0.0;
97102
mYOffset = 0.0;
@@ -110,6 +115,7 @@ QgsComposerMap::QgsComposerMap( QgsComposition *composition )
110115

111116
QgsComposerMap::~QgsComposerMap()
112117
{
118+
delete mOverviewFrameMapSymbol;
113119
}
114120

115121
void QgsComposerMap::draw( QPainter *painter, const QgsRectangle& extent, const QSize& size, int dpi )
@@ -364,6 +370,10 @@ void QgsComposerMap::paint( QPainter* painter, const QStyleOptionGraphicsItem* i
364370
drawSelectionBoxes( painter );
365371
}
366372

373+
if ( mOverviewFrameMapId != -1 )
374+
{
375+
drawOverviewMapExtent( painter );
376+
}
367377

368378
painter->restore();
369379
}
@@ -659,6 +669,13 @@ bool QgsComposerMap::writeXML( QDomElement& elem, QDomDocument & doc ) const
659669
composerMapElem.setAttribute( "drawCanvasItems", "false" );
660670
}
661671

672+
//overview map frame
673+
QDomElement overviewFrameElem = doc.createElement( "overviewFrame" );
674+
overviewFrameElem.setAttribute( "overviewFrameMap", mOverviewFrameMapId );
675+
QDomElement overviewFrameStyleElem = QgsSymbolLayerV2Utils::saveSymbol( QString(), mOverviewFrameMapSymbol, doc );
676+
overviewFrameElem.appendChild( overviewFrameStyleElem );
677+
composerMapElem.appendChild( overviewFrameElem );
678+
662679
//extent
663680
QDomElement extentElem = doc.createElement( "Extent" );
664681
extentElem.setAttribute( "xmin", QString::number( mExtent.xMinimum() ) );
@@ -679,6 +696,9 @@ bool QgsComposerMap::writeXML( QDomElement& elem, QDomDocument & doc ) const
679696
}
680697
composerMapElem.appendChild( layerSetElem );
681698

699+
//overview map frame
700+
composerMapElem.setAttribute( "overviewFrameMap", mOverviewFrameMapId );
701+
682702
//grid
683703
QDomElement gridElem = doc.createElement( "Grid" );
684704
gridElem.setAttribute( "show", mGridEnabled );
@@ -746,6 +766,18 @@ bool QgsComposerMap::readXML( const QDomElement& itemElem, const QDomDocument& d
746766
mPreviewMode = Rectangle;
747767
}
748768

769+
QDomElement overviewFrameElem = itemElem.firstChildElement( "overviewFrame" );
770+
if ( !overviewFrameElem.isNull() )
771+
{
772+
setOverviewFrameMap( overviewFrameElem.attribute( "overviewFrameMap", "-1" ).toInt() );
773+
QDomElement overviewFrameSymbolElem = overviewFrameElem.firstChildElement( "symbol" );
774+
if ( !overviewFrameSymbolElem.isNull() )
775+
{
776+
delete mOverviewFrameMapSymbol;
777+
mOverviewFrameMapSymbol = dynamic_cast<QgsFillSymbolV2*>( QgsSymbolLayerV2Utils::loadSymbol( overviewFrameSymbolElem ) );
778+
}
779+
}
780+
749781
//extent
750782
QDomNodeList extentNodeList = itemElem.elementsByTagName( "Extent" );
751783
if ( extentNodeList.size() > 0 )
@@ -1536,6 +1568,34 @@ double QgsComposerMap::mapUnitsToMM() const
15361568
return rect().width() / extentWidth;
15371569
}
15381570

1571+
void QgsComposerMap::setOverviewFrameMap( int mapId )
1572+
{
1573+
if ( mOverviewFrameMapId != -1 )
1574+
{
1575+
const QgsComposerMap* map = mComposition->getComposerMapById( mapId );
1576+
if ( map )
1577+
{
1578+
QObject::disconnect( map, SIGNAL( extentChanged() ), this, SLOT( repaint() ) );
1579+
}
1580+
}
1581+
mOverviewFrameMapId = mapId;
1582+
if ( mOverviewFrameMapId != -1 )
1583+
{
1584+
const QgsComposerMap* map = mComposition->getComposerMapById( mapId );
1585+
if ( map )
1586+
{
1587+
QObject::connect( map, SIGNAL( extentChanged() ), this, SLOT( repaint() ) );
1588+
}
1589+
}
1590+
update();
1591+
}
1592+
1593+
void QgsComposerMap::setOverviewFrameMapSymbol( QgsFillSymbolV2* symbol )
1594+
{
1595+
delete mOverviewFrameMapSymbol;
1596+
mOverviewFrameMapSymbol = symbol;
1597+
}
1598+
15391599
void QgsComposerMap::transformShift( double& xShift, double& yShift ) const
15401600
{
15411601
double mmToMapUnits = 1.0 / mapUnitsToMM();
@@ -1845,4 +1905,55 @@ void QgsComposerMap::sortGridLinesOnBorders( const QList< QPair< double, QLineF
18451905
}
18461906
}
18471907

1908+
void QgsComposerMap::drawOverviewMapExtent( QPainter* p )
1909+
{
1910+
if ( mOverviewFrameMapId == -1 || !mComposition )
1911+
{
1912+
return;
1913+
}
1914+
1915+
const QgsComposerMap* overviewFrameMap = mComposition->getComposerMapById( mOverviewFrameMapId );
1916+
if ( !overviewFrameMap )
1917+
{
1918+
return;
1919+
}
18481920

1921+
QgsRectangle otherExtent = overviewFrameMap->extent();
1922+
QgsRectangle thisExtent = extent();
1923+
QgsRectangle intersectRect = thisExtent.intersect( &otherExtent );
1924+
1925+
QgsRenderContext context;
1926+
context.setPainter( p );
1927+
if ( mPreviewMode == Rectangle )
1928+
{
1929+
return;
1930+
}
1931+
else
1932+
{
1933+
context.setScaleFactor( 1.0 );
1934+
context.setRasterScaleFactor( mComposition->printResolution() / 25.4 );
1935+
}
1936+
1937+
QPolygonF polygon;
1938+
double x = ( intersectRect.xMinimum() - thisExtent.xMinimum() ) / thisExtent.width() * rect().width();
1939+
double y = ( thisExtent.yMaximum() - intersectRect.yMaximum() ) / thisExtent.height() * rect().height();
1940+
double width = intersectRect.width() / thisExtent.width() * rect().width();
1941+
double height = intersectRect.height() / thisExtent.height() * rect().height();
1942+
polygon << QPointF( x, y ) << QPointF( x + width, y ) << QPointF( x + width, y + height ) << QPointF( x, y + height ) << QPointF( x, y );
1943+
1944+
QList<QPolygonF> rings; //empty list
1945+
mOverviewFrameMapSymbol->startRender( context );
1946+
mOverviewFrameMapSymbol->renderPolygon( polygon, &rings, 0, context );
1947+
mOverviewFrameMapSymbol->stopRender( context );
1948+
}
1949+
1950+
void QgsComposerMap::createDefaultOverviewFrameSymbol()
1951+
{
1952+
delete mOverviewFrameMapSymbol;
1953+
QgsStringMap properties;
1954+
properties.insert( "color", "255,0,0,125" );
1955+
properties.insert( "style", "solid" );
1956+
properties.insert( "style_border", "no" );
1957+
mOverviewFrameMapSymbol = QgsFillSymbolV2::createSimple( properties );
1958+
mOverviewFrameMapSymbol->setAlpha( 0.3 );
1959+
}

0 commit comments

Comments
 (0)