@@ -3842,7 +3842,12 @@ void QgisApp::newPrintComposer()
3842
3842
return ;
3843
3843
}
3844
3844
3845
- createNewComposer ();
3845
+ QString title = uniqueComposerTitle ( this , true );
3846
+ if ( title.isNull () )
3847
+ {
3848
+ return ;
3849
+ }
3850
+ createNewComposer ( title );
3846
3851
}
3847
3852
3848
3853
void QgisApp::showComposerManager ()
@@ -4604,12 +4609,79 @@ QgsGeometry* QgisApp::unionGeometries( const QgsVectorLayer* vl, QgsFeatureList&
4604
4609
return unionGeom;
4605
4610
}
4606
4611
4607
- QgsComposer* QgisApp::createNewComposer ()
4612
+ QString QgisApp::uniqueComposerTitle ( QWidget* parent, bool acceptEmpty, const QString& currentName )
4613
+ {
4614
+ if ( !parent )
4615
+ {
4616
+ parent = this ;
4617
+ }
4618
+ bool ok = false ;
4619
+ bool titleValid = false ;
4620
+ QString newTitle = QString ( currentName );
4621
+ QString chooseMsg = tr ( " Create unique print composer title" );
4622
+ if ( acceptEmpty )
4623
+ {
4624
+ chooseMsg += " \n " + tr ( " (title generated if left empty)" );
4625
+ }
4626
+ QString titleMsg = chooseMsg;
4627
+
4628
+ QStringList cNames;
4629
+ cNames << newTitle;
4630
+ foreach ( QgsComposer* c, printComposers () )
4631
+ {
4632
+ cNames << c->title ();
4633
+ }
4634
+
4635
+ while ( !titleValid )
4636
+ {
4637
+ newTitle = QInputDialog::getItem ( parent,
4638
+ tr ( " Composer title" ),
4639
+ titleMsg,
4640
+ cNames,
4641
+ cNames.indexOf ( newTitle ),
4642
+ true ,
4643
+ &ok );
4644
+ if ( !ok )
4645
+ {
4646
+ return QString::null;
4647
+ }
4648
+
4649
+ if ( newTitle.isEmpty () )
4650
+ {
4651
+ if ( !acceptEmpty )
4652
+ {
4653
+ titleMsg = chooseMsg + " \n\n " + tr ( " Title can not be empty!" );
4654
+ }
4655
+ else
4656
+ {
4657
+ newTitle = QString ( " " );
4658
+ titleValid = true ;
4659
+ }
4660
+ }
4661
+ else if ( cNames.indexOf ( newTitle, 1 ) >= 0 )
4662
+ {
4663
+ cNames[0 ] = QString ( " " ); // clear non-unique name
4664
+ titleMsg = chooseMsg + " \n\n " + tr ( " Title already exists!" );
4665
+ }
4666
+ else
4667
+ {
4668
+ titleValid = true ;
4669
+ }
4670
+ }
4671
+
4672
+ return newTitle;
4673
+ }
4674
+
4675
+ QgsComposer* QgisApp::createNewComposer ( QString title )
4608
4676
{
4609
4677
// ask user about name
4610
4678
mLastComposerId ++;
4679
+ if ( title.isEmpty () )
4680
+ {
4681
+ title = tr ( " Composer %1" ).arg ( mLastComposerId );
4682
+ }
4611
4683
// create new composer object
4612
- QgsComposer* newComposerObject = new QgsComposer ( this , tr ( " Composer %1 " ). arg ( mLastComposerId ) );
4684
+ QgsComposer* newComposerObject = new QgsComposer ( this , title );
4613
4685
4614
4686
// add it to the map of existing print composers
4615
4687
mPrintComposers .insert ( newComposerObject );
@@ -4632,84 +4704,45 @@ void QgisApp::deleteComposer( QgsComposer* c )
4632
4704
delete c;
4633
4705
}
4634
4706
4635
- QgsComposer* QgisApp::duplicateComposer ( QgsComposer* currentComposer, QWidget* parent )
4707
+ QgsComposer* QgisApp::duplicateComposer ( QgsComposer* currentComposer, QString title )
4636
4708
{
4637
4709
QgsComposer* newComposer = 0 ;
4638
- if ( !parent )
4639
- {
4640
- parent = this ;
4641
- }
4642
4710
4643
4711
// test that current composer template write is valid
4644
4712
QDomDocument currentDoc;
4645
4713
currentComposer->templateXML ( currentDoc );
4646
4714
QDomElement compositionElem = currentDoc.documentElement ().firstChildElement ( " Composition" );
4647
4715
if ( compositionElem.isNull () )
4648
4716
{
4649
- QMessageBox::warning ( parent,
4650
- tr ( " Write error" ),
4651
- tr ( " Error, selected composer could not be stored as temporary template" ) );
4717
+ QgsDebugMsg ( " selected composer could not be stored as temporary template" );
4652
4718
return newComposer;
4653
4719
}
4654
4720
4655
- QList<QString> cNames;
4656
- foreach ( QgsComposer* c, printComposers () )
4657
- {
4658
- cNames << c->title ();
4659
- }
4660
-
4661
- bool ok = false ;
4662
- bool titleValid = false ;
4663
- QString newTitle = currentComposer->title () + tr ( " copy" );
4664
- QString chooseMsg = tr ( " Choose title" );
4665
- QString titleMsg = chooseMsg;
4666
- while ( !titleValid )
4721
+ if ( title.isEmpty () )
4667
4722
{
4668
- newTitle = QInputDialog::getText ( parent,
4669
- tr ( " New title" ),
4670
- titleMsg,
4671
- QLineEdit::Normal,
4672
- newTitle,
4673
- &ok );
4674
- if ( !ok )
4675
- {
4676
- return newComposer;
4677
- }
4678
-
4679
- if ( cNames.contains ( newTitle ) )
4680
- {
4681
- titleMsg = chooseMsg + tr ( " \n (title already exists!)" );
4682
- }
4683
- else if ( newTitle.isEmpty () )
4684
- {
4685
- titleMsg = chooseMsg + tr ( " \n (title can not be empty!)" );
4686
- }
4687
- else
4688
- {
4689
- titleValid = true ;
4690
- }
4723
+ // TODO: inject a bit of randomness in auto-titles?
4724
+ title = currentComposer->title () + tr ( " copy" );
4691
4725
}
4692
4726
4693
- newComposer = createNewComposer ();
4727
+ newComposer = createNewComposer ( title );
4694
4728
if ( !newComposer )
4695
4729
{
4696
- QMessageBox::warning ( parent,
4697
- tr ( " Composer error" ),
4698
- tr ( " Error, could not create new composer" ) );
4730
+ QgsDebugMsg ( " could not create new composer" );
4699
4731
return newComposer;
4700
4732
}
4701
- newComposer->hide (); // until template is loaded (faster)
4702
4733
4734
+ // disable updates until template is loaded (may be faster, but still gives user feedback),
4735
+ // but is not as fast as hiding composer until template is loaded
4736
+ newComposer->setUpdatesEnabled ( false );
4703
4737
QApplication::setOverrideCursor ( Qt::BusyCursor );
4704
4738
if ( !newComposer->composition ()->loadFromTemplate ( currentDoc, 0 , false ) )
4705
4739
{
4706
4740
deleteComposer ( newComposer );
4707
- QMessageBox::warning ( parent,
4708
- tr ( " Read error" ),
4709
- tr ( " Error, composer could not be duplicated" ) );
4741
+ newComposer = 0 ;
4742
+ QgsDebugMsg ( " Error, composer could not be duplicated" );
4710
4743
return newComposer;
4711
4744
}
4712
- newComposer->setTitle ( newTitle );
4745
+ newComposer->setUpdatesEnabled ( true );
4713
4746
newComposer->activate ();
4714
4747
QApplication::restoreOverrideCursor ();
4715
4748
0 commit comments