Skip to content

Commit 24d7482

Browse files
author
mhugent
committed
[FEATURE]: Possibility to have several composers in one project
git-svn-id: http://svn.osgeo.org/qgis/trunk@11865 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent 94f8ff7 commit 24d7482

File tree

10 files changed

+553
-317
lines changed

10 files changed

+553
-317
lines changed
1.19 KB
Loading

src/app/composer/qgscomposer.cpp

Lines changed: 175 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,10 @@
6565
#include <QSizeGrip>
6666
#include "qgslogger.h"
6767

68-
QgsComposer::QgsComposer( QgisApp *qgis ): QMainWindow(), mFirstPaint( true )
68+
QgsComposer::QgsComposer( QgisApp *qgis, const QString& id ): QMainWindow(), mId( id )
6969
{
7070
setupUi( this );
71+
setAttribute( Qt::WA_DeleteOnClose );
7172
setupTheme();
7273

7374
QToolButton* orderingToolButton = new QToolButton( this );
@@ -106,7 +107,7 @@ QgsComposer::QgsComposer( QgisApp *qgis ): QMainWindow(), mFirstPaint( true )
106107
toggleActionGroup->addAction( mActionSelectMoveItem );
107108
toggleActionGroup->setExclusive( true );
108109

109-
setWindowTitle( tr( "QGIS - print composer" ) );
110+
setWindowTitle( mId );
110111

111112
mActionAddNewMap->setCheckable( true );
112113
mActionAddNewLabel->setCheckable( true );
@@ -116,17 +117,21 @@ QgsComposer::QgsComposer( QgisApp *qgis ): QMainWindow(), mFirstPaint( true )
116117
mActionAddImage->setCheckable( true );
117118
mActionMoveItemContent->setCheckable( true );
118119

120+
#ifdef Q_WS_MAC
119121
QMenu *appMenu = menuBar()->addMenu( tr( "QGIS" ) );
120122
appMenu->addAction( QgisApp::instance()->actionAbout() );
121123
appMenu->addAction( QgisApp::instance()->actionOptions() );
124+
#endif
122125

123126
QMenu *fileMenu = menuBar()->addMenu( tr( "File" ) );
124-
fileMenu->addAction( tr( "Close" ), this, SLOT( close() ), tr( "Ctrl+W" ) );
125127
fileMenu->addAction( mActionExportAsImage );
126128
fileMenu->addAction( mActionExportAsPDF );
127129
fileMenu->addAction( mActionExportAsSVG );
128130
fileMenu->addSeparator();
129131
fileMenu->addAction( mActionPrint );
132+
fileMenu->addSeparator();
133+
fileMenu->addAction( mActionQuit );
134+
QObject::connect( mActionQuit, SIGNAL( triggered() ), this, SLOT( close() ) );
130135

131136
QMenu *viewMenu = menuBar()->addMenu( tr( "View" ) );
132137
viewMenu->addAction( mActionZoomIn );
@@ -159,14 +164,13 @@ QgsComposer::QgsComposer( QgisApp *qgis ): QMainWindow(), mFirstPaint( true )
159164
#endif
160165
#endif
161166

167+
mQgis = qgis;
168+
mFirstTime = true;
162169

163-
// Create action to select this window and add it to Window menu
170+
// Create action to select this window
164171
mWindowAction = new QAction( windowTitle(), this );
165172
connect( mWindowAction, SIGNAL( triggered() ), this, SLOT( activate() ) );
166173

167-
mQgis = qgis;
168-
mFirstTime = true;
169-
170174
QgsDebugMsg( "entered." );
171175

172176
setMouseTracking( true );
@@ -188,8 +192,6 @@ QgsComposer::QgsComposer( QgisApp *qgis ): QMainWindow(), mFirstPaint( true )
188192
mCompositionOptionsLayout->setMargin( 0 );
189193
mCompositionOptionsLayout->addWidget( compositionWidget );
190194

191-
mPrinter = 0;
192-
193195
QGridLayout *l = new QGridLayout( mViewFrame );
194196
l->setMargin( 0 );
195197
l->addWidget( mView, 0, 0 );
@@ -206,10 +208,9 @@ QgsComposer::QgsComposer( QgisApp *qgis ): QMainWindow(), mFirstPaint( true )
206208

207209
mView->setFocus();
208210

209-
//connect with signals from QgsProject to read/write project files
211+
//connect with signals from QgsProject to write project files
210212
if ( QgsProject::instance() )
211213
{
212-
connect( QgsProject::instance(), SIGNAL( readProject( const QDomDocument& ) ), this, SLOT( readXML( const QDomDocument& ) ) );
213214
connect( QgsProject::instance(), SIGNAL( writeProject( QDomDocument& ) ), this, SLOT( writeXML( QDomDocument& ) ) );
214215
}
215216
}
@@ -229,6 +230,7 @@ void QgsComposer::setupTheme()
229230
{
230231
//now set all the icons - getThemeIcon will fall back to default theme if its
231232
//missing from active theme
233+
mActionQuit->setIcon( QgisApp::getThemeIcon( "/mActionFileExit.png" ) );
232234
mActionLoadFromTemplate->setIcon( QgisApp::getThemeIcon( "/mActionFileOpen.png" ) );
233235
mActionSaveAsTemplate->setIcon( QgisApp::getThemeIcon( "/mActionFileSaveAs.png" ) );
234236
mActionExportAsImage->setIcon( QgisApp::getThemeIcon( "/mActionSaveMapAsImage.png" ) );
@@ -290,36 +292,33 @@ void QgsComposer::open( void )
290292
}
291293
}
292294

293-
void QgsComposer::paintEvent( QPaintEvent* event )
294-
{
295-
QMainWindow::paintEvent( event );
296-
#if 0 //MH: disabled for now as there are segfaults on some systems
297-
//The cached content of the composer maps need to be recreated it is the first paint event of the composer after reading from XML file.
298-
//Otherwise the resolution of the composer map is not suitable for screen
299-
if ( mFirstPaint )
300-
{
301-
QMap<QgsComposerItem*, QWidget*>::iterator it = mItemWidgetMap.begin();
302-
for ( ; it != mItemWidgetMap.constEnd(); ++it )
303-
{
304-
QgsComposerMap* cm = qobject_cast<QgsComposerMap *>( it.key() );
305-
if ( cm )
306-
{
307-
mFirstPaint = false;
308-
cm->cache();
309-
cm->update();
310-
}
311-
}
312-
}
313-
#endif //0
314-
}
315-
316295
void QgsComposer::activate()
317296
{
318297
raise();
319298
setWindowState( windowState() & ~Qt::WindowMinimized );
320299
activateWindow();
321300
}
322301

302+
void QgsComposer::closeEvent( QCloseEvent *event )
303+
{
304+
if ( QMessageBox::warning( 0, tr( "Remove composer?" ), tr( "Do you really want to remove the composer instance '%1'?" ).arg( mId ), QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Cancel ) == QMessageBox::Ok )
305+
{
306+
mQgis->checkOutComposer( this );
307+
event->accept();
308+
}
309+
else
310+
{
311+
event->ignore();
312+
}
313+
#if 0
314+
QMainWindow::closeEvent( event );
315+
if ( event->isAccepted() )
316+
{
317+
QgisApp::instance()->removeWindow( mWindowAction );
318+
}
319+
#endif //0
320+
}
321+
323322
#ifdef Q_WS_MAC
324323
void QgsComposer::changeEvent( QEvent* event )
325324
{
@@ -338,15 +337,6 @@ void QgsComposer::changeEvent( QEvent* event )
338337
}
339338
}
340339

341-
void QgsComposer::closeEvent( QCloseEvent *event )
342-
{
343-
QMainWindow::closeEvent( event );
344-
if ( event->isAccepted() )
345-
{
346-
QgisApp::instance()->removeWindow( mWindowAction );
347-
}
348-
}
349-
350340
void QgsComposer::showEvent( QShowEvent *event )
351341
{
352342
QMainWindow::showEvent( event );
@@ -1031,6 +1021,7 @@ void QgsComposer::writeXML( QDomDocument& doc )
10311021
void QgsComposer::writeXML( QDomNode& parentNode, QDomDocument& doc )
10321022
{
10331023
QDomElement composerElem = doc.createElement( "Composer" );
1024+
composerElem.setAttribute( "id", mId );
10341025
parentNode.appendChild( composerElem );
10351026

10361027
//store composer items:
@@ -1049,6 +1040,145 @@ void QgsComposer::writeXML( QDomNode& parentNode, QDomDocument& doc )
10491040
}
10501041
}
10511042

1043+
void QgsComposer::readXML( const QDomDocument& doc )
1044+
{
1045+
QDomNodeList composerNodeList = doc.elementsByTagName( "Composer" );
1046+
if ( composerNodeList.size() < 1 )
1047+
{
1048+
return;
1049+
}
1050+
readXML( composerNodeList.at( 0 ).toElement(), doc );
1051+
}
1052+
1053+
void QgsComposer::readXML( const QDomElement& composerElem, const QDomDocument& doc )
1054+
{
1055+
mId = composerElem.attribute( "id", "" );
1056+
setWindowTitle( mId );
1057+
1058+
// Create action to select this window
1059+
delete mWindowAction;
1060+
mWindowAction = new QAction( windowTitle(), this );
1061+
connect( mWindowAction, SIGNAL( triggered() ), this, SLOT( activate() ) );
1062+
1063+
//delete composer view and composition
1064+
delete mView;
1065+
mView = 0;
1066+
//delete every child of mViewFrame
1067+
QObjectList viewFrameChildren = mViewFrame->children();
1068+
QObjectList::iterator it = viewFrameChildren.begin();
1069+
for ( ; it != viewFrameChildren.end(); ++it )
1070+
{
1071+
delete( *it );
1072+
}
1073+
//delete composition widget
1074+
QgsCompositionWidget* oldCompositionWidget = qobject_cast<QgsCompositionWidget *>( mCompositionOptionsFrame->children().at( 0 ) );
1075+
delete oldCompositionWidget;
1076+
delete mCompositionOptionsLayout;
1077+
mCompositionOptionsLayout = 0;
1078+
1079+
mView = new QgsComposerView( mViewFrame );
1080+
connectSlots();
1081+
1082+
mComposition = new QgsComposition( mQgis->mapCanvas()->mapRenderer() );
1083+
mComposition->readXML( composerElem, doc );
1084+
1085+
QGridLayout *l = new QGridLayout( mViewFrame );
1086+
l->setMargin( 0 );
1087+
l->addWidget( mView, 0, 0 );
1088+
1089+
//create compositionwidget
1090+
QgsCompositionWidget* compositionWidget = new QgsCompositionWidget( mCompositionOptionsFrame, mComposition );
1091+
QObject::connect( mComposition, SIGNAL( paperSizeChanged() ), compositionWidget, SLOT( displayCompositionWidthHeight() ) );
1092+
compositionWidget->show();
1093+
1094+
mCompositionOptionsLayout = new QGridLayout( mCompositionOptionsFrame );
1095+
mCompositionOptionsLayout->setMargin( 0 );
1096+
mCompositionOptionsLayout->addWidget( compositionWidget );
1097+
1098+
//read and restore all the items
1099+
1100+
//composer labels
1101+
QDomNodeList composerLabelList = composerElem.elementsByTagName( "ComposerLabel" );
1102+
for ( int i = 0; i < composerLabelList.size(); ++i )
1103+
{
1104+
QDomElement currentComposerLabelElem = composerLabelList.at( i ).toElement();
1105+
QgsComposerLabel* newLabel = new QgsComposerLabel( mComposition );
1106+
newLabel->readXML( currentComposerLabelElem, doc );
1107+
addComposerLabel( newLabel );
1108+
mComposition->addItem( newLabel );
1109+
mComposition->update();
1110+
mComposition->clearSelection();
1111+
newLabel->setSelected( true );
1112+
showItemOptions( newLabel );
1113+
}
1114+
1115+
//composer maps
1116+
QDomNodeList composerMapList = composerElem.elementsByTagName( "ComposerMap" );
1117+
for ( int i = 0; i < composerMapList.size(); ++i )
1118+
{
1119+
QDomElement currentComposerMapElem = composerMapList.at( i ).toElement();
1120+
QgsComposerMap* newMap = new QgsComposerMap( mComposition );
1121+
newMap->readXML( currentComposerMapElem, doc );
1122+
addComposerMap( newMap );
1123+
mComposition->addItem( newMap );
1124+
mComposition->update();
1125+
mComposition->clearSelection();
1126+
newMap->setSelected( true );
1127+
showItemOptions( newMap );
1128+
}
1129+
1130+
//composer scalebars
1131+
QDomNodeList composerScaleBarList = composerElem.elementsByTagName( "ComposerScaleBar" );
1132+
for ( int i = 0; i < composerScaleBarList.size(); ++i )
1133+
{
1134+
QDomElement currentScaleBarElem = composerScaleBarList.at( i ).toElement();
1135+
QgsComposerScaleBar* newScaleBar = new QgsComposerScaleBar( mComposition );
1136+
newScaleBar->readXML( currentScaleBarElem, doc );
1137+
addComposerScaleBar( newScaleBar );
1138+
mComposition->addItem( newScaleBar );
1139+
mComposition->update();
1140+
mComposition->clearSelection();
1141+
newScaleBar->setSelected( true );
1142+
showItemOptions( newScaleBar );
1143+
}
1144+
1145+
//composer legends
1146+
QDomNodeList composerLegendList = composerElem.elementsByTagName( "ComposerLegend" );
1147+
for ( int i = 0; i < composerLegendList.size(); ++i )
1148+
{
1149+
QDomElement currentLegendElem = composerLegendList.at( i ).toElement();
1150+
QgsComposerLegend* newLegend = new QgsComposerLegend( mComposition );
1151+
newLegend->readXML( currentLegendElem, doc );
1152+
addComposerLegend( newLegend );
1153+
mComposition->addItem( newLegend );
1154+
mComposition->update();
1155+
mComposition->clearSelection();
1156+
newLegend->setSelected( true );
1157+
showItemOptions( newLegend );
1158+
}
1159+
1160+
//composer pictures
1161+
QDomNodeList composerPictureList = composerElem.elementsByTagName( "ComposerPicture" );
1162+
for ( int i = 0; i < composerPictureList.size(); ++i )
1163+
{
1164+
QDomElement currentPictureElem = composerPictureList.at( i ).toElement();
1165+
QgsComposerPicture* newPicture = new QgsComposerPicture( mComposition );
1166+
newPicture->readXML( currentPictureElem, doc );
1167+
addComposerPicture( newPicture );
1168+
mComposition->addItem( newPicture );
1169+
mComposition->update();
1170+
mComposition->clearSelection();
1171+
newPicture->setSelected( true );
1172+
showItemOptions( newPicture );
1173+
}
1174+
1175+
mComposition->sortZList();
1176+
mView->setComposition( mComposition );
1177+
1178+
setSelectionTool();
1179+
}
1180+
1181+
#if 0
10521182
void QgsComposer::readXML( const QDomDocument& doc )
10531183
{
10541184
//look for Composer element
@@ -1058,6 +1188,7 @@ void QgsComposer::readXML( const QDomDocument& doc )
10581188
return; //nothing to do...
10591189
}
10601190
QDomElement composerElem = nl.at( 0 ).toElement();
1191+
mId = composerElem.attribute( "id", "" );
10611192

10621193
//look for Composition element
10631194
QDomNodeList cnl = composerElem.elementsByTagName( "Composition" );
@@ -1187,6 +1318,7 @@ void QgsComposer::readXML( const QDomDocument& doc )
11871318

11881319
setSelectionTool();
11891320
}
1321+
#endif //0
11901322

11911323
void QgsComposer::addComposerMap( QgsComposerMap* map )
11921324
{

0 commit comments

Comments
 (0)