Skip to content

Commit ac5e92c

Browse files
committedApr 30, 2014
Merge pull request #1312 from manisandro/composer_manager_nonmodal
Make QgsComposerManager non-modal
2 parents 6f1b875 + a66893d commit ac5e92c

File tree

5 files changed

+122
-55
lines changed

5 files changed

+122
-55
lines changed
 

‎src/app/composer/qgscomposer.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3369,3 +3369,4 @@ void QgsComposer::updateAtlasMapLayerAction( bool atlasEnabled )
33693369
connect( mAtlasFeatureAction, SIGNAL( triggeredForFeature( QgsMapLayer*, QgsFeature* ) ), this, SLOT( setAtlasFeature( QgsMapLayer*, QgsFeature* ) ) );
33703370
}
33713371
}
3372+

‎src/app/composer/qgscomposermanager.cpp

Lines changed: 80 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ QgsComposerManager::QgsComposerManager( QWidget * parent, Qt::WindowFlags f ): Q
4242
restoreGeometry( settings.value( "/Windows/ComposerManager/geometry" ).toByteArray() );
4343

4444
connect( mButtonBox, SIGNAL( rejected() ), this, SLOT( close() ) );
45+
connect( QgisApp::instance(), SIGNAL( composerAdded( QgsComposerView* ) ), this, SLOT( refreshComposers() ) );
46+
connect( QgisApp::instance(), SIGNAL( composerRemoved( QgsComposerView* ) ), this, SLOT( refreshComposers() ) );
4547

4648
pb = new QPushButton( tr( "&Show" ) );
4749
mButtonBox->addButton( pb, QDialogButtonBox::ActionRole );
@@ -59,27 +61,11 @@ QgsComposerManager::QgsComposerManager( QWidget * parent, Qt::WindowFlags f ): Q
5961
mButtonBox->addButton( pb, QDialogButtonBox::ActionRole );
6062
connect( pb, SIGNAL( clicked() ), this, SLOT( rename_clicked() ) );
6163

62-
initialize();
63-
}
64-
65-
QgsComposerManager::~QgsComposerManager()
66-
{
67-
QSettings settings;
68-
settings.setValue( "/Windows/ComposerManager/geometry", saveGeometry() );
69-
}
70-
71-
void QgsComposerManager::initialize()
72-
{
73-
QSettings settings;
74-
QSet<QgsComposer*> composers = QgisApp::instance()->printComposers();
75-
QSet<QgsComposer*>::const_iterator it = composers.constBegin();
76-
for ( ; it != composers.constEnd(); ++it )
77-
{
78-
QListWidgetItem* item = new QListWidgetItem(( *it )->title(), mComposerListWidget );
79-
item->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable );
80-
mItemComposerMap.insert( item, *it );
81-
}
82-
mComposerListWidget->sortItems();
64+
#ifdef Q_WS_MAC
65+
// Create action to select this window
66+
mWindowAction = new QAction( windowTitle(), this );
67+
connect( mWindowAction, SIGNAL( triggered() ), this, SLOT( activate() ) );
68+
#endif
8369

8470
mTemplate->addItem( tr( "Empty composer" ) );
8571
mTemplate->addItem( tr( "Specific" ) );
@@ -109,6 +95,49 @@ void QgsComposerManager::initialize()
10995
}
11096

11197
mTemplatePathLineEdit->setText( settings.value( "/UI/ComposerManager/templatePath", QString( "" ) ).toString() );
98+
99+
refreshComposers();
100+
}
101+
102+
QgsComposerManager::~QgsComposerManager()
103+
{
104+
QSettings settings;
105+
settings.setValue( "/Windows/ComposerManager/geometry", saveGeometry() );
106+
}
107+
108+
void QgsComposerManager::refreshComposers()
109+
{
110+
QString selName = mComposerListWidget->currentItem() ? mComposerListWidget->currentItem()->text() : "";
111+
112+
mItemComposerMap.clear();
113+
mComposerListWidget->clear();
114+
115+
QSet<QgsComposer*> composers = QgisApp::instance()->printComposers();
116+
QSet<QgsComposer*>::const_iterator it = composers.constBegin();
117+
for ( ; it != composers.constEnd(); ++it )
118+
{
119+
QListWidgetItem* item = new QListWidgetItem(( *it )->title(), mComposerListWidget );
120+
item->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable );
121+
mItemComposerMap.insert( item, *it );
122+
}
123+
mComposerListWidget->sortItems();
124+
125+
// Restore selection
126+
if ( !selName.isEmpty() )
127+
{
128+
QList<QListWidgetItem*> items = mComposerListWidget->findItems( selName, Qt::MatchExactly );
129+
if ( !items.isEmpty() )
130+
{
131+
mComposerListWidget->setCurrentItem( items.first() );
132+
}
133+
}
134+
}
135+
136+
void QgsComposerManager::activate()
137+
{
138+
raise();
139+
setWindowState( windowState() & ~Qt::WindowMinimized );
140+
activateWindow();
112141
}
113142

114143
QMap<QString, QString> QgsComposerManager::defaultTemplates( bool fromUser ) const
@@ -200,25 +229,11 @@ void QgsComposerManager::on_mAddButton_clicked()
200229
}
201230
}
202231

203-
if ( loadedOK )
204-
{
205-
// do not close on Add, since user may want to add multiple composers from templates
206-
QListWidgetItem* item = new QListWidgetItem( newComposer->title(), mComposerListWidget );
207-
item->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable );
208-
mItemComposerMap.insert( item, newComposer );
209-
210-
mComposerListWidget->sortItems();
211-
mComposerListWidget->setCurrentItem( item );
212-
mComposerListWidget->setFocus();
213-
}
214-
else
232+
if ( !loadedOK )
215233
{
216-
if ( newComposer )
217-
{
218-
newComposer->close();
219-
QgisApp::instance()->deleteComposer( newComposer );
220-
newComposer = 0;
221-
}
234+
newComposer->close();
235+
QgisApp::instance()->deleteComposer( newComposer );
236+
newComposer = 0;
222237
QMessageBox::warning( this, tr( "Template error" ), tr( "Error, could not load template file" ) );
223238
}
224239
}
@@ -268,6 +283,32 @@ void QgsComposerManager::openLocalDirectory( const QString& localDirPath )
268283
QDesktopServices::openUrl( QUrl::fromLocalFile( localDirPath ) );
269284
}
270285

286+
#ifdef Q_WS_MAC
287+
void QgsComposerManager::showEvent(QShowEvent* event)
288+
{
289+
if(!event->spontaneous()) {
290+
QgisApp::instance()->addWindow( mWindowAction );
291+
}
292+
}
293+
294+
void QgsComposerManager::changeEvent( QEvent* event )
295+
{
296+
QDialog::changeEvent( event );
297+
switch ( event->type() )
298+
{
299+
case QEvent::ActivationChange:
300+
if ( QApplication::activeWindow() == this )
301+
{
302+
mWindowAction->setChecked( true );
303+
}
304+
break;
305+
306+
default:
307+
break;
308+
}
309+
}
310+
#endif
311+
271312
void QgsComposerManager::remove_clicked()
272313
{
273314
QListWidgetItem* item = mComposerListWidget->currentItem();
@@ -288,10 +329,6 @@ void QgsComposerManager::remove_clicked()
288329
{
289330
QgisApp::instance()->deleteComposer( it.value() );
290331
}
291-
mItemComposerMap.remove( item );
292-
mComposerListWidget->removeItemWidget( item );
293-
//and remove the list widget row
294-
delete( mComposerListWidget->takeItem( mComposerListWidget->row( item ) ) );
295332
}
296333

297334
void QgsComposerManager::show_clicked()
@@ -313,7 +350,6 @@ void QgsComposerManager::show_clicked()
313350
{
314351
// extra activation steps for Windows
315352
bool shown = c->isVisible();
316-
hide();
317353

318354
c->activate();
319355

@@ -350,7 +386,6 @@ void QgsComposerManager::show_clicked()
350386
if ( c )
351387
{
352388
c->readXML( templateDoc );
353-
mItemComposerMap.insert( it.key(), c );
354389
}
355390
}
356391

@@ -359,7 +394,6 @@ void QgsComposerManager::show_clicked()
359394
c->activate();
360395
}
361396
#endif //0
362-
close();
363397
}
364398

365399
void QgsComposerManager::duplicate_clicked()
@@ -403,11 +437,7 @@ void QgsComposerManager::duplicate_clicked()
403437
if ( newComposer )
404438
{
405439
// extra activation steps for Windows
406-
hide();
407440
newComposer->activate();
408-
409-
// no need to add new composer to list widget, if just closing this->exec();
410-
close();
411441
}
412442
else
413443
{

‎src/app/composer/qgscomposermanager.h

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,15 @@ class QgsComposerManager: public QDialog, private Ui::QgsComposerManagerBase
3131
QgsComposerManager( QWidget * parent = 0, Qt::WindowFlags f = 0 );
3232
~QgsComposerManager();
3333

34+
public slots:
35+
/** Raise, unminimize and activate this window */
36+
void activate();
3437

3538
private:
3639
/**Stores the relation between items and composer pointers. A 0 pointer for the composer means that
3740
this composer needs to be created from a default template*/
3841
QMap<QListWidgetItem*, QgsComposer*> mItemComposerMap;
3942

40-
/**Enters the composer instances and created the item-composer map*/
41-
void initialize();
42-
4343
/** Returns the default templates (key: template name, value: absolute path to template file)
4444
* @param fromUser whether to return user templates from ~/.qgis/composer_templates (added in 1.9)
4545
*/
@@ -53,6 +53,13 @@ class QgsComposerManager: public QDialog, private Ui::QgsComposerManagerBase
5353
QString mDefaultTemplatesDir;
5454
QString mUserTemplatesDir;
5555

56+
#ifdef Q_WS_MAC
57+
void showEvent(QShowEvent *event);
58+
void changeEvent(QEvent *);
59+
60+
QAction* mWindowAction;
61+
#endif
62+
5663
private slots:
5764
void on_mAddButton_clicked();
5865
/** Slot to track combobox to use specific template path
@@ -72,6 +79,9 @@ class QgsComposerManager: public QDialog, private Ui::QgsComposerManagerBase
7279
*/
7380
void on_mTemplatesUserDirBtn_pressed();
7481

82+
/** Refreshes the list of composers */
83+
void refreshComposers();
84+
7585
void remove_clicked();
7686
void show_clicked();
7787
/** Duplicate composer

‎src/app/qgisapp.cpp

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -452,6 +452,7 @@ QgisApp::QgisApp( QSplashScreen *splash, bool restorePlugins, QWidget * parent,
452452
#ifdef Q_OS_WIN
453453
, mSkipNextContextMenuEvent( 0 )
454454
#endif
455+
, mComposerManager( 0 )
455456
, mpGpsWidget( 0 )
456457
{
457458
if ( smInstance )
@@ -776,6 +777,7 @@ QgisApp::QgisApp( )
776777
, mInternalClipboard( 0 )
777778
, mpMaptip( 0 )
778779
, mPythonUtils( 0 )
780+
, mComposerManager( 0 )
779781
, mpGpsWidget( 0 )
780782
{
781783
smInstance = this;
@@ -845,6 +847,8 @@ QgisApp::~QgisApp()
845847

846848
delete mOverviewMapCursor;
847849

850+
delete mComposerManager;
851+
848852
deletePrintComposers();
849853
removeAnnotationItems();
850854

@@ -3931,8 +3935,19 @@ void QgisApp::newPrintComposer()
39313935

39323936
void QgisApp::showComposerManager()
39333937
{
3934-
QgsComposerManager m( this );
3935-
m.exec();
3938+
if ( !mComposerManager )
3939+
{
3940+
mComposerManager = new QgsComposerManager( this, Qt::Window );
3941+
connect( mComposerManager, SIGNAL( finished( int ) ), this, SLOT( deleteComposerManager() ) );
3942+
}
3943+
mComposerManager->show();
3944+
mComposerManager->activate();
3945+
}
3946+
3947+
void QgisApp::deleteComposerManager()
3948+
{
3949+
mComposerManager->deleteLater();
3950+
mComposerManager = 0;
39363951
}
39373952

39383953
void QgisApp::saveMapAsImage()
@@ -5016,6 +5031,7 @@ void QgisApp::deleteComposer( QgsComposer* c )
50165031
mPrintComposers.remove( c );
50175032
mPrintComposersMenu->removeAction( c->windowAction() );
50185033
markDirty();
5034+
emit composerRemoved( c->view() );
50195035
delete c;
50205036
}
50215037

‎src/app/qgisapp.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ class QgsAnnotationItem;
4242
class QgsClipboard;
4343
class QgsComposer;
4444
class QgsComposerView;
45+
class QgsComposerManager;
4546
class QgsContrastEnhancement;
4647
class QgsGeometry;
4748
class QgsFeature;
@@ -1181,6 +1182,9 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
11811182
//! catch MapCanvas keyPress event so we can check if selected feature collection must be deleted
11821183
void mapCanvas_keyPressed( QKeyEvent *e );
11831184

1185+
//! Deletes the active QgsComposerManager instance
1186+
void deleteComposerManager();
1187+
11841188
signals:
11851189
/** emitted when a key is pressed and we want non widget sublasses to be able
11861190
to pick up on this (e.g. maplayer) */
@@ -1217,6 +1221,10 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
12171221
@note added in version 1.4*/
12181222
void composerWillBeRemoved( QgsComposerView* v );
12191223

1224+
/**This signal is emitted when a composer instance has been removed
1225+
@note added in version 2.3*/
1226+
void composerRemoved( QgsComposerView* v );
1227+
12201228
/**This signal is emitted when QGIS' initialization is complete
12211229
@note added in version 1.6*/
12221230
void initializationCompleted();
@@ -1518,6 +1526,8 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
15181526

15191527
QgsPluginManager* mPluginManager;
15201528

1529+
QgsComposerManager* mComposerManager;
1530+
15211531
//! Persistent tile scale slider
15221532
QgsTileScaleWidget * mpTileScaleWidget;
15231533

0 commit comments

Comments
 (0)
Please sign in to comment.