Skip to content

Commit c5e527d

Browse files
committed
Fix lazy restore of composer maps from xml
1 parent 0ed1df8 commit c5e527d

File tree

6 files changed

+35
-17
lines changed

6 files changed

+35
-17
lines changed

python/core/qgscomposition.sip

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ class QgsComposition: QGraphicsScene
107107
@param doc xml document
108108
@param addUndoCommands insert AddItem commands if true (e.g. for copy/paste)
109109
@param pos item position. Optional, take position from xml if 0*/
110-
void addItemsFromXML( const QDomElement& elem, const QDomDocument& doc, bool addUndoCommands = false, QPointF* pos = 0 );
110+
//void addItemsFromXML( const QDomElement& elem, const QDomDocument& doc, QMap< QgsComposerMap*, int >* mapsToRestore, bool addUndoCommands = false, QPointF* pos = 0 );
111111

112112
/**Adds item to z list. Usually called from constructor of QgsComposerItem*/
113113
void addItemToZList( QgsComposerItem* item );

src/app/composer/qgscomposer.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1126,10 +1126,10 @@ void QgsComposer::showEvent( QShowEvent* event )
11261126
if ( event->spontaneous() ) //event from the window system
11271127
{
11281128
//go through maps and restore original preview modes (show on demand after loading from project file)
1129-
QMap< QgsComposerMap*, QgsComposerMap::PreviewMode >::iterator mapIt = mMapsToRestore.begin();
1129+
QMap< QgsComposerMap*, int >::iterator mapIt = mMapsToRestore.begin();
11301130
for ( ; mapIt != mMapsToRestore.end(); ++mapIt )
11311131
{
1132-
mapIt.key()->setPreviewMode( mapIt.value() );
1132+
mapIt.key()->setPreviewMode(( QgsComposerMap::PreviewMode )( mapIt.value() ) );
11331133
mapIt.key()->cache();
11341134
mapIt.key()->update();
11351135
}
@@ -1186,10 +1186,10 @@ void QgsComposer::writeXML( QDomNode& parentNode, QDomDocument& doc )
11861186
composerElem.setAttribute( "title", mTitle );
11871187

11881188
//change preview mode of minimised / hidden maps before saving XML (show contents only on demand)
1189-
QMap< QgsComposerMap*, QgsComposerMap::PreviewMode >::iterator mapIt = mMapsToRestore.begin();
1189+
QMap< QgsComposerMap*, int >::iterator mapIt = mMapsToRestore.begin();
11901190
for ( ; mapIt != mMapsToRestore.end(); ++mapIt )
11911191
{
1192-
mapIt.key()->setPreviewMode( mapIt.value() );
1192+
mapIt.key()->setPreviewMode(( QgsComposerMap::PreviewMode )( mapIt.value() ) );
11931193
}
11941194
mMapsToRestore.clear();
11951195

@@ -1281,7 +1281,7 @@ void QgsComposer::readXML( const QDomElement& composerElem, const QDomDocument&
12811281
//read and restore all the items
12821282
if ( mComposition )
12831283
{
1284-
mComposition->addItemsFromXML( composerElem, doc );
1284+
mComposition->addItemsFromXML( composerElem, doc, &mMapsToRestore );
12851285
}
12861286

12871287
mComposition->sortZList();

src/app/composer/qgscomposer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,7 @@ class QgsComposer: public QMainWindow, private Ui::QgsComposerBase
321321
QUndoView* mUndoView;
322322

323323
//! We load composer map content from project xml only on demand. Therefore we need to store the real preview mode type
324-
QMap< QgsComposerMap*, QgsComposerMap::PreviewMode > mMapsToRestore;
324+
QMap< QgsComposerMap*, int > mMapsToRestore;
325325

326326
QDockWidget* mItemDock;
327327
QDockWidget* mUndoDock;

src/core/composer/qgscomposition.cpp

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
#include "qgscomposition.h"
1818
#include "qgscomposeritem.h"
19-
#include "qgscomposermap.h"
2019
#include "qgspaperitem.h"
2120
#include "qgscomposerarrow.h"
2221
#include "qgscomposerlabel.h"
@@ -261,7 +260,8 @@ bool QgsComposition::readXML( const QDomElement& compositionElem, const QDomDocu
261260
return true;
262261
}
263262

264-
void QgsComposition::addItemsFromXML( const QDomElement& elem, const QDomDocument& doc, bool addUndoCommands, QPointF* pos )
263+
void QgsComposition::addItemsFromXML( const QDomElement& elem, const QDomDocument& doc, QMap< QgsComposerMap*, int >* mapsToRestore,
264+
bool addUndoCommands, QPointF* pos )
265265
{
266266
QDomNodeList composerLabelList = elem.elementsByTagName( "ComposerLabel" );
267267
for ( int i = 0; i < composerLabelList.size(); ++i )
@@ -286,11 +286,19 @@ void QgsComposition::addItemsFromXML( const QDomElement& elem, const QDomDocumen
286286
QDomElement currentComposerMapElem = composerMapList.at( i ).toElement();
287287
QgsComposerMap* newMap = new QgsComposerMap( this );
288288
newMap->readXML( currentComposerMapElem, doc );
289+
290+
if ( mapsToRestore )
291+
{
292+
mapsToRestore->insert( newMap, ( int )( newMap->previewMode() ) );
293+
newMap->setPreviewMode( QgsComposerMap::Rectangle );
294+
}
295+
addComposerMap( newMap, false );
296+
289297
if ( pos )
290298
{
291299
newMap->setItemPosition( pos->x(), pos->y() );
292300
}
293-
addComposerMap( newMap );
301+
294302
if ( addUndoCommands )
295303
{
296304
pushAddRemoveCommand( newMap, tr( "Map added" ) );
@@ -1000,12 +1008,20 @@ void QgsComposition::addComposerLabel( QgsComposerLabel* label )
10001008
emit selectedItemChanged( label );
10011009
}
10021010

1003-
void QgsComposition::addComposerMap( QgsComposerMap* map )
1011+
void QgsComposition::addComposerMap( QgsComposerMap* map, bool setDefaultPreviewStyle )
10041012
{
10051013
addItem( map );
1006-
//set default preview mode to cache. Must be done here between adding composer map to scene and emiting signal
1007-
map->setPreviewMode( QgsComposerMap::Cache );
1008-
map->cache();
1014+
if ( setDefaultPreviewStyle )
1015+
{
1016+
//set default preview mode to cache. Must be done here between adding composer map to scene and emiting signal
1017+
map->setPreviewMode( QgsComposerMap::Cache );
1018+
}
1019+
1020+
if ( map->previewMode() != QgsComposerMap::Rectangle )
1021+
{
1022+
map->cache();
1023+
}
1024+
10091025
emit composerMapAdded( map );
10101026
clearSelection();
10111027
map->setSelected( true );

src/core/composer/qgscomposition.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,9 +144,11 @@ class CORE_EXPORT QgsComposition: public QGraphicsScene
144144
/**Add items from XML representation to the graphics scene (for project file reading, pasting items from clipboard)
145145
@param elem items parent element, e.g. \verbatim <Composer> \endverbatim or \verbatim <ComposerItemClipboard> \endverbatim
146146
@param doc xml document
147+
@param mapsToRestore for reading from project file: set preview move 'rectangle' to all maps and save the preview states to show composer maps on demand
147148
@param addUndoCommands insert AddItem commands if true (e.g. for copy/paste)
148149
@param pos item position. Optional, take position from xml if 0*/
149-
void addItemsFromXML( const QDomElement& elem, const QDomDocument& doc, bool addUndoCommands = false, QPointF* pos = 0 );
150+
void addItemsFromXML( const QDomElement& elem, const QDomDocument& doc, QMap< QgsComposerMap*, int >* mapsToRestore = 0,
151+
bool addUndoCommands = false, QPointF* pos = 0 );
150152

151153
/**Adds item to z list. Usually called from constructor of QgsComposerItem*/
152154
void addItemToZList( QgsComposerItem* item );
@@ -194,7 +196,7 @@ class CORE_EXPORT QgsComposition: public QGraphicsScene
194196
/**Adds label to the graphics scene and advices composer to create a widget for it (through signal)*/
195197
void addComposerLabel( QgsComposerLabel* label );
196198
/**Adds map to the graphics scene and advices composer to create a widget for it (through signal)*/
197-
void addComposerMap( QgsComposerMap* map );
199+
void addComposerMap( QgsComposerMap* map, bool setDefaultPreviewStyle = true );
198200
/**Adds scale bar to the graphics scene and advices composer to create a widget for it (through signal)*/
199201
void addComposerScaleBar( QgsComposerScaleBar* scaleBar );
200202
/**Adds legend to the graphics scene and advices composer to create a widget for it (through signal)*/

src/gui/qgscomposerview.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -480,7 +480,7 @@ void QgsComposerView::keyPressEvent( QKeyEvent * e )
480480
if ( composition() )
481481
{
482482
QPointF pt = mapToScene( mapFromGlobal( QCursor::pos() ) );
483-
composition()->addItemsFromXML( docElem, doc, true, &pt );
483+
composition()->addItemsFromXML( docElem, doc, 0, true, &pt );
484484
}
485485
}
486486
}

0 commit comments

Comments
 (0)