Skip to content

Commit 12da3af

Browse files
committedJan 2, 2019
[layouts] Add method to alter list of map layers to render to include
overview layers
1 parent 97daa50 commit 12da3af

File tree

4 files changed

+124
-1
lines changed

4 files changed

+124
-1
lines changed
 

‎python/core/auto_generated/layout/qgslayoutitemmapoverview.sip.in

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,14 @@ Returns a list of QgsLayoutItemMapOverviews contained by the stack.
102102
virtual bool readXml( const QDomElement &elem, const QDomDocument &doc, const QgsReadWriteContext &context );
103103

104104

105+
QList< QgsMapLayer * > modifyMapLayerList( const QList< QgsMapLayer * > &layers );
106+
%Docstring
107+
Alters the list of map ``layers`` which will be rendered for the link map item, inserting
108+
temporary layers which represent overview extents as required.
109+
110+
.. versionadded:: 3.6
111+
%End
112+
105113
};
106114

107115
class QgsLayoutItemMapOverview : QgsLayoutItemMapItem

‎src/core/layout/qgslayoutitemmapoverview.cpp

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -448,3 +448,58 @@ bool QgsLayoutItemMapOverviewStack::readXml( const QDomElement &elem, const QDom
448448

449449
return true;
450450
}
451+
452+
QList<QgsMapLayer *> QgsLayoutItemMapOverviewStack::modifyMapLayerList( const QList<QgsMapLayer *> &layers )
453+
{
454+
QList<QgsMapLayer *> res = layers;
455+
res.reserve( layers.count() + mItems.count() );
456+
for ( QgsLayoutItemMapItem *item : qgis::as_const( mItems ) )
457+
{
458+
if ( !item )
459+
continue;
460+
461+
QgsVectorLayer *l = static_cast< QgsLayoutItemMapOverview * >( item )->asMapLayer();
462+
if ( !l )
463+
continue;
464+
465+
switch ( item->stackingPosition() )
466+
{
467+
case QgsLayoutItemMapItem::StackAboveMapLabels:
468+
continue;
469+
470+
case QgsLayoutItemMapItem::StackAboveMapLayer:
471+
case QgsLayoutItemMapItem::StackBelowMapLayer:
472+
{
473+
QgsMapLayer *stackLayer = item->stackingLayer();
474+
if ( !stackLayer )
475+
continue;
476+
477+
auto pos = std::find( res.begin(), res.end(), stackLayer );
478+
if ( pos == res.end() )
479+
continue;
480+
481+
if ( item->stackingPosition() == QgsLayoutItemMapItem::StackBelowMapLayer )
482+
{
483+
pos++;
484+
if ( pos == res.end() )
485+
{
486+
res.push_back( l );
487+
break;
488+
}
489+
}
490+
res.insert( pos, l );
491+
break;
492+
}
493+
494+
case QgsLayoutItemMapItem::StackBelowMap:
495+
res.push_back( l );
496+
break;
497+
498+
case QgsLayoutItemMapItem::StackBelowMapLabels:
499+
res.push_front( l );
500+
break;
501+
}
502+
}
503+
504+
return res;
505+
}

‎src/core/layout/qgslayoutitemmapoverview.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,14 @@ class CORE_EXPORT QgsLayoutItemMapOverviewStack : public QgsLayoutItemMapItemSta
106106
QList< QgsLayoutItemMapOverview * > asList() const;
107107
bool readXml( const QDomElement &elem, const QDomDocument &doc, const QgsReadWriteContext &context ) override;
108108

109+
/**
110+
* Alters the list of map \a layers which will be rendered for the link map item, inserting
111+
* temporary layers which represent overview extents as required.
112+
*
113+
* \since QGIS 3.6
114+
*/
115+
QList< QgsMapLayer * > modifyMapLayerList( const QList< QgsMapLayer * > &layers );
116+
109117
};
110118

111119
/**

‎tests/src/python/test_qgslayoutmapoverview.py

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@
2929
QgsMultiBandColorRenderer,
3030
QgsFillSymbol,
3131
QgsSingleSymbolRenderer,
32-
QgsCoordinateReferenceSystem)
32+
QgsCoordinateReferenceSystem,
33+
QgsLayoutItemMapOverview)
3334

3435
from qgis.testing import start_app, unittest
3536
from utilities import unitTestDataPath
@@ -237,6 +238,57 @@ def test_StackingPosition(self):
237238
overviewMap.overview().setStackingLayer(None)
238239
self.assertIsNone(overviewMap.overview().stackingLayer())
239240

241+
def test_ModifyMapLayerList(self):
242+
l = QgsLayout(QgsProject.instance())
243+
l.initializeDefaults()
244+
245+
overviewMap = QgsLayoutItemMap(l)
246+
overviewMap.attemptSetSceneRect(QRectF(20, 130, 70, 70))
247+
l.addLayoutItem(overviewMap)
248+
map = QgsLayoutItemMap(l)
249+
map.attemptSetSceneRect(QRectF(20, 20, 200, 100))
250+
l.addLayoutItem(map)
251+
252+
self.assertFalse(overviewMap.overviews().modifyMapLayerList([]))
253+
self.assertEqual(overviewMap.overviews().modifyMapLayerList([self.raster_layer, self.vector_layer]), [self.raster_layer, self.vector_layer])
254+
overviewMap.overview().setLinkedMap(map)
255+
overviewMap.overview().setStackingPosition(QgsLayoutItemMapItem.StackBelowMap)
256+
self.assertEqual(overviewMap.overviews().modifyMapLayerList([self.raster_layer, self.vector_layer]),
257+
[self.raster_layer, self.vector_layer, overviewMap.overview().asMapLayer()])
258+
overviewMap.overview().setStackingPosition(QgsLayoutItemMapItem.StackBelowMapLayer)
259+
self.assertEqual(overviewMap.overviews().modifyMapLayerList([self.raster_layer, self.vector_layer]),
260+
[self.raster_layer, self.vector_layer])
261+
overviewMap.overview().setStackingLayer(self.raster_layer)
262+
self.assertEqual(overviewMap.overviews().modifyMapLayerList([self.raster_layer, self.vector_layer]),
263+
[self.raster_layer, overviewMap.overview().asMapLayer(), self.vector_layer])
264+
overviewMap.overview().setStackingLayer(self.vector_layer)
265+
self.assertEqual(overviewMap.overviews().modifyMapLayerList([self.raster_layer, self.vector_layer]),
266+
[self.raster_layer, self.vector_layer, overviewMap.overview().asMapLayer()])
267+
overviewMap.overview().setStackingPosition(QgsLayoutItemMapItem.StackAboveMapLayer)
268+
overviewMap.overview().setStackingLayer(None)
269+
self.assertEqual(overviewMap.overviews().modifyMapLayerList([self.raster_layer, self.vector_layer]),
270+
[self.raster_layer, self.vector_layer])
271+
overviewMap.overview().setStackingLayer(self.raster_layer)
272+
self.assertEqual(overviewMap.overviews().modifyMapLayerList([self.raster_layer, self.vector_layer]),
273+
[overviewMap.overview().asMapLayer(), self.raster_layer, self.vector_layer])
274+
overviewMap.overview().setStackingLayer(self.vector_layer)
275+
self.assertEqual(overviewMap.overviews().modifyMapLayerList([self.raster_layer, self.vector_layer]),
276+
[self.raster_layer, overviewMap.overview().asMapLayer(), self.vector_layer])
277+
overviewMap.overview().setStackingPosition(QgsLayoutItemMapItem.StackBelowMapLabels)
278+
self.assertEqual(overviewMap.overviews().modifyMapLayerList([self.raster_layer, self.vector_layer]),
279+
[overviewMap.overview().asMapLayer(), self.raster_layer, self.vector_layer])
280+
overviewMap.overview().setStackingPosition(QgsLayoutItemMapItem.StackAboveMapLabels)
281+
self.assertEqual(overviewMap.overviews().modifyMapLayerList([self.raster_layer, self.vector_layer]),
282+
[self.raster_layer, self.vector_layer])
283+
284+
# two overviews
285+
overviewMap.overview().setStackingPosition(QgsLayoutItemMapItem.StackBelowMap)
286+
overviewMap.overviews().addOverview(QgsLayoutItemMapOverview('x', overviewMap))
287+
overviewMap.overviews().overview(1).setLinkedMap(map)
288+
overviewMap.overviews().overview(1).setStackingPosition(QgsLayoutItemMapItem.StackBelowMapLabels)
289+
self.assertEqual(overviewMap.overviews().modifyMapLayerList([self.raster_layer, self.vector_layer]),
290+
[overviewMap.overviews().overview(1).asMapLayer(), self.raster_layer, self.vector_layer, overviewMap.overview().asMapLayer()])
291+
240292

241293
if __name__ == '__main__':
242294
unittest.main()

0 commit comments

Comments
 (0)
Please sign in to comment.