Skip to content

Commit 764551a

Browse files
author
mhugent
committedNov 11, 2009
[FEATURE?] Close composers instead of deleting them. Added composer manager dialog to manage the existing composer instances
git-svn-id: http://svn.osgeo.org/qgis/trunk@12087 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent 21e0a63 commit 764551a

11 files changed

+401
-225
lines changed
 

‎src/app/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ SET(QGIS_APP_SRCS
7777
composer/qgscomposeritemwidget.cpp
7878
composer/qgscomposerlabelwidget.cpp
7979
composer/qgscomposerpicturewidget.cpp
80+
composer/qgscomposermanager.cpp
8081
composer/qgscomposermapwidget.cpp
8182
composer/qgscomposerscalebarwidget.cpp
8283
composer/qgscomposerlegenditemdialog.cpp
@@ -174,6 +175,7 @@ SET (QGIS_APP_MOC_HDRS
174175
composer/qgscomposeritemwidget.h
175176
composer/qgscomposerlabelwidget.h
176177
composer/qgscomposerlegendwidget.h
178+
composer/qgscomposermanager.h
177179
composer/qgscomposermapwidget.h
178180
composer/qgscomposerpicturewidget.h
179181
composer/qgscomposerscalebarwidget.h

‎src/app/composer/qgscomposer.cpp

Lines changed: 17 additions & 170 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,12 @@
6565
#include <QSizeGrip>
6666
#include "qgslogger.h"
6767

68-
QgsComposer::QgsComposer( QgisApp *qgis, const QString& id ): QMainWindow(), mId( id )
68+
QgsComposer::QgsComposer( QgisApp *qgis, const QString& title ): QMainWindow(), mTitle( title )
6969
{
7070
setupUi( this );
71-
setAttribute( Qt::WA_DeleteOnClose );
71+
setWindowTitle( mTitle );
7272
setupTheme();
73+
QObject::connect( mButtonBox, SIGNAL( rejected() ), this, SLOT( close() ) );
7374

7475
QToolButton* orderingToolButton = new QToolButton( this );
7576
orderingToolButton->setPopupMode( QToolButton::InstantPopup );
@@ -107,8 +108,6 @@ QgsComposer::QgsComposer( QgisApp *qgis, const QString& id ): QMainWindow(), mId
107108
toggleActionGroup->addAction( mActionSelectMoveItem );
108109
toggleActionGroup->setExclusive( true );
109110

110-
setWindowTitle( mId );
111-
112111
mActionAddNewMap->setCheckable( true );
113112
mActionAddNewLabel->setCheckable( true );
114113
mActionAddNewLegend->setCheckable( true );
@@ -185,6 +184,7 @@ QgsComposer::QgsComposer( QgisApp *qgis, const QString& id ): QMainWindow(), mId
185184
connectSlots();
186185

187186
mComposition = new QgsComposition( mQgis->mapCanvas()->mapRenderer() );
187+
mComposition->setParent(mView);
188188
mView->setComposition( mComposition );
189189

190190
QgsCompositionWidget* compositionWidget = new QgsCompositionWidget( mCompositionOptionsFrame, mComposition );
@@ -297,31 +297,12 @@ void QgsComposer::open( void )
297297

298298
void QgsComposer::activate()
299299
{
300+
show();
300301
raise();
301302
setWindowState( windowState() & ~Qt::WindowMinimized );
302303
activateWindow();
303304
}
304305

305-
void QgsComposer::closeEvent( QCloseEvent *event )
306-
{
307-
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 )
308-
{
309-
mQgis->checkOutComposer( this );
310-
event->accept();
311-
}
312-
else
313-
{
314-
event->ignore();
315-
}
316-
#if 0
317-
QMainWindow::closeEvent( event );
318-
if ( event->isAccepted() )
319-
{
320-
QgisApp::instance()->removeWindow( mWindowAction );
321-
}
322-
#endif //0
323-
}
324-
325306
#ifdef Q_WS_MAC
326307
void QgsComposer::changeEvent( QEvent* event )
327308
{
@@ -351,6 +332,12 @@ void QgsComposer::showEvent( QShowEvent *event )
351332
}
352333
#endif
353334

335+
void QgsComposer::setTitle( const QString& title )
336+
{
337+
mTitle = title;
338+
setWindowTitle( mTitle );
339+
}
340+
354341
void QgsComposer::showCompositionOptions( QWidget *w )
355342
{
356343
QWidget* currentWidget = mItemStackedWidget->currentWidget();
@@ -1024,7 +1011,7 @@ void QgsComposer::writeXML( QDomDocument& doc )
10241011
void QgsComposer::writeXML( QDomNode& parentNode, QDomDocument& doc )
10251012
{
10261013
QDomElement composerElem = doc.createElement( "Composer" );
1027-
composerElem.setAttribute( "id", mId );
1014+
composerElem.setAttribute( "title", mTitle );
10281015
parentNode.appendChild( composerElem );
10291016

10301017
//store composer items:
@@ -1055,14 +1042,16 @@ void QgsComposer::readXML( const QDomDocument& doc )
10551042

10561043
void QgsComposer::readXML( const QDomElement& composerElem, const QDomDocument& doc )
10571044
{
1058-
mId = composerElem.attribute( "id", "" );
1059-
setWindowTitle( mId );
1060-
10611045
// Create action to select this window
10621046
delete mWindowAction;
10631047
mWindowAction = new QAction( windowTitle(), this );
10641048
connect( mWindowAction, SIGNAL( triggered() ), this, SLOT( activate() ) );
10651049

1050+
if ( composerElem.hasAttribute( "title" ) )
1051+
{
1052+
setTitle( composerElem.attribute( "title", tr( "Composer" ) ) );
1053+
}
1054+
10661055
//delete composer view and composition
10671056
delete mView;
10681057
mView = 0;
@@ -1187,148 +1176,6 @@ void QgsComposer::readXML( const QDomElement& composerElem, const QDomDocument&
11871176
setSelectionTool();
11881177
}
11891178

1190-
#if 0
1191-
void QgsComposer::readXML( const QDomDocument& doc )
1192-
{
1193-
//look for Composer element
1194-
QDomNodeList nl = doc.elementsByTagName( "Composer" );
1195-
if ( nl.size() < 1 )
1196-
{
1197-
return; //nothing to do...
1198-
}
1199-
QDomElement composerElem = nl.at( 0 ).toElement();
1200-
mId = composerElem.attribute( "id", "" );
1201-
1202-
//look for Composition element
1203-
QDomNodeList cnl = composerElem.elementsByTagName( "Composition" );
1204-
if ( cnl.size() < 1 )
1205-
{
1206-
return; //nothing to do
1207-
}
1208-
1209-
1210-
//delete composer view and composition
1211-
delete mView;
1212-
mView = 0;
1213-
//delete every child of mViewFrame
1214-
QObjectList viewFrameChildren = mViewFrame->children();
1215-
QObjectList::iterator it = viewFrameChildren.begin();
1216-
for ( ; it != viewFrameChildren.end(); ++it )
1217-
{
1218-
delete( *it );
1219-
}
1220-
//delete composition widget
1221-
QgsCompositionWidget* oldCompositionWidget = qobject_cast<QgsCompositionWidget *>( mCompositionOptionsFrame->children().at( 0 ) );
1222-
delete oldCompositionWidget;
1223-
delete mCompositionOptionsLayout;
1224-
mCompositionOptionsLayout = 0;
1225-
1226-
QDomElement compositionElem = cnl.at( 0 ).toElement();
1227-
1228-
//todo: move in function because duplicated code with constructor
1229-
mView = new QgsComposerView( mViewFrame );
1230-
connectSlots();
1231-
1232-
mComposition = new QgsComposition( mQgis->mapCanvas()->mapRenderer() );
1233-
mComposition->readXML( compositionElem, doc );
1234-
1235-
QGridLayout *l = new QGridLayout( mViewFrame );
1236-
l->setMargin( 0 );
1237-
l->addWidget( mView, 0, 0 );
1238-
1239-
//create compositionwidget
1240-
QgsCompositionWidget* compositionWidget = new QgsCompositionWidget( mCompositionOptionsFrame, mComposition );
1241-
QObject::connect( mComposition, SIGNAL( paperSizeChanged() ), compositionWidget, SLOT( displayCompositionWidthHeight() ) );
1242-
compositionWidget->show();
1243-
1244-
mCompositionOptionsLayout = new QGridLayout( mCompositionOptionsFrame );
1245-
mCompositionOptionsLayout->setMargin( 0 );
1246-
mCompositionOptionsLayout->addWidget( compositionWidget );
1247-
1248-
//read and restore all the items
1249-
1250-
//composer labels
1251-
QDomNodeList composerLabelList = composerElem.elementsByTagName( "ComposerLabel" );
1252-
for ( int i = 0; i < composerLabelList.size(); ++i )
1253-
{
1254-
QDomElement currentComposerLabelElem = composerLabelList.at( i ).toElement();
1255-
QgsComposerLabel* newLabel = new QgsComposerLabel( mComposition );
1256-
newLabel->readXML( currentComposerLabelElem, doc );
1257-
addComposerLabel( newLabel );
1258-
mComposition->addItem( newLabel );
1259-
mComposition->update();
1260-
mComposition->clearSelection();
1261-
newLabel->setSelected( true );
1262-
showItemOptions( newLabel );
1263-
}
1264-
1265-
//composer maps
1266-
QDomNodeList composerMapList = composerElem.elementsByTagName( "ComposerMap" );
1267-
for ( int i = 0; i < composerMapList.size(); ++i )
1268-
{
1269-
QDomElement currentComposerMapElem = composerMapList.at( i ).toElement();
1270-
QgsComposerMap* newMap = new QgsComposerMap( mComposition );
1271-
newMap->readXML( currentComposerMapElem, doc );
1272-
addComposerMap( newMap );
1273-
mComposition->addItem( newMap );
1274-
mComposition->update();
1275-
mComposition->clearSelection();
1276-
newMap->setSelected( true );
1277-
showItemOptions( newMap );
1278-
}
1279-
1280-
//composer scalebars
1281-
QDomNodeList composerScaleBarList = composerElem.elementsByTagName( "ComposerScaleBar" );
1282-
for ( int i = 0; i < composerScaleBarList.size(); ++i )
1283-
{
1284-
QDomElement currentScaleBarElem = composerScaleBarList.at( i ).toElement();
1285-
QgsComposerScaleBar* newScaleBar = new QgsComposerScaleBar( mComposition );
1286-
newScaleBar->readXML( currentScaleBarElem, doc );
1287-
addComposerScaleBar( newScaleBar );
1288-
mComposition->addItem( newScaleBar );
1289-
mComposition->update();
1290-
mComposition->clearSelection();
1291-
newScaleBar->setSelected( true );
1292-
showItemOptions( newScaleBar );
1293-
}
1294-
1295-
//composer legends
1296-
QDomNodeList composerLegendList = composerElem.elementsByTagName( "ComposerLegend" );
1297-
for ( int i = 0; i < composerLegendList.size(); ++i )
1298-
{
1299-
QDomElement currentLegendElem = composerLegendList.at( i ).toElement();
1300-
QgsComposerLegend* newLegend = new QgsComposerLegend( mComposition );
1301-
newLegend->readXML( currentLegendElem, doc );
1302-
addComposerLegend( newLegend );
1303-
mComposition->addItem( newLegend );
1304-
mComposition->update();
1305-
mComposition->clearSelection();
1306-
newLegend->setSelected( true );
1307-
showItemOptions( newLegend );
1308-
}
1309-
1310-
//composer pictures
1311-
QDomNodeList composerPictureList = composerElem.elementsByTagName( "ComposerPicture" );
1312-
for ( int i = 0; i < composerPictureList.size(); ++i )
1313-
{
1314-
QDomElement currentPictureElem = composerPictureList.at( i ).toElement();
1315-
QgsComposerPicture* newPicture = new QgsComposerPicture( mComposition );
1316-
newPicture->readXML( currentPictureElem, doc );
1317-
addComposerPicture( newPicture );
1318-
mComposition->addItem( newPicture );
1319-
mComposition->update();
1320-
mComposition->clearSelection();
1321-
newPicture->setSelected( true );
1322-
showItemOptions( newPicture );
1323-
}
1324-
1325-
mComposition->sortZList();
1326-
mView->setComposition( mComposition );
1327-
1328-
setSelectionTool();
1329-
}
1330-
#endif //0
1331-
13321179
void QgsComposer::addComposerMap( QgsComposerMap* map )
13331180
{
13341181
if ( !map )

‎src/app/composer/qgscomposer.h

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class QgsComposer: public QMainWindow, private Ui::QgsComposerBase
4646
Q_OBJECT
4747

4848
public:
49-
QgsComposer( QgisApp *qgis, const QString& id );
49+
QgsComposer( QgisApp *qgis, const QString& title );
5050
~QgsComposer();
5151

5252
//! Set the pixmap / icons on the toolbar buttons
@@ -75,7 +75,8 @@ class QgsComposer: public QMainWindow, private Ui::QgsComposerBase
7575

7676
QAction* windowAction() {return mWindowAction;}
7777

78-
QString id() const {return mId;}
78+
const QString& title() const {return mTitle;}
79+
void setTitle( const QString& title );
7980

8081
protected:
8182
//! Move event
@@ -84,9 +85,6 @@ class QgsComposer: public QMainWindow, private Ui::QgsComposerBase
8485
//! Resize event
8586
virtual void resizeEvent( QResizeEvent * );
8687

87-
//! Close event (remove window from menu)
88-
virtual void closeEvent( QCloseEvent * );
89-
9088
#ifdef Q_WS_MAC
9189
//! Change event (update window menu on ActivationChange)
9290
virtual void changeEvent( QEvent * );
@@ -225,8 +223,6 @@ class QgsComposer: public QMainWindow, private Ui::QgsComposerBase
225223

226224
void setSelectionTool();
227225

228-
private slots:
229-
230226
//! Raise, unminimize and activate this window
231227
void activate();
232228

@@ -250,8 +246,8 @@ class QgsComposer: public QMainWindow, private Ui::QgsComposerBase
250246
//! Writes state under DOM element
251247
void writeXML( QDomNode& parentNode, QDomDocument& doc );
252248

253-
/**Identification string*/
254-
QString mId;
249+
/**Composer title*/
250+
QString mTitle;
255251

256252
//! Pointer to composer view
257253
QgsComposerView *mView;
Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
/***************************************************************************
2+
qgscomposermanager.cpp
3+
------------------------
4+
begin : September 11 2009
5+
copyright : (C) 2009 by Marco Hugentobler
6+
email : marco at hugis dot net
7+
***************************************************************************/
8+
/***************************************************************************
9+
* *
10+
* This program is free software; you can redistribute it and/or modify *
11+
* it under the terms of the GNU General Public License as published by *
12+
* the Free Software Foundation; either version 2 of the License, or *
13+
* (at your option) any later version. *
14+
* *
15+
***************************************************************************/
16+
17+
#include "qgscomposermanager.h"
18+
#include "qgisapp.h"
19+
#include "qgscomposer.h"
20+
#include <QInputDialog>
21+
#include <QListWidgetItem>
22+
#include <QMessageBox>
23+
24+
QgsComposerManager::QgsComposerManager(QgisApp* app, QWidget * parent, Qt::WindowFlags f): QDialog(parent, f), mQgisApp(app)
25+
{
26+
setupUi(this);
27+
connect(mButtonBox, SIGNAL(rejected()), this, SLOT(close()));
28+
initialize();
29+
}
30+
31+
QgsComposerManager::~QgsComposerManager()
32+
{
33+
34+
}
35+
36+
void QgsComposerManager::initialize()
37+
{
38+
if(!mQgisApp)
39+
{
40+
return;
41+
}
42+
43+
QSet<QgsComposer*> composers = mQgisApp->printComposers();
44+
QSet<QgsComposer*>::const_iterator it = composers.constBegin();
45+
for(; it != composers.constEnd(); ++it)
46+
{
47+
QListWidgetItem* item = new QListWidgetItem((*it)->title(), mComposerListWidget);
48+
item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable);
49+
mItemComposerMap.insert(item, *it);
50+
}
51+
}
52+
53+
void QgsComposerManager::on_mAddButton_clicked()
54+
{
55+
if(!mQgisApp)
56+
{
57+
return;
58+
}
59+
QgsComposer* newComposer = mQgisApp->createNewComposer();
60+
if(!newComposer)
61+
{
62+
return;
63+
}
64+
QListWidgetItem* item = new QListWidgetItem(newComposer->title(), mComposerListWidget);
65+
item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable);
66+
mItemComposerMap.insert(item, newComposer);
67+
}
68+
69+
void QgsComposerManager::on_mRemoveButton_clicked()
70+
{
71+
if(!mQgisApp)
72+
{
73+
return;
74+
}
75+
76+
QListWidgetItem* item = mComposerListWidget->currentItem();
77+
if(!item)
78+
{
79+
return;
80+
}
81+
82+
//ask for confirmation
83+
if(QMessageBox::warning(0, tr("Remove composer"), tr("Do you really want to remove the map composer '%1'?").arg(item->text()), QMessageBox::Ok | QMessageBox::Cancel) != QMessageBox::Ok)
84+
{
85+
return;
86+
}
87+
88+
//delete composer
89+
QMap<QListWidgetItem*, QgsComposer*>::iterator it = mItemComposerMap.find(item);
90+
if(it != mItemComposerMap.end())
91+
{
92+
mQgisApp->deleteComposer(it.value());
93+
}
94+
mItemComposerMap.remove(item);
95+
mComposerListWidget->removeItemWidget(item);
96+
//and remove the list widget row
97+
delete (mComposerListWidget->takeItem(mComposerListWidget->row(item)));
98+
}
99+
100+
void QgsComposerManager::on_mShowPushButton_clicked()
101+
{
102+
if(!mQgisApp)
103+
{
104+
return;
105+
}
106+
107+
QListWidgetItem* item = mComposerListWidget->currentItem();
108+
if(!item)
109+
{
110+
return;
111+
}
112+
113+
//delete composer
114+
QMap<QListWidgetItem*, QgsComposer*>::iterator it = mItemComposerMap.find(item);
115+
if(it != mItemComposerMap.end())
116+
{
117+
it.value()->show();
118+
it.value()->activate();
119+
it.value()->stackUnder(this);
120+
}
121+
}
122+
123+
void QgsComposerManager::on_mRenamePushButton_clicked()
124+
{
125+
QListWidgetItem* item = mComposerListWidget->currentItem();
126+
if(!item)
127+
{
128+
return;
129+
}
130+
131+
QString currentTitle;
132+
QgsComposer* currentComposer = 0;
133+
QMap<QListWidgetItem*, QgsComposer*>::iterator it = mItemComposerMap.find(item);
134+
if(it != mItemComposerMap.end())
135+
{
136+
currentComposer = it.value();
137+
currentTitle = it.value()->title();
138+
}
139+
else
140+
{
141+
return;
142+
}
143+
QString newTitle = QInputDialog::getText(0, tr("Change title"), tr("Title"), QLineEdit::Normal, currentTitle );
144+
if(newTitle.isNull())
145+
{
146+
return;
147+
}
148+
currentComposer->setTitle(newTitle);
149+
item->setText(newTitle);
150+
}
151+
152+
void QgsComposerManager::on_mComposerListWidget_itemChanged( QListWidgetItem * item )
153+
{
154+
QMap<QListWidgetItem*, QgsComposer*>::iterator it = mItemComposerMap.find(item);
155+
if(it != mItemComposerMap.end())
156+
{
157+
it.value()->setTitle(item->text());
158+
}
159+
}

‎src/app/composer/qgscomposermanager.h

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/***************************************************************************
2+
qgscomposermanager.h
3+
------------------------
4+
begin : September 11 2009
5+
copyright : (C) 2009 by Marco Hugentobler
6+
email : marco at hugis dot net
7+
***************************************************************************/
8+
/***************************************************************************
9+
* *
10+
* This program is free software; you can redistribute it and/or modify *
11+
* it under the terms of the GNU General Public License as published by *
12+
* the Free Software Foundation; either version 2 of the License, or *
13+
* (at your option) any later version. *
14+
* *
15+
***************************************************************************/
16+
17+
#ifndef QGSCOMPOSERMANAGER_H
18+
#define QGSCOMPOSERMANAGER_H
19+
20+
#include "ui_qgscomposermanagerbase.h"
21+
22+
class QgisApp;
23+
class QListWidgetItem;
24+
class QgsComposer;
25+
26+
/**A dialog that shows the existing composer instances. Lets the user add new \
27+
instances and change title of existing ones*/
28+
class QgsComposerManager: public QDialog, private Ui::QgsComposerManagerBase
29+
{
30+
Q_OBJECT
31+
public:
32+
QgsComposerManager(QgisApp* app, QWidget * parent = 0, Qt::WindowFlags f = 0);
33+
~QgsComposerManager();
34+
35+
36+
private:
37+
QgisApp* mQgisApp;
38+
/**Stores the relation between items and composer pointers */
39+
QMap<QListWidgetItem*, QgsComposer*> mItemComposerMap;
40+
/**Enters the composer instances and created the item-composer map*/
41+
void initialize();
42+
43+
private slots:
44+
void on_mAddButton_clicked();
45+
void on_mRemoveButton_clicked();
46+
void on_mShowPushButton_clicked();
47+
void on_mRenamePushButton_clicked();
48+
void on_mComposerListWidget_itemChanged( QListWidgetItem * item );
49+
};
50+
51+
#endif // QGSCOMPOSERMANAGER_H

‎src/app/composer/qgscomposermapwidget.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,15 +55,13 @@ QgsComposerMapWidget::QgsComposerMapWidget( QgsComposerMap* composerMap ): QWidg
5555
mAnnotationDirectionComboBox->insertItem( 1, tr( "Vertical" ) );
5656
mAnnotationDirectionComboBox->insertItem( 2, tr( "Horizontal and Vertical" ) );
5757
mAnnotationDirectionComboBox->insertItem( 2, tr( "Boundary direction" ) );
58-
59-
blockAllSignals( false );
60-
6158
if ( composerMap )
6259
{
6360
connect( composerMap, SIGNAL( extentChanged() ), this, SLOT( updateSettingsNoSignals() ) );
6461
}
6562

6663
updateGuiElements();
64+
blockAllSignals( false );
6765
}
6866

6967
QgsComposerMapWidget::~QgsComposerMapWidget()

‎src/app/qgisapp.cpp

Lines changed: 37 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@
9494
#include "qgsbookmarks.h"
9595
#include "qgsclipboard.h"
9696
#include "qgscomposer.h"
97+
#include "qgscomposermanager.h"
9798
#include "qgsconfigureshortcutsdialog.h"
9899
#include "qgscoordinatetransform.h"
99100
#include "qgscursors.h"
@@ -592,11 +593,15 @@ void QgisApp::createActions()
592593
mActionSaveMapAsImage->setStatusTip( tr( "Save map as image" ) );
593594
connect( mActionSaveMapAsImage, SIGNAL( triggered() ), this, SLOT( saveMapAsImage() ) );
594595

595-
mActionNewPrintComposer = new QAction( getThemeIcon( "mActionFilePrint.png" ), tr( "&New Print Composer" ), this );
596+
mActionNewPrintComposer = new QAction( getThemeIcon( "mActionNewComposer.png" ), tr( "&New Print Composer" ), this );
596597
shortcuts->registerAction( mActionNewPrintComposer, tr( "Ctrl+P", "New Print Composer" ) );
597598
mActionNewPrintComposer->setStatusTip( tr( "New Print Composer" ) );
598599
connect( mActionNewPrintComposer, SIGNAL( triggered() ), this, SLOT( newPrintComposer() ) );
599600

601+
mActionShowComposerManager = new QAction( getThemeIcon( "mActionFilePrint.png" ), tr( "Composer manager..." ), this );
602+
mActionShowComposerManager->setStatusTip( tr( "Composer manager" ) );
603+
connect( mActionShowComposerManager, SIGNAL( triggered() ), this, SLOT( showComposerManager() ) );
604+
600605
mActionExit = new QAction( getThemeIcon( "mActionFileExit.png" ), tr( "Exit" ), this );
601606
shortcuts->registerAction( mActionExit, tr( "Ctrl+Q", "Exit QGIS" ) );
602607
mActionExit->setStatusTip( tr( "Exit QGIS" ) );
@@ -1174,6 +1179,7 @@ void QgisApp::createMenus()
11741179
}
11751180

11761181
mFileMenu->addAction( mActionNewPrintComposer );
1182+
mFileMenu->addAction( mActionShowComposerManager );
11771183
mPrintComposersMenu = mFileMenu->addMenu( tr( "Print Composers" ) );
11781184
mActionFileSeparator4 = mFileMenu->addSeparator();
11791185

@@ -1374,6 +1380,7 @@ void QgisApp::createToolBars()
13741380
mFileToolBar->addAction( mActionSaveProject );
13751381
mFileToolBar->addAction( mActionSaveProjectAs );
13761382
mFileToolBar->addAction( mActionNewPrintComposer );
1383+
mFileToolBar->addAction( mActionShowComposerManager );
13771384
mToolbarMenu->addAction( mFileToolBar->toggleViewAction() );
13781385
//
13791386
// Layer Toolbar
@@ -1641,6 +1648,7 @@ void QgisApp::setTheme( QString theThemeName )
16411648
mActionSaveProject->setIcon( getThemeIcon( "/mActionFileSave.png" ) );
16421649
mActionSaveProjectAs->setIcon( getThemeIcon( "/mActionFileSaveAs.png" ) );
16431650
mActionNewPrintComposer->setIcon( getThemeIcon( "/mActionNewComposer.png" ) );
1651+
mActionShowComposerManager->setIcon( getThemeIcon( "/mActionFilePrint.png" ) );
16441652
mActionSaveMapAsImage->setIcon( getThemeIcon( "/mActionSaveMapAsImage.png" ) );
16451653
mActionExit->setIcon( getThemeIcon( "/mActionFileExit.png" ) );
16461654
mActionAddOgrLayer->setIcon( getThemeIcon( "/mActionAddOgrLayer.png" ) );
@@ -1709,10 +1717,10 @@ void QgisApp::setTheme( QString theThemeName )
17091717
mActionAddToOverview->setIcon( getThemeIcon( "/mActionInOverview.png" ) );
17101718

17111719
//change themes of all composers
1712-
QMap<QString, QgsComposer*>::iterator composerIt = mPrintComposers.begin();
1720+
QSet<QgsComposer*>::iterator composerIt = mPrintComposers.begin();
17131721
for ( ; composerIt != mPrintComposers.end(); ++composerIt )
17141722
{
1715-
composerIt.value()->setupTheme();
1723+
( *composerIt )->setupTheme();
17161724
}
17171725

17181726
emit currentThemeChanged( theThemeName );
@@ -3701,16 +3709,13 @@ void QgisApp::newPrintComposer()
37013709
return;
37023710
}
37033711

3704-
//ask user about name
3705-
mLastComposerId++;
3706-
QString composerId = QString( tr("Map Composer %1").arg( mLastComposerId ) );
3707-
//create new composer object
3708-
QgsComposer* newComposerObject = new QgsComposer( this, composerId );
3709-
//add it to the map of existing print composers
3710-
mPrintComposers.insert( composerId, newComposerObject );
3711-
//and place action into print composers menu
3712-
mPrintComposersMenu->addAction( newComposerObject->windowAction() );
3713-
newComposerObject->open();
3712+
createNewComposer();
3713+
}
3714+
3715+
void QgisApp::showComposerManager()
3716+
{
3717+
QgsComposerManager m( this, 0, Qt::WindowStaysOnTopHint );
3718+
m.exec();
37143719
}
37153720

37163721
void QgisApp::saveMapAsImage()
@@ -4191,25 +4196,25 @@ QgsGeometry* QgisApp::unionGeometries( const QgsVectorLayer* vl, QgsFeatureList&
41914196
return unionGeom;
41924197
}
41934198

4194-
QList<QgsComposer*> QgisApp::printComposers()
4199+
QgsComposer* QgisApp::createNewComposer()
41954200
{
4196-
QList<QgsComposer*> composerList;
4197-
QMap<QString, QgsComposer*>::iterator it = mPrintComposers.begin();
4198-
for ( ; it != mPrintComposers.end(); ++it )
4199-
{
4200-
composerList.push_back( it.value() );
4201-
}
4202-
return composerList;
4201+
//ask user about name
4202+
mLastComposerId++;
4203+
//create new composer object
4204+
QgsComposer* newComposerObject = new QgsComposer( this, tr( "Composer %1" ).arg( mLastComposerId ) );
4205+
//add it to the map of existing print composers
4206+
mPrintComposers.insert( newComposerObject );
4207+
//and place action into print composers menu
4208+
mPrintComposersMenu->addAction( newComposerObject->windowAction() );
4209+
newComposerObject->open();
4210+
return newComposerObject;
42034211
}
42044212

4205-
void QgisApp::checkOutComposer( QgsComposer* c )
4213+
void QgisApp::deleteComposer( QgsComposer* c )
42064214
{
4207-
if ( !c )
4208-
{
4209-
return;
4210-
}
4211-
mPrintComposers.remove( c->id() );
4215+
mPrintComposers.remove( c );
42124216
mPrintComposersMenu->removeAction( c->windowAction() );
4217+
delete c;
42134218
}
42144219

42154220
bool QgisApp::loadComposersFromProject( const QString& projectFilePath )
@@ -4231,24 +4236,23 @@ bool QgisApp::loadComposersFromProject( const QString& projectFilePath )
42314236
QDomNodeList composerNodes = projectDom.elementsByTagName( "Composer" );
42324237
for ( int i = 0; i < composerNodes.size(); ++i )
42334238
{
4234-
QgsComposer* composer = new QgsComposer( this, "" );
4239+
++mLastComposerId;
4240+
QgsComposer* composer = new QgsComposer( this, tr( "Composer %1" ).arg( mLastComposerId ) );
42354241
composer->readXML( composerNodes.at( i ).toElement(), projectDom );
4236-
mPrintComposers.insert( composer->id(), composer );
4242+
mPrintComposers.insert( composer );
42374243
mPrintComposersMenu->addAction( composer->windowAction() );
42384244
composer->showMinimized();
42394245
composer->zoomFull();
42404246
}
4241-
mLastComposerId = composerNodes.size();
4242-
42434247
return true;
42444248
}
42454249

42464250
void QgisApp::deletePrintComposers()
42474251
{
4248-
QMap<QString, QgsComposer*>::iterator it = mPrintComposers.begin();
4252+
QSet<QgsComposer*>::iterator it = mPrintComposers.begin();
42494253
for ( ; it != mPrintComposers.end(); ++it )
42504254
{
4251-
delete it.value();
4255+
delete( *it );
42524256
}
42534257
mPrintComposers.clear();
42544258
mLastComposerId = 0;

‎src/app/qgisapp.h

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -195,10 +195,12 @@ class QgisApp : public QMainWindow
195195
void removeWindow( QAction *action );
196196

197197
/**Returns the print composers*/
198-
QList<QgsComposer*> printComposers();
199-
/**Unregisters a composer instance but does _not_ delete it. This method is usually called from within QgsComposer::closeEvent before
200-
the composer deletes itself using the Qt::WA_DeleteOnClose flag*/
201-
void checkOutComposer( QgsComposer* c );
198+
QSet<QgsComposer*> printComposers() const {return mPrintComposers;}
199+
/**Creates a new composer and returns a pointer to it*/
200+
QgsComposer* createNewComposer();
201+
/**Deletes a composer and removes entry from Set*/
202+
void deleteComposer( QgsComposer* c );
203+
202204

203205
//! Actions to be inserted in menus and toolbars
204206
QAction *actionNewProject() { return mActionNewProject; }
@@ -450,6 +452,7 @@ class QgisApp : public QMainWindow
450452
void newVectorLayer();
451453
//! Print the current map view frame
452454
void newPrintComposer();
455+
void showComposerManager();
453456
//! Add all loaded layers into the overview - overides qgisappbase method
454457
void addAllToOverview();
455458
//! Remove all loaded layers from the overview - overides qgisappbase method
@@ -727,6 +730,7 @@ class QgisApp : public QMainWindow
727730
QAction *mActionProjectProperties;
728731
QAction *mActionFileSeparator3;
729732
QAction *mActionNewPrintComposer;
733+
QAction *mActionShowComposerManager;
730734
QAction *mActionFileSeparator4;
731735
QAction *mActionExit;
732736

@@ -947,7 +951,7 @@ class QgisApp : public QMainWindow
947951
//! list of recently opened/saved project files
948952
QStringList mRecentProjectPaths;
949953
//! Print composers of this project, accessible by id string
950-
QMap<QString, QgsComposer*> mPrintComposers;
954+
QSet<QgsComposer*> mPrintComposers;
951955
//! How to determine the number of decimal places used to
952956
//! display the mouse position
953957
bool mMousePrecisionAutomatic;

‎src/app/qgisappinterface.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -152,9 +152,9 @@ QList<QgsComposerView*> QgisAppInterface::activeComposers()
152152
QList<QgsComposerView*> composerViewList;
153153
if ( qgis )
154154
{
155-
QList<QgsComposer*> composerList = qgis->printComposers();
156-
QList<QgsComposer*>::iterator it = composerList.begin();
157-
for ( ; it != composerList.end(); ++it )
155+
const QSet<QgsComposer*> composerList = qgis->printComposers();
156+
QSet<QgsComposer*>::const_iterator it = composerList.constBegin();
157+
for ( ; it != composerList.constEnd(); ++it )
158158
{
159159
if ( *it )
160160
{

‎src/ui/qgscomposerbase.ui

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@
2020
<property name="mouseTracking">
2121
<bool>true</bool>
2222
</property>
23-
<layout class="QGridLayout">
24-
<item row="1" column="0">
23+
<layout class="QGridLayout" name="gridLayout">
24+
<item row="0" column="0">
2525
<widget class="QSplitter" name="mSplitter">
2626
<property name="mouseTracking">
2727
<bool>true</bool>
@@ -133,6 +133,13 @@
133133
</widget>
134134
</widget>
135135
</item>
136+
<item row="1" column="0">
137+
<widget class="QDialogButtonBox" name="mButtonBox">
138+
<property name="standardButtons">
139+
<set>QDialogButtonBox::Close</set>
140+
</property>
141+
</widget>
142+
</item>
136143
</layout>
137144
</widget>
138145
<widget class="QToolBar" name="toolBar">

‎src/ui/qgscomposermanagerbase.ui

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<ui version="4.0">
3+
<class>QgsComposerManagerBase</class>
4+
<widget class="QDialog" name="QgsComposerManagerBase">
5+
<property name="geometry">
6+
<rect>
7+
<x>0</x>
8+
<y>0</y>
9+
<width>333</width>
10+
<height>198</height>
11+
</rect>
12+
</property>
13+
<property name="windowTitle">
14+
<string>Composer manager</string>
15+
</property>
16+
<layout class="QGridLayout" name="gridLayout">
17+
<item row="0" column="0" rowspan="5">
18+
<widget class="QListWidget" name="mComposerListWidget"/>
19+
</item>
20+
<item row="0" column="1">
21+
<widget class="QPushButton" name="mAddButton">
22+
<property name="text">
23+
<string>Add</string>
24+
</property>
25+
</widget>
26+
</item>
27+
<item row="1" column="1">
28+
<widget class="QPushButton" name="mRemoveButton">
29+
<property name="text">
30+
<string>Remove</string>
31+
</property>
32+
</widget>
33+
</item>
34+
<item row="2" column="1">
35+
<widget class="QPushButton" name="mRenamePushButton">
36+
<property name="text">
37+
<string>Rename</string>
38+
</property>
39+
</widget>
40+
</item>
41+
<item row="3" column="1">
42+
<widget class="QPushButton" name="mShowPushButton">
43+
<property name="text">
44+
<string>Show</string>
45+
</property>
46+
</widget>
47+
</item>
48+
<item row="4" column="1">
49+
<spacer name="verticalSpacer">
50+
<property name="orientation">
51+
<enum>Qt::Vertical</enum>
52+
</property>
53+
<property name="sizeHint" stdset="0">
54+
<size>
55+
<width>20</width>
56+
<height>50</height>
57+
</size>
58+
</property>
59+
</spacer>
60+
</item>
61+
<item row="5" column="0" colspan="2">
62+
<widget class="QDialogButtonBox" name="mButtonBox">
63+
<property name="orientation">
64+
<enum>Qt::Horizontal</enum>
65+
</property>
66+
<property name="standardButtons">
67+
<set>QDialogButtonBox::Close</set>
68+
</property>
69+
</widget>
70+
</item>
71+
</layout>
72+
</widget>
73+
<resources/>
74+
<connections>
75+
<connection>
76+
<sender>mButtonBox</sender>
77+
<signal>accepted()</signal>
78+
<receiver>QgsComposerManagerBase</receiver>
79+
<slot>accept()</slot>
80+
<hints>
81+
<hint type="sourcelabel">
82+
<x>251</x>
83+
<y>193</y>
84+
</hint>
85+
<hint type="destinationlabel">
86+
<x>157</x>
87+
<y>274</y>
88+
</hint>
89+
</hints>
90+
</connection>
91+
<connection>
92+
<sender>mButtonBox</sender>
93+
<signal>rejected()</signal>
94+
<receiver>QgsComposerManagerBase</receiver>
95+
<slot>reject()</slot>
96+
<hints>
97+
<hint type="sourcelabel">
98+
<x>251</x>
99+
<y>193</y>
100+
</hint>
101+
<hint type="destinationlabel">
102+
<x>286</x>
103+
<y>274</y>
104+
</hint>
105+
</hints>
106+
</connection>
107+
</connections>
108+
</ui>

0 commit comments

Comments
 (0)
Please sign in to comment.