Show composer maps on demand after project loading

This commit is contained in:
Marco Hugentobler 2011-05-16 14:25:54 +02:00
parent 03a2fe7bcd
commit ad95cce706
8 changed files with 83 additions and 8 deletions

View File

@ -253,6 +253,9 @@ class QgsComposerItem: QObject, QGraphicsRectItem
double rotation() const; double rotation() const;
/**Updates item, with the possibility to do custom update for subclasses*/
virtual void updateItem();
public slots: public slots:
virtual void setRotation( double r); virtual void setRotation( double r);

View File

@ -94,7 +94,7 @@ class QgsComposerMap : QgsComposerItem
/**Sets new Extent and changes width, height (and implicitely also scale)*/ /**Sets new Extent and changes width, height (and implicitely also scale)*/
void setNewExtent( const QgsRectangle& extent ); void setNewExtent( const QgsRectangle& extent );
PreviewMode previewMode(); PreviewMode previewMode() const;
void setPreviewMode( PreviewMode m ); void setPreviewMode( PreviewMode m );
/**Getter for flag that determines if the stored layer set should be used or the current layer set of the qgis mapcanvas /**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
void setCrossLength(double l); void setCrossLength(double l);
double crossLength(); double crossLength();
void setMapRotation( double r );
void updateItem();
public slots: public slots:
/**Called if map canvas has changed*/ /**Called if map canvas has changed*/

View File

@ -1123,6 +1123,22 @@ void QgsComposer::resizeEvent( QResizeEvent *e )
saveWindowState(); saveWindowState();
} }
void QgsComposer::showEvent( QShowEvent* event )
{
if ( event->spontaneous() ) //event from the window system
{
//go through maps and restore original preview modes (show on demand after loading from project file)
QMap< QgsComposerMap*, QgsComposerMap::PreviewMode >::iterator mapIt = mMapsToRestore.begin();
for ( ; mapIt != mMapsToRestore.end(); ++mapIt )
{
mapIt.key()->setPreviewMode( mapIt.value() );
mapIt.key()->cache();
mapIt.key()->update();
}
mMapsToRestore.clear();
}
}
void QgsComposer::saveWindowState() void QgsComposer::saveWindowState()
{ {
QSettings settings; QSettings settings;
@ -1169,6 +1185,14 @@ void QgsComposer::writeXML( QDomNode& parentNode, QDomDocument& doc )
QDomElement composerElem = doc.createElement( "Composer" ); QDomElement composerElem = doc.createElement( "Composer" );
composerElem.setAttribute( "title", mTitle ); composerElem.setAttribute( "title", mTitle );
//change preview mode of minimised / hidden maps (show contents only on demand)
QMap< QgsComposerMap*, QgsComposerMap::PreviewMode >::iterator mapIt = mMapsToRestore.begin();
for ( ; mapIt != mMapsToRestore.end(); ++mapIt )
{
mapIt.key()->setPreviewMode( mapIt.value() );
}
mMapsToRestore.clear();
//store if composer is open or closed //store if composer is open or closed
if ( isVisible() ) if ( isVisible() )
{ {
@ -1283,6 +1307,20 @@ void QgsComposer::readXML( const QDomElement& composerElem, const QDomDocument&
QDomElement currentComposerMapElem = composerMapList.at( i ).toElement(); QDomElement currentComposerMapElem = composerMapList.at( i ).toElement();
QgsComposerMap* newMap = new QgsComposerMap( mComposition ); QgsComposerMap* newMap = new QgsComposerMap( mComposition );
newMap->readXML( currentComposerMapElem, doc ); newMap->readXML( currentComposerMapElem, doc );
if ( fromTemplate ) //show map directly if loaded from template
{
newMap->updateItem();
}
else //show map only on demand if loaded from project
{
if ( newMap->previewMode() != QgsComposerMap::Rectangle )
{
mMapsToRestore.insert( newMap, newMap->previewMode() );
newMap->setPreviewMode( QgsComposerMap::Rectangle );
}
}
addComposerMap( newMap ); addComposerMap( newMap );
mComposition->addItem( newMap ); mComposition->addItem( newMap );
mComposition->update(); mComposition->update();
@ -1518,6 +1556,12 @@ void QgsComposer::deleteItem( QgsComposerItem* item )
//the item itself is not deleted here (usually, this is done in the destructor of QgsAddRemoveItemCommand) //the item itself is not deleted here (usually, this is done in the destructor of QgsAddRemoveItemCommand)
delete( it.value() ); delete( it.value() );
mItemWidgetMap.remove( it.key() ); mItemWidgetMap.remove( it.key() );
QgsComposerMap* map = dynamic_cast<QgsComposerMap*>( item );
if ( map )
{
mMapsToRestore.remove( map );
}
} }
void QgsComposer::setSelectionTool() void QgsComposer::setSelectionTool()

View File

@ -18,7 +18,7 @@
#ifndef QGSCOMPOSER_H #ifndef QGSCOMPOSER_H
#define QGSCOMPOSER_H #define QGSCOMPOSER_H
#include "ui_qgscomposerbase.h" #include "ui_qgscomposerbase.h"
#include "qgscomposeritem.h" #include "qgscomposermap.h"
#include "qgscontexthelp.h" #include "qgscontexthelp.h"
#include <QPrinter> #include <QPrinter>
@ -26,7 +26,6 @@ class QgisApp;
class QgsComposerArrow; class QgsComposerArrow;
class QgsComposerLabel; class QgsComposerLabel;
class QgsComposerLegend; class QgsComposerLegend;
class QgsComposerMap;
class QgsComposerPicture; class QgsComposerPicture;
class QgsComposerScaleBar; class QgsComposerScaleBar;
class QgsComposerShape; class QgsComposerShape;
@ -93,6 +92,8 @@ class QgsComposer: public QMainWindow, private Ui::QgsComposerBase
//! Resize event //! Resize event
virtual void resizeEvent( QResizeEvent * ); virtual void resizeEvent( QResizeEvent * );
virtual void showEvent( QShowEvent* event );
#ifdef Q_WS_MAC #ifdef Q_WS_MAC
//! Change event (update window menu on ActivationChange) //! Change event (update window menu on ActivationChange)
virtual void changeEvent( QEvent * ); virtual void changeEvent( QEvent * );
@ -321,6 +322,9 @@ class QgsComposer: public QMainWindow, private Ui::QgsComposerBase
QPrinter mPrinter; QPrinter mPrinter;
QUndoView* mUndoView; QUndoView* mUndoView;
//! We load composer map content from project xml only on demand. Therefore we need to store the real preview mode type
QMap< QgsComposerMap*, QgsComposerMap::PreviewMode > mMapsToRestore;
}; };
#endif #endif

View File

@ -568,6 +568,7 @@ void QgsComposerItem::changeItemRectangle( const QPointF& currentPosition, const
changeComposerItem->setSceneRect( QRectF( originalItem->transform().dx() + moveRectX, changeComposerItem->setSceneRect( QRectF( originalItem->transform().dx() + moveRectX,
originalItem->transform().dy() + moveRectY, originalItem->transform().dy() + moveRectY,
originalItem->rect().width(), originalItem->rect().height() ) ); originalItem->rect().width(), originalItem->rect().height() ) );
changeComposerItem->updateItem();
} }
} }
return; return;
@ -587,6 +588,7 @@ void QgsComposerItem::changeItemRectangle( const QPointF& currentPosition, const
{ {
changeComposerItem->setSceneRect( QRectF( originalItem->transform().dx() + mx, originalItem->transform().dy() + my, changeComposerItem->setSceneRect( QRectF( originalItem->transform().dx() + mx, originalItem->transform().dy() + my,
originalItem->rect().width() + rx, originalItem->rect().height() + ry ) ); originalItem->rect().width() + rx, originalItem->rect().height() + ry ) );
changeComposerItem->updateItem();
} }
} }

View File

@ -217,6 +217,9 @@ class CORE_EXPORT QgsComposerItem: public QObject, public QGraphicsRectItem
double rotation() const {return mRotation;} double rotation() const {return mRotation;}
/**Updates item, with the possibility to do custom update for subclasses*/
virtual void updateItem() { QGraphicsRectItem::update(); }
public slots: public slots:
virtual void setRotation( double r ); virtual void setRotation( double r );
void repaint(); void repaint();

View File

@ -390,6 +390,10 @@ void QgsComposerMap::resize( double dx, double dy )
QRectF currentRect = rect(); QRectF currentRect = rect();
QRectF newSceneRect = QRectF( transform().dx(), transform().dy(), currentRect.width() + dx, currentRect.height() + dy ); QRectF newSceneRect = QRectF( transform().dx(), transform().dy(), currentRect.width() + dx, currentRect.height() + dy );
setSceneRect( newSceneRect ); setSceneRect( newSceneRect );
if ( mPreviewMode != QgsComposerMap::Rectangle )
{
cache();
}
} }
void QgsComposerMap::moveContent( double dx, double dy ) void QgsComposerMap::moveContent( double dx, double dy )
@ -489,10 +493,6 @@ void QgsComposerMap::setSceneRect( const QRectF& rectangle )
mExtent = QgsRectangle( mExtent.xMinimum(), mExtent.yMinimum(), mExtent.xMaximum(), mExtent.yMinimum() + newHeight ); mExtent = QgsRectangle( mExtent.xMinimum(), mExtent.yMinimum(), mExtent.xMaximum(), mExtent.yMinimum() + newHeight );
mCacheUpdated = false; mCacheUpdated = false;
if ( mPreviewMode != Rectangle )
{
cache();
}
updateBoundingRect(); updateBoundingRect();
update(); update();
emit itemChanged(); emit itemChanged();
@ -513,6 +513,10 @@ void QgsComposerMap::setNewExtent( const QgsRectangle& extent )
double newHeight = currentRect.width() * extent.height() / extent.width(); double newHeight = currentRect.width() * extent.height() / extent.width();
setSceneRect( QRectF( transform().dx(), transform().dy(), currentRect.width(), newHeight ) ); setSceneRect( QRectF( transform().dx(), transform().dy(), currentRect.width(), newHeight ) );
if ( mPreviewMode != QgsComposerMap::Rectangle )
{
cache();
}
} }
void QgsComposerMap::setNewScale( double scaleDenominator ) void QgsComposerMap::setNewScale( double scaleDenominator )
@ -545,6 +549,15 @@ void QgsComposerMap::setMapRotation( double r )
emit rotationChanged( r ); emit rotationChanged( r );
} }
void QgsComposerMap::updateItem()
{
if ( mPreviewMode != QgsComposerMap::Rectangle && !mCacheUpdated )
{
cache();
}
QgsComposerItem::updateItem();
}
bool QgsComposerMap::containsWMSLayer() const bool QgsComposerMap::containsWMSLayer() const
{ {
if ( !mMapRenderer ) if ( !mMapRenderer )

View File

@ -125,7 +125,7 @@ class CORE_EXPORT QgsComposerMap : public QgsComposerItem
/**Sets new Extent and changes width, height (and implicitely also scale)*/ /**Sets new Extent and changes width, height (and implicitely also scale)*/
void setNewExtent( const QgsRectangle& extent ); void setNewExtent( const QgsRectangle& extent );
PreviewMode previewMode() {return mPreviewMode;} PreviewMode previewMode() const {return mPreviewMode;}
void setPreviewMode( PreviewMode m ) {mPreviewMode = m;} void setPreviewMode( PreviewMode m ) {mPreviewMode = m;}
/**Getter for flag that determines if the stored layer set should be used or the current layer set of the qgis mapcanvas /**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
void setMapRotation( double r ); void setMapRotation( double r );
void updateItem();
/**Sets canvas pointer (necessary to query and draw map canvas items)*/ /**Sets canvas pointer (necessary to query and draw map canvas items)*/
void setMapCanvas( QGraphicsView* canvas ) { mMapCanvas = canvas; } void setMapCanvas( QGraphicsView* canvas ) { mMapCanvas = canvas; }