Skip to content

Commit ad95cce

Browse files
committedMay 16, 2011
Show composer maps on demand after project loading
1 parent 03a2fe7 commit ad95cce

File tree

8 files changed

+83
-8
lines changed

8 files changed

+83
-8
lines changed
 

‎python/core/qgscomposeritem.sip

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,9 @@ class QgsComposerItem: QObject, QGraphicsRectItem
253253

254254
double rotation() const;
255255

256+
/**Updates item, with the possibility to do custom update for subclasses*/
257+
virtual void updateItem();
258+
256259
public slots:
257260
virtual void setRotation( double r);
258261

‎python/core/qgscomposermap.sip

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ class QgsComposerMap : QgsComposerItem
9494
/**Sets new Extent and changes width, height (and implicitely also scale)*/
9595
void setNewExtent( const QgsRectangle& extent );
9696

97-
PreviewMode previewMode();
97+
PreviewMode previewMode() const;
9898
void setPreviewMode( PreviewMode m );
9999

100100
/**Getter for flag that determines if the stored layer set should be used or the current layer set of the qgis mapcanvas
@@ -222,6 +222,10 @@ class QgsComposerMap : QgsComposerItem
222222
void setCrossLength(double l);
223223
double crossLength();
224224

225+
void setMapRotation( double r );
226+
227+
void updateItem();
228+
225229
public slots:
226230

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

‎src/app/composer/qgscomposer.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1123,6 +1123,22 @@ void QgsComposer::resizeEvent( QResizeEvent *e )
11231123
saveWindowState();
11241124
}
11251125

1126+
void QgsComposer::showEvent( QShowEvent* event )
1127+
{
1128+
if ( event->spontaneous() ) //event from the window system
1129+
{
1130+
//go through maps and restore original preview modes (show on demand after loading from project file)
1131+
QMap< QgsComposerMap*, QgsComposerMap::PreviewMode >::iterator mapIt = mMapsToRestore.begin();
1132+
for ( ; mapIt != mMapsToRestore.end(); ++mapIt )
1133+
{
1134+
mapIt.key()->setPreviewMode( mapIt.value() );
1135+
mapIt.key()->cache();
1136+
mapIt.key()->update();
1137+
}
1138+
mMapsToRestore.clear();
1139+
}
1140+
}
1141+
11261142
void QgsComposer::saveWindowState()
11271143
{
11281144
QSettings settings;
@@ -1169,6 +1185,14 @@ void QgsComposer::writeXML( QDomNode& parentNode, QDomDocument& doc )
11691185
QDomElement composerElem = doc.createElement( "Composer" );
11701186
composerElem.setAttribute( "title", mTitle );
11711187

1188+
//change preview mode of minimised / hidden maps (show contents only on demand)
1189+
QMap< QgsComposerMap*, QgsComposerMap::PreviewMode >::iterator mapIt = mMapsToRestore.begin();
1190+
for ( ; mapIt != mMapsToRestore.end(); ++mapIt )
1191+
{
1192+
mapIt.key()->setPreviewMode( mapIt.value() );
1193+
}
1194+
mMapsToRestore.clear();
1195+
11721196
//store if composer is open or closed
11731197
if ( isVisible() )
11741198
{
@@ -1283,6 +1307,20 @@ void QgsComposer::readXML( const QDomElement& composerElem, const QDomDocument&
12831307
QDomElement currentComposerMapElem = composerMapList.at( i ).toElement();
12841308
QgsComposerMap* newMap = new QgsComposerMap( mComposition );
12851309
newMap->readXML( currentComposerMapElem, doc );
1310+
1311+
if ( fromTemplate ) //show map directly if loaded from template
1312+
{
1313+
newMap->updateItem();
1314+
}
1315+
else //show map only on demand if loaded from project
1316+
{
1317+
if ( newMap->previewMode() != QgsComposerMap::Rectangle )
1318+
{
1319+
mMapsToRestore.insert( newMap, newMap->previewMode() );
1320+
newMap->setPreviewMode( QgsComposerMap::Rectangle );
1321+
}
1322+
}
1323+
12861324
addComposerMap( newMap );
12871325
mComposition->addItem( newMap );
12881326
mComposition->update();
@@ -1518,6 +1556,12 @@ void QgsComposer::deleteItem( QgsComposerItem* item )
15181556
//the item itself is not deleted here (usually, this is done in the destructor of QgsAddRemoveItemCommand)
15191557
delete( it.value() );
15201558
mItemWidgetMap.remove( it.key() );
1559+
1560+
QgsComposerMap* map = dynamic_cast<QgsComposerMap*>( item );
1561+
if ( map )
1562+
{
1563+
mMapsToRestore.remove( map );
1564+
}
15211565
}
15221566

15231567
void QgsComposer::setSelectionTool()

‎src/app/composer/qgscomposer.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,14 @@
1818
#ifndef QGSCOMPOSER_H
1919
#define QGSCOMPOSER_H
2020
#include "ui_qgscomposerbase.h"
21-
#include "qgscomposeritem.h"
21+
#include "qgscomposermap.h"
2222
#include "qgscontexthelp.h"
2323
#include <QPrinter>
2424

2525
class QgisApp;
2626
class QgsComposerArrow;
2727
class QgsComposerLabel;
2828
class QgsComposerLegend;
29-
class QgsComposerMap;
3029
class QgsComposerPicture;
3130
class QgsComposerScaleBar;
3231
class QgsComposerShape;
@@ -93,6 +92,8 @@ class QgsComposer: public QMainWindow, private Ui::QgsComposerBase
9392
//! Resize event
9493
virtual void resizeEvent( QResizeEvent * );
9594

95+
virtual void showEvent( QShowEvent* event );
96+
9697
#ifdef Q_WS_MAC
9798
//! Change event (update window menu on ActivationChange)
9899
virtual void changeEvent( QEvent * );
@@ -321,6 +322,9 @@ class QgsComposer: public QMainWindow, private Ui::QgsComposerBase
321322
QPrinter mPrinter;
322323

323324
QUndoView* mUndoView;
325+
326+
//! We load composer map content from project xml only on demand. Therefore we need to store the real preview mode type
327+
QMap< QgsComposerMap*, QgsComposerMap::PreviewMode > mMapsToRestore;
324328
};
325329

326330
#endif

‎src/core/composer/qgscomposeritem.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -568,6 +568,7 @@ void QgsComposerItem::changeItemRectangle( const QPointF& currentPosition, const
568568
changeComposerItem->setSceneRect( QRectF( originalItem->transform().dx() + moveRectX,
569569
originalItem->transform().dy() + moveRectY,
570570
originalItem->rect().width(), originalItem->rect().height() ) );
571+
changeComposerItem->updateItem();
571572
}
572573
}
573574
return;
@@ -587,6 +588,7 @@ void QgsComposerItem::changeItemRectangle( const QPointF& currentPosition, const
587588
{
588589
changeComposerItem->setSceneRect( QRectF( originalItem->transform().dx() + mx, originalItem->transform().dy() + my,
589590
originalItem->rect().width() + rx, originalItem->rect().height() + ry ) );
591+
changeComposerItem->updateItem();
590592
}
591593
}
592594

‎src/core/composer/qgscomposeritem.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,9 @@ class CORE_EXPORT QgsComposerItem: public QObject, public QGraphicsRectItem
217217

218218
double rotation() const {return mRotation;}
219219

220+
/**Updates item, with the possibility to do custom update for subclasses*/
221+
virtual void updateItem() { QGraphicsRectItem::update(); }
222+
220223
public slots:
221224
virtual void setRotation( double r );
222225
void repaint();

‎src/core/composer/qgscomposermap.cpp

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,10 @@ void QgsComposerMap::resize( double dx, double dy )
390390
QRectF currentRect = rect();
391391
QRectF newSceneRect = QRectF( transform().dx(), transform().dy(), currentRect.width() + dx, currentRect.height() + dy );
392392
setSceneRect( newSceneRect );
393+
if ( mPreviewMode != QgsComposerMap::Rectangle )
394+
{
395+
cache();
396+
}
393397
}
394398

395399
void QgsComposerMap::moveContent( double dx, double dy )
@@ -489,10 +493,6 @@ void QgsComposerMap::setSceneRect( const QRectF& rectangle )
489493
mExtent = QgsRectangle( mExtent.xMinimum(), mExtent.yMinimum(), mExtent.xMaximum(), mExtent.yMinimum() + newHeight );
490494
mCacheUpdated = false;
491495

492-
if ( mPreviewMode != Rectangle )
493-
{
494-
cache();
495-
}
496496
updateBoundingRect();
497497
update();
498498
emit itemChanged();
@@ -513,6 +513,10 @@ void QgsComposerMap::setNewExtent( const QgsRectangle& extent )
513513
double newHeight = currentRect.width() * extent.height() / extent.width();
514514

515515
setSceneRect( QRectF( transform().dx(), transform().dy(), currentRect.width(), newHeight ) );
516+
if ( mPreviewMode != QgsComposerMap::Rectangle )
517+
{
518+
cache();
519+
}
516520
}
517521

518522
void QgsComposerMap::setNewScale( double scaleDenominator )
@@ -545,6 +549,15 @@ void QgsComposerMap::setMapRotation( double r )
545549
emit rotationChanged( r );
546550
}
547551

552+
void QgsComposerMap::updateItem()
553+
{
554+
if ( mPreviewMode != QgsComposerMap::Rectangle && !mCacheUpdated )
555+
{
556+
cache();
557+
}
558+
QgsComposerItem::updateItem();
559+
}
560+
548561
bool QgsComposerMap::containsWMSLayer() const
549562
{
550563
if ( !mMapRenderer )

‎src/core/composer/qgscomposermap.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ class CORE_EXPORT QgsComposerMap : public QgsComposerItem
125125
/**Sets new Extent and changes width, height (and implicitely also scale)*/
126126
void setNewExtent( const QgsRectangle& extent );
127127

128-
PreviewMode previewMode() {return mPreviewMode;}
128+
PreviewMode previewMode() const {return mPreviewMode;}
129129
void setPreviewMode( PreviewMode m ) {mPreviewMode = m;}
130130

131131
/**Getter for flag that determines if the stored layer set should be used or the current layer set of the qgis mapcanvas
@@ -254,6 +254,8 @@ class CORE_EXPORT QgsComposerMap : public QgsComposerItem
254254

255255
void setMapRotation( double r );
256256

257+
void updateItem();
258+
257259
/**Sets canvas pointer (necessary to query and draw map canvas items)*/
258260
void setMapCanvas( QGraphicsView* canvas ) { mMapCanvas = canvas; }
259261

0 commit comments

Comments
 (0)
Please sign in to comment.