20
20
#include " qgscomposer.h"
21
21
#include " qgslogger.h"
22
22
23
+ #include < QDesktopServices>
23
24
#include < QDialog>
24
25
#include < QDir>
26
+ #include < QFileDialog>
25
27
#include < QInputDialog>
26
28
#include < QListWidgetItem>
27
29
#include < QMessageBox>
30
+ #include < QUrl>
28
31
#include < QSettings>
29
32
30
33
QgsComposerManager::QgsComposerManager ( QWidget * parent, Qt::WindowFlags f ): QDialog( parent, f )
@@ -65,6 +68,7 @@ QgsComposerManager::~QgsComposerManager()
65
68
66
69
void QgsComposerManager::initialize ()
67
70
{
71
+ QSettings settings;
68
72
QSet<QgsComposer*> composers = QgisApp::instance ()->printComposers ();
69
73
QSet<QgsComposer*>::const_iterator it = composers.constBegin ();
70
74
for ( ; it != composers.constEnd (); ++it )
@@ -75,24 +79,42 @@ void QgsComposerManager::initialize()
75
79
}
76
80
77
81
mTemplate ->addItem ( tr ( " Empty composer" ) );
82
+ mTemplate ->addItem ( tr ( " Specific" ) );
83
+
84
+ mUserTemplatesDir = QgsApplication::qgisSettingsDirPath () + " /composer_templates" ;
85
+ QMap<QString, QString> userTemplateMap = defaultTemplates ( true );
86
+ if ( userTemplateMap.size () > 0 )
87
+ {
88
+ mTemplate ->insertSeparator ( mTemplate ->count () );
89
+ QMap<QString, QString>::const_iterator templateIt = userTemplateMap.constBegin ();
90
+ for ( ; templateIt != userTemplateMap.constEnd (); ++templateIt )
91
+ {
92
+ mTemplate ->addItem ( templateIt.key (), templateIt.value () );
93
+ }
94
+ }
78
95
79
- QMap<QString, QString> templateMap = defaultTemplates ();
80
- if ( templateMap.size () > 0 )
96
+ mDefaultTemplatesDir = QgsApplication::pkgDataPath () + " /composer_templates" ;
97
+ QMap<QString, QString> defaultTemplateMap = defaultTemplates ( false );
98
+ if ( defaultTemplateMap.size () > 0 )
81
99
{
82
- QMap<QString, QString>::const_iterator templateIt = templateMap.constBegin ();
83
- for ( ; templateIt != templateMap.constEnd (); ++templateIt )
100
+ mTemplate ->insertSeparator ( mTemplate ->count () );
101
+ QMap<QString, QString>::const_iterator templateIt = defaultTemplateMap.constBegin ();
102
+ for ( ; templateIt != defaultTemplateMap.constEnd (); ++templateIt )
84
103
{
85
104
mTemplate ->addItem ( templateIt.key (), templateIt.value () );
86
105
}
87
106
}
107
+
108
+ mTemplatePathLineEdit ->setText ( settings.value ( " /UI/ComposerManager/templatePath" , QString ( " " ) ).toString () );
88
109
}
89
110
90
- QMap<QString, QString> QgsComposerManager::defaultTemplates () const
111
+ QMap<QString, QString> QgsComposerManager::defaultTemplates ( bool fromUser ) const
91
112
{
92
113
QMap<QString, QString> templateMap;
93
114
94
115
// search for default templates in $pkgDataPath/composer_templates
95
- QDir defaultTemplateDir ( QgsApplication::pkgDataPath () + " /composer_templates" );
116
+ // user templates in $qgisSettingsDirPath/composer_templates
117
+ QDir defaultTemplateDir ( fromUser ? mUserTemplatesDir : mDefaultTemplatesDir );
96
118
if ( !defaultTemplateDir.exists () )
97
119
{
98
120
return templateMap;
@@ -109,7 +131,33 @@ QMap<QString, QString> QgsComposerManager::defaultTemplates() const
109
131
110
132
void QgsComposerManager::on_mAddButton_clicked ()
111
133
{
134
+ QFile templateFile;
135
+ bool loadingTemplate = ( mTemplate ->currentIndex () > 0 );
136
+ if ( loadingTemplate )
137
+ {
138
+ if ( mTemplate ->currentIndex () == 1 )
139
+ {
140
+ templateFile.setFileName ( mTemplatePathLineEdit ->text () );
141
+ }
142
+ else
143
+ {
144
+ templateFile.setFileName ( mTemplate ->itemData ( mTemplate ->currentIndex () ).toString () );
145
+ }
146
+
147
+ if ( !templateFile.exists () )
148
+ {
149
+ QMessageBox::warning ( this , tr ( " Template error" ), tr ( " Error, template file not found" ) );
150
+ return ;
151
+ }
152
+ if ( !templateFile.open ( QIODevice::ReadOnly ) )
153
+ {
154
+ QMessageBox::warning ( this , tr ( " Template error" ), tr ( " Error, could not read file" ) );
155
+ return ;
156
+ }
157
+ }
158
+
112
159
QgsComposer* newComposer = 0 ;
160
+ bool loadedOK = false ;
113
161
114
162
QString title = QgisApp::instance ()->uniqueComposerTitle ( this , true );
115
163
if ( title.isNull () )
@@ -120,25 +168,94 @@ void QgsComposerManager::on_mAddButton_clicked()
120
168
newComposer = QgisApp::instance ()->createNewComposer ( title );
121
169
if ( !newComposer )
122
170
{
171
+ QMessageBox::warning ( this , tr ( " Composer error" ), tr ( " Error, could not create composer" ) );
123
172
return ;
124
173
}
174
+ else
175
+ {
176
+ loadedOK = true ;
177
+ }
125
178
126
- if ( mTemplate -> currentIndex () > 0 )
179
+ if ( loadingTemplate )
127
180
{
128
181
QDomDocument templateDoc;
129
- QFile templateFile ( mTemplate ->itemData ( mTemplate ->currentIndex () ).toString () );
130
- if ( templateFile.open ( QIODevice::ReadOnly ) )
182
+ if ( templateDoc.setContent ( &templateFile, false ) )
131
183
{
132
- if ( templateDoc.setContent ( &templateFile, false ) )
133
- {
134
- newComposer->readXML ( templateDoc );
135
- }
184
+ // provide feedback, since composer will be hidden when loading template (much faster)
185
+ // (not needed for empty composer)
186
+ QDialog* dlg = newComposer->busyIndicatorDialog ( tr ( " Loading template into composer..." ), this );
187
+ dlg->show ();
188
+ newComposer->hide ();
189
+ loadedOK = newComposer->composition ()->loadFromTemplate ( templateDoc, 0 , false );
190
+ newComposer->activate ();
191
+ dlg->close ();
136
192
}
137
193
}
138
194
139
- QListWidgetItem* item = new QListWidgetItem ( newComposer->title (), mComposerListWidget );
140
- item->setFlags ( Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable );
141
- mItemComposerMap .insert ( item, newComposer );
195
+ if ( loadedOK )
196
+ {
197
+ // do not close on Add, since user may want to add multiple composers from templates
198
+ QListWidgetItem* item = new QListWidgetItem ( newComposer->title (), mComposerListWidget );
199
+ item->setFlags ( Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable );
200
+ mItemComposerMap .insert ( item, newComposer );
201
+ mComposerListWidget ->setCurrentItem ( item );
202
+ mComposerListWidget ->setFocus ();
203
+ }
204
+ else
205
+ {
206
+ if ( newComposer )
207
+ {
208
+ newComposer->close ();
209
+ QgisApp::instance ()->deleteComposer ( newComposer );
210
+ newComposer = 0 ;
211
+ }
212
+ QMessageBox::warning ( this , tr ( " Template error" ), tr ( " Error, could not load template file" ) );
213
+ }
214
+ }
215
+
216
+ void QgsComposerManager::on_mTemplate_currentIndexChanged ( int indx )
217
+ {
218
+ bool specific = ( indx == 1 ); // comes just after empty template
219
+ mTemplatePathLineEdit ->setEnabled ( specific );
220
+ mTemplatePathBtn ->setEnabled ( specific );
221
+ }
222
+
223
+ void QgsComposerManager::on_mTemplatePathBtn_pressed ()
224
+ {
225
+ QSettings settings;
226
+ QString lastTmplDir = settings.value ( " /UI/lastComposerTemplateDir" , " ." ).toString ();
227
+ QString tmplPath = QFileDialog::getOpenFileName ( this ,
228
+ tr ( " Choose template" ),
229
+ lastTmplDir,
230
+ tr ( " Composer templates" ) + " (*.qpt)" );
231
+ if ( !tmplPath.isNull () )
232
+ {
233
+ mTemplatePathLineEdit ->setText ( tmplPath );
234
+ settings.setValue ( " UI/ComposerManager/templatePath" , tmplPath );
235
+ QFileInfo tmplFileInfo ( tmplPath );
236
+ settings.setValue ( " UI/lastComposerTemplateDir" , tmplFileInfo.absolutePath () );
237
+ }
238
+ }
239
+
240
+ void QgsComposerManager::on_mTemplatesDefaultDirBtn_pressed ()
241
+ {
242
+ openLocalDirectory ( mDefaultTemplatesDir );
243
+ }
244
+
245
+ void QgsComposerManager::on_mTemplatesUserDirBtn_pressed ()
246
+ {
247
+ openLocalDirectory ( mUserTemplatesDir );
248
+ }
249
+
250
+ void QgsComposerManager::openLocalDirectory ( const QString& localDirPath )
251
+ {
252
+ QDir localDir;
253
+ if ( !localDir.mkpath ( localDirPath ) )
254
+ {
255
+ QMessageBox::warning ( this , tr ( " File system error" ), tr ( " Error, could not open or create local directory" ) );
256
+ return ;
257
+ }
258
+ QDesktopServices::openUrl ( QUrl::fromLocalFile ( localDirPath ) );
142
259
}
143
260
144
261
void QgsComposerManager::remove_clicked ()
@@ -150,7 +267,7 @@ void QgsComposerManager::remove_clicked()
150
267
}
151
268
152
269
// ask for confirmation
153
- 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 )
270
+ if ( QMessageBox::warning ( this , tr ( " Remove composer" ), tr ( " Do you really want to remove the map composer '%1'?" ).arg ( item->text () ), QMessageBox::Ok | QMessageBox::Cancel ) != QMessageBox::Ok )
154
271
{
155
272
return ;
156
273
}
@@ -291,7 +408,7 @@ void QgsComposerManager::rename_clicked()
291
408
{
292
409
return ;
293
410
}
294
- QString newTitle = QInputDialog::getText ( 0 , tr ( " Change title " ), tr ( " Title " ), QLineEdit::Normal , currentTitle );
411
+ QString newTitle = QgisApp::instance ()-> uniqueComposerTitle ( this , false , currentTitle );
295
412
if ( newTitle.isNull () )
296
413
{
297
414
return ;
0 commit comments