Branch data Line data Source code
1 : : /***************************************************************************
2 : : qgslayoutitemmapitem.cpp
3 : : -------------------
4 : : begin : October 2017
5 : : copyright : (C) 2017 by Nyall Dawson
6 : : email : nyall dot dawson at gmail dot com
7 : : ***************************************************************************/
8 : :
9 : : /***************************************************************************
10 : : * *
11 : : * This program is free software; you can redistribute it and/or modify *
12 : : * it under the terms of the GNU General Public License as published by *
13 : : * the Free Software Foundation; either version 2 of the License, or *
14 : : * (at your option) any later version. *
15 : : * *
16 : : ***************************************************************************/
17 : :
18 : : #include "qgslayoutitemmapitem.h"
19 : : #include "qgslayoutitemmap.h"
20 : : #include "qgslayout.h"
21 : : #include <QUuid>
22 : :
23 : 0 : QgsLayoutItemMapItem::QgsLayoutItemMapItem( const QString &name, QgsLayoutItemMap *map )
24 : 0 : : QgsLayoutObject( map->layout() )
25 : 0 : , mName( name )
26 : 0 : , mMap( map )
27 : 0 : , mUuid( QUuid::createUuid().toString() )
28 : 0 : , mEnabled( true )
29 : 0 : {
30 : :
31 : 0 : }
32 : :
33 : 0 : bool QgsLayoutItemMapItem::writeXml( QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context ) const
34 : : {
35 : 0 : Q_UNUSED( document )
36 : :
37 : 0 : QgsLayoutObject::writeObjectPropertiesToElement( element, document, context );
38 : :
39 : 0 : element.setAttribute( QStringLiteral( "uuid" ), mUuid );
40 : 0 : element.setAttribute( QStringLiteral( "name" ), mName );
41 : 0 : element.setAttribute( QStringLiteral( "show" ), mEnabled );
42 : 0 : element.setAttribute( QStringLiteral( "position" ), static_cast< int >( mStackingPosition ) );
43 : :
44 : 0 : if ( mStackingLayer )
45 : : {
46 : 0 : element.setAttribute( QStringLiteral( "stackingLayer" ), mStackingLayer.layerId );
47 : 0 : element.setAttribute( QStringLiteral( "stackingLayerName" ), mStackingLayer.name );
48 : 0 : element.setAttribute( QStringLiteral( "stackingLayerSource" ), mStackingLayer.source );
49 : 0 : element.setAttribute( QStringLiteral( "stackingLayerProvider" ), mStackingLayer.provider );
50 : 0 : }
51 : :
52 : 0 : return true;
53 : 0 : }
54 : :
55 : 0 : bool QgsLayoutItemMapItem::readXml( const QDomElement &itemElem, const QDomDocument &doc, const QgsReadWriteContext &context )
56 : : {
57 : 0 : QgsLayoutObject::readObjectPropertiesFromElement( itemElem, doc, context );
58 : :
59 : 0 : mUuid = itemElem.attribute( QStringLiteral( "uuid" ) );
60 : 0 : mName = itemElem.attribute( QStringLiteral( "name" ) );
61 : 0 : mEnabled = ( itemElem.attribute( QStringLiteral( "show" ), QStringLiteral( "0" ) ) != QLatin1String( "0" ) );
62 : 0 : mStackingPosition = static_cast< StackingPosition >( itemElem.attribute( QStringLiteral( "position" ), QString::number( QgsLayoutItemMapItem::StackBelowMapLabels ) ).toInt() );
63 : :
64 : 0 : const QString layerId = itemElem.attribute( QStringLiteral( "stackingLayer" ) );
65 : 0 : const QString layerName = itemElem.attribute( QStringLiteral( "stackingLayerName" ) );
66 : 0 : const QString layerSource = itemElem.attribute( QStringLiteral( "stackingLayerSource" ) );
67 : 0 : const QString layerProvider = itemElem.attribute( QStringLiteral( "stackingLayerProvider" ) );
68 : 0 : mStackingLayer = QgsMapLayerRef( layerId, layerName, layerSource, layerProvider );
69 : 0 : if ( mMap && mMap->layout() )
70 : 0 : mStackingLayer.resolveWeakly( mMap->layout()->project() );
71 : :
72 : : return true;
73 : 0 : }
74 : :
75 : 0 : void QgsLayoutItemMapItem::finalizeRestoreFromXml()
76 : : {
77 : 0 : }
78 : :
79 : 0 : void QgsLayoutItemMapItem::setMap( QgsLayoutItemMap *map )
80 : : {
81 : 0 : mMap = map;
82 : 0 : }
83 : :
84 : 0 : const QgsLayoutItemMap *QgsLayoutItemMapItem::map() const
85 : : {
86 : 0 : return mMap;
87 : : }
88 : :
89 : 0 : void QgsLayoutItemMapItem::setName( const QString &name )
90 : : {
91 : 0 : mName = name;
92 : 0 : }
93 : :
94 : 0 : QString QgsLayoutItemMapItem::name() const
95 : : {
96 : 0 : return mName;
97 : : }
98 : :
99 : 0 : void QgsLayoutItemMapItem::setEnabled( const bool enabled )
100 : : {
101 : 0 : mEnabled = enabled;
102 : 0 : }
103 : :
104 : 0 : bool QgsLayoutItemMapItem::enabled() const
105 : : {
106 : 0 : return mEnabled;
107 : : }
108 : :
109 : 0 : bool QgsLayoutItemMapItem::usesAdvancedEffects() const
110 : : {
111 : 0 : return false;
112 : : }
113 : :
114 : 0 : QgsMapLayer *QgsLayoutItemMapItem::stackingLayer() const
115 : : {
116 : 0 : return mStackingLayer.get();
117 : : }
118 : :
119 : 0 : void QgsLayoutItemMapItem::setStackingLayer( QgsMapLayer *layer )
120 : : {
121 : 0 : mStackingLayer.setLayer( layer );
122 : 0 : }
123 : :
124 : 0 : QgsExpressionContext QgsLayoutItemMapItem::createExpressionContext() const
125 : : {
126 : 0 : if ( mMap )
127 : 0 : return mMap->createExpressionContext();
128 : :
129 : 0 : return QgsLayoutObject::createExpressionContext();
130 : 0 : }
131 : :
132 : 0 : bool QgsLayoutItemMapItem::accept( QgsStyleEntityVisitorInterface * ) const
133 : : {
134 : 0 : return true;
135 : : }
136 : :
137 : 0 : QgsMapLayer *QgsLayoutItemMapItem::mapLayer()
138 : : {
139 : 0 : return nullptr;
140 : : }
141 : :
142 : : //
143 : : // QgsLayoutItemMapItemStack
144 : : //
145 : :
146 : 0 : QgsLayoutItemMapItemStack::QgsLayoutItemMapItemStack( QgsLayoutItemMap *map )
147 : 0 : : mMap( map )
148 : 0 : {
149 : :
150 : 0 : }
151 : :
152 : 0 : QgsLayoutItemMapItemStack::~QgsLayoutItemMapItemStack()
153 : 0 : {
154 : 0 : removeItems();
155 : 0 : }
156 : :
157 : 0 : void QgsLayoutItemMapItemStack::addItem( QgsLayoutItemMapItem *item )
158 : : {
159 : 0 : mItems.append( item );
160 : 0 : }
161 : :
162 : 0 : void QgsLayoutItemMapItemStack::removeItem( const QString &itemId )
163 : : {
164 : 0 : for ( int i = mItems.size() - 1; i >= 0; --i )
165 : : {
166 : 0 : if ( mItems.at( i )->id() == itemId )
167 : : {
168 : 0 : delete mItems.takeAt( i );
169 : 0 : return;
170 : : }
171 : 0 : }
172 : 0 : }
173 : :
174 : 0 : void QgsLayoutItemMapItemStack::moveItemUp( const QString &itemId )
175 : : {
176 : 0 : QgsLayoutItemMapItem *targetItem = item( itemId );
177 : 0 : if ( !targetItem )
178 : : {
179 : 0 : return;
180 : : }
181 : :
182 : 0 : int index = mItems.indexOf( targetItem );
183 : 0 : if ( index >= mItems.size() - 1 )
184 : : {
185 : 0 : return;
186 : : }
187 : : #if QT_VERSION < QT_VERSION_CHECK(5, 13, 0)
188 : : mItems.swap( index, index + 1 );
189 : : #else
190 : 0 : mItems.swapItemsAt( index, index + 1 );
191 : : #endif
192 : 0 : }
193 : :
194 : 0 : void QgsLayoutItemMapItemStack::moveItemDown( const QString &itemId )
195 : : {
196 : 0 : QgsLayoutItemMapItem *targetItem = item( itemId );
197 : 0 : if ( !targetItem )
198 : : {
199 : 0 : return;
200 : : }
201 : :
202 : 0 : int index = mItems.indexOf( targetItem );
203 : 0 : if ( index < 1 )
204 : : {
205 : 0 : return;
206 : : }
207 : : #if QT_VERSION < QT_VERSION_CHECK(5, 13, 0)
208 : : mItems.swap( index, index - 1 );
209 : : #else
210 : 0 : mItems.swapItemsAt( index, index - 1 );
211 : : #endif
212 : 0 : }
213 : :
214 : 0 : QgsLayoutItemMapItem *QgsLayoutItemMapItemStack::item( const QString &itemId ) const
215 : 0 : {
216 : 0 : for ( QgsLayoutItemMapItem *item : mItems )
217 : : {
218 : 0 : if ( item->id() == itemId )
219 : : {
220 : 0 : return item;
221 : : }
222 : : }
223 : :
224 : 0 : return nullptr;
225 : 0 : }
226 : :
227 : 0 : QgsLayoutItemMapItem *QgsLayoutItemMapItemStack::item( const int index ) const
228 : : {
229 : 0 : if ( index < mItems.length() )
230 : : {
231 : 0 : return mItems.at( index );
232 : : }
233 : :
234 : 0 : return nullptr;
235 : 0 : }
236 : :
237 : 0 : QgsLayoutItemMapItem &QgsLayoutItemMapItemStack::operator[]( int idx )
238 : : {
239 : 0 : return *mItems[idx];
240 : : }
241 : :
242 : 0 : QList<QgsLayoutItemMapItem *> QgsLayoutItemMapItemStack::asList() const
243 : : {
244 : 0 : QList< QgsLayoutItemMapItem * > list;
245 : 0 : list.reserve( mItems.size() );
246 : 0 : for ( QgsLayoutItemMapItem *item : mItems )
247 : : {
248 : 0 : list.append( item );
249 : : }
250 : 0 : return list;
251 : 0 : }
252 : :
253 : 0 : bool QgsLayoutItemMapItemStack::writeXml( QDomElement &elem, QDomDocument &doc, const QgsReadWriteContext &context ) const
254 : : {
255 : : //write item stack
256 : 0 : for ( QgsLayoutItemMapItem *item : mItems )
257 : : {
258 : 0 : item->writeXml( elem, doc, context );
259 : : }
260 : :
261 : 0 : return true;
262 : : }
263 : :
264 : 0 : void QgsLayoutItemMapItemStack::finalizeRestoreFromXml()
265 : : {
266 : 0 : for ( QgsLayoutItemMapItem *item : std::as_const( mItems ) )
267 : : {
268 : 0 : item->finalizeRestoreFromXml();
269 : : }
270 : 0 : }
271 : :
272 : 0 : void QgsLayoutItemMapItemStack::drawItems( QPainter *painter, bool ignoreStacking )
273 : : {
274 : 0 : if ( !painter )
275 : : {
276 : 0 : return;
277 : : }
278 : :
279 : 0 : for ( QgsLayoutItemMapItem *item : std::as_const( mItems ) )
280 : : {
281 : 0 : switch ( item->stackingPosition() )
282 : : {
283 : : case QgsLayoutItemMapItem::StackBelowMap:
284 : : case QgsLayoutItemMapItem::StackAboveMapLayer:
285 : : case QgsLayoutItemMapItem::StackBelowMapLayer:
286 : : case QgsLayoutItemMapItem::StackBelowMapLabels:
287 : 0 : if ( !ignoreStacking )
288 : 0 : break;
289 : :
290 : : FALLTHROUGH
291 : : case QgsLayoutItemMapItem::StackAboveMapLabels:
292 : 0 : item->draw( painter );
293 : 0 : break;
294 : :
295 : : }
296 : : }
297 : 0 : }
298 : :
299 : 0 : bool QgsLayoutItemMapItemStack::containsAdvancedEffects() const
300 : : {
301 : 0 : for ( QgsLayoutItemMapItem *item : mItems )
302 : : {
303 : 0 : if ( item->enabled() && item->usesAdvancedEffects() )
304 : : {
305 : 0 : return true;
306 : : }
307 : : }
308 : 0 : return false;
309 : 0 : }
310 : :
311 : 0 : bool QgsLayoutItemMapItemStack::hasEnabledItems() const
312 : : {
313 : 0 : for ( QgsLayoutItemMapItem *item : mItems )
314 : : {
315 : 0 : if ( item->enabled() )
316 : : {
317 : 0 : return true;
318 : : }
319 : : }
320 : 0 : return false;
321 : 0 : }
322 : :
323 : 0 : void QgsLayoutItemMapItemStack::removeItems()
324 : : {
325 : 0 : qDeleteAll( mItems );
326 : 0 : mItems.clear();
327 : 0 : }
328 : :
329 : :
330 : :
|