1616 * (at your option) any later version. *
1717 * *
1818 ***************************************************************************/
19- /* Adapted by Erik van de Pol, B3Partners BV. */
19+ /* Adapted by Erik van de Pol */
2020"""
2121# Import the PyQt and QGIS libraries
2222from PyQt4 .QtCore import *
@@ -55,6 +55,7 @@ def getThemeIcon(self, theName):
5555 else :
5656 return QIcon ()
5757
58+
5859 def initGui (self ):
5960 # Create action that will start plugin configuration
6061 self .action = QAction (self .getThemeIcon ("mapserver_export.png" ), \
@@ -63,26 +64,31 @@ def initGui(self):
6364 # connect the action to the run method
6465 QObject .connect (self .action , SIGNAL ("activated()" ), self .run )
6566 QObject .connect (self .iface , SIGNAL ("currentThemeChanged ( QString )" ), self .setCurrentTheme )
66-
6767 # Add toolbar button and menu item
6868 self .iface .addToolBarIcon (self .action )
6969 self .iface .addPluginToMenu ("&MapServer Export..." , self .action )
7070
71+
7172 def unload (self ):
7273 # Remove the plugin menu item and icon
7374 self .iface .removePluginMenu ("&MapServer Export..." ,self .action )
7475 self .iface .removeToolBarIcon (self .action )
7576
77+
7678 # run method that performs all the real work
7779 def run (self ):
7880 # create and show the MapServerExport dialog
7981 self .dlg = MapServerExportDialog ()
80- #dlg.setupUi(self)
82+
83+ # TODO: should come from settings
84+ self .dlg .ui .txtMapFilePath .setText ('/usr/lib/cgi-bin/kaas.map' )
8185
86+ # project defaults to current instance
8287 project = QgsProject .instance ()
88+
8389 # question: save project on loading export dialog?
8490 if project .isDirty ():
85- shouldSave = QMessageBox .question (None ,
91+ shouldSave = QMessageBox .question (self . dlg ,
8692 "Save?" ,
8793 "Save project to \" " + project .fileName () + "\" before exporting? Only the last saved version of your project will be exported." ,
8894 QMessageBox .Yes ,
@@ -97,14 +103,31 @@ def run(self):
97103 "." ,
98104 "QGIS Project Files (*.qgs)" ,
99105 "Filter list for selecting files from a dialog box" )
100- project .setFileName (saveAsFileName )
101- project .write ()
106+ # Check that a file was selected
107+ if saveAsFileName .size () == 0 :
108+ QMessageBox .warning (self .dlg , "Not saved!" , "QGis project file not saved because no file name was given." )
109+ # fall back to using current project if available
110+ self .dlg .ui .txtQgisFilePath .setText (project .fileName ())
111+ else :
112+ project .setFileName (saveAsFileName )
113+ project .write ()
114+ else :
115+ project .write ()
102116 elif shouldSave == QMessageBox .Cancel :
103117 return # do not show the export dialog
104118
105119 self .dlg .ui .txtQgisFilePath .setText (project .fileName ())
120+
121+ # set title, or set default one if none available
122+ title = project .title ()
123+ if title == "" :
124+ title = "QGisGeneratedMapfile"
106125 self .dlg .ui .txtMapName .setText (project .title ())
107-
126+
127+ if self .dlg .ui .txtMapFilePath .text ().size () == 0 :
128+ btnOk = self .dlg .ui .buttonBox .button (QDialogButtonBox .Ok )
129+ btnOk .setEnabled (False )
130+
108131 # TODO: fetch unit used from QSettings
109132
110133 # TODO: fetch width/height guess from QSettings:
@@ -119,94 +142,149 @@ def run(self):
119142 #self.dlg.ui.spinBoxScale.setValue(scale.toInt()[0])
120143
121144 QObject .connect (self .dlg .ui .btnChooseFile , SIGNAL ("clicked()" ), self .setSaveFile )
145+ QObject .connect (self .dlg .ui .txtMapFilePath , SIGNAL ("textChanged(QString)" ), self .mapfileChanged )
122146 QObject .connect (self .dlg .ui .btnChooseProjectFile , SIGNAL ("clicked()" ), self .setProjectFile )
123147 QObject .connect (self .dlg .ui .chkExpLayersOnly , SIGNAL ("clicked(bool)" ), self .toggleLayersOnly )
148+ QObject .connect (self .dlg .ui .checkBoxCurrentProject , SIGNAL ("clicked(bool)" ), self .toggleUseCurrentProject )
124149 QObject .connect (self .dlg .ui .btnChooseFooterFile , SIGNAL ("clicked()" ), self .setFooterFile )
125150 QObject .connect (self .dlg .ui .btnChooseHeaderFile , SIGNAL ("clicked()" ), self .setHeaderFile )
126151 QObject .connect (self .dlg .ui .btnChooseTemplateFile , SIGNAL ("clicked()" ), self .setTemplateFile )
127-
152+ QObject .connect (self .dlg .ui .buttonBox , SIGNAL ("accepted()" ), self .ok_clicked )
153+
128154 self .dlg .show ()
129- result = self .dlg .exec_ ()
130- # See if OK was pressed
131- if result == 1 :
132- # get the settings from the dialog and export the map file
133- print "Creating exporter using %s and %s" % (self .dlg .ui .txtQgisFilePath .text (), self .dlg .ui .txtMapFilePath .text ())
134- exporter = Qgis2Map (unicode (self .dlg .ui .txtQgisFilePath .text ()), unicode (self .dlg .ui .txtMapFilePath .text ()))
135- print "Setting options"
136-
137- exporter .setOptions (
138- unicode (self .dlg .ui .txtMapServerUrl .text ()),
139- unicode (self .dlg .ui .cmbMapUnits .itemData ( self .dlg .ui .cmbMapUnits .currentIndex () ).toString ()),
140- unicode (self .dlg .ui .cmbMapImageType .currentText ()),
141- unicode (self .dlg .ui .txtMapName .text ()),
142- unicode (self .dlg .ui .txtMapWidth .text ()),
143- unicode (self .dlg .ui .txtMapHeight .text ()),
144- unicode (self .dlg .ui .txtWebTemplate .text ()),
145- unicode (self .dlg .ui .txtWebFooter .text ()),
146- unicode (self .dlg .ui .txtWebHeader .text ()),
147- self .dlg .ui .checkBoxDump .isChecked (),
148- self .dlg .ui .checkBoxForce .isChecked (),
149- self .dlg .ui .checkBoxAntiAlias .isChecked (),
150- self .dlg .ui .checkBoxPartials .isChecked (),
151- self .dlg .ui .chkExpLayersOnly .isChecked (),
152- unicode (self .dlg .ui .txtFontsetPath .text ()),
153- unicode (self .dlg .ui .txtSymbolsetPath .text ())
154- )
155- print "Calling writeMapFile"
155+
156+ def ok_clicked (self ):
157+ # Check if map file name is provided
158+ if self .dlg .ui .txtMapFilePath .text ().size () == 0 :
159+ saveAsFileName = QFileDialog .getSaveFileName (self .dlg ,
160+ "Please choose to save map file as..." ,
161+ "." ,
162+ "Map files (*.map)" ,
163+ "Filter list for selecting files from a dialog box" )
164+ # Check that a file was selected
165+ if saveAsFileName .size () == 0 :
166+ QMessageBox .warning (self .dlg , "Not saved!" , "Map file not saved because no file name was given" )
167+ return
168+ else :
169+ self .dlg .ui .txtMapFilePath .setText (saveAsFileName )
170+ self .saveMapFile ()
171+
172+ # Check if map file exists and we should overwrite it
173+ elif QFile (self .dlg .ui .txtMapFilePath .text ()).exists ():
174+ shouldOverwrite = QMessageBox .question (self .dlg ,
175+ "Overwrite?" ,
176+ "Map file \" " + self .dlg .ui .txtMapFilePath .text () + "\" already exists. \n Should we overwrite it?" ,
177+ QMessageBox .Yes ,
178+ QMessageBox .Cancel
179+ )
180+ if shouldOverwrite == QMessageBox .Yes :
181+ self .saveMapFile ()
182+ elif shouldOverwrite == QMessageBox .Cancel :
183+ return
184+
185+ else :
186+ self .saveMapFile ()
187+
188+ def toggleUseCurrentProject (self , boolUseCurrent ):
189+ self .dlg .ui .txtQgisFilePath .setEnabled (not boolUseCurrent )
190+ self .dlg .ui .btnChooseProjectFile .setEnabled (not boolUseCurrent )
191+ if boolUseCurrent :
192+ if self .dlg .ui .txtQgisFilePath .text ().size () == 0 :
193+ # reload path of current project
194+ self .dlg .ui .txtQgisFilePath .setText (QgsProject .instance ().fileName ())
195+ # check if current project is saved and/or dirty? Nope: will be done when Ok clicked
196+ else :
197+ # open dialog to choose project file
198+ self .setProjectFile ()
199+
200+
201+
202+ def saveMapFile (self ):
203+ # get the settings from the dialog and export the map file
204+ print "Creating exporter using %s and %s" % (self .dlg .ui .txtQgisFilePath .text (), self .dlg .ui .txtMapFilePath .text ())
205+ if self .dlg .ui .txtQgisFilePath .text ().size () == 0 :
206+ saveAsFileName = QFileDialog .getSaveFileName (self .dlg ,
207+ "Please choose to save QGis project file as..." ,
208+ "." ,
209+ "QGis files (*.qgs)" ,
210+ "Filter list for selecting files from a dialog box" )
211+ # Check that a file was selected
212+ if saveAsFileName .size () == 0 :
213+ QMessageBox .warning (self .dlg , "Not saved!" , "QGis project file not saved because no file name was given" )
214+ return
215+ else :
216+ self .dlg .ui .txtQgisFilePath .setText (saveAsFileName )
217+
218+ exporter = Qgis2Map (unicode (self .dlg .ui .txtMapFilePath .text ()))
219+
220+ # Parse qgis project file and check success
221+ if not (exporter .setQgsProject (self .dlg .ui .txtQgisFilePath .text ())):
222+ QMessageBox .warning (self .dlg , "Not saved!" , "File not saved because no valid qgis project file was given." )
223+ return
224+
225+ self .dlg .hide ()
226+ print "Setting options"
227+ exporter .setOptions (
228+ unicode (self .dlg .ui .txtMapServerUrl .text ()),
229+ unicode (self .dlg .ui .cmbMapUnits .itemData ( self .dlg .ui .cmbMapUnits .currentIndex () ).toString ()),
230+ unicode (self .dlg .ui .cmbMapImageType .currentText ()),
231+ unicode (self .dlg .ui .txtMapName .text ()),
232+ unicode (self .dlg .ui .txtMapWidth .text ()),
233+ unicode (self .dlg .ui .txtMapHeight .text ()),
234+ unicode (self .dlg .ui .txtWebTemplate .text ()),
235+ unicode (self .dlg .ui .txtWebHeader .text ()),
236+ unicode (self .dlg .ui .txtWebFooter .text ()),
237+ self .dlg .ui .checkBoxDump .isChecked (),
238+ self .dlg .ui .checkBoxForce .isChecked (),
239+ self .dlg .ui .checkBoxAntiAlias .isChecked (),
240+ self .dlg .ui .checkBoxPartials .isChecked (),
241+ self .dlg .ui .chkExpLayersOnly .isChecked (),
242+ unicode (self .dlg .ui .txtFontsetPath .text ()),
243+ unicode (self .dlg .ui .txtSymbolsetPath .text ())
244+ )
245+ print "Calling writeMapFile"
246+ try :
156247 result = exporter .writeMapFile ()
157- QMessageBox .information (None , "MapServer Export Results" , result )
248+ except Exception , err :
249+ QMessageBox .information (self .dlg , "MapServer Export Error" , str (err ))
250+ return
251+
252+ QMessageBox .information (self .dlg , "MapServer Export Results" , result )
253+
254+ def mapfileChanged (self , text ):
255+ # Enable OK button
256+ btnOk = self .dlg .ui .buttonBox .button (QDialogButtonBox .Ok )
257+ if text .size () > 0 :
258+ btnOk .setEnabled (True )
259+ else :
260+ btnOk .setEnabled (False )
158261
159262 def setSaveFile (self ):
160263 mapFile = QFileDialog .getSaveFileName (self .dlg , "Name for the map file" , \
161264 "." , "MapServer map files (*.map);;All files (*.*)" ,"Filter list for selecting files from a dialog box" )
162265 self .dlg .ui .txtMapFilePath .setText (mapFile )
163-
266+
164267 def setProjectFile (self ):
165- qgisProjectFile = QFileDialog .getOpenFileName (self .dlg , "Choose the QGIS Project file" , \
166- "." , "QGIS Project Files (*.qgs);;All files (*.*)" , "Filter list for selecting files from a dialog box" )
268+ qgisProjectFile = QFileDialog .getOpenFileName (self .dlg , "Choose a QGIS Project file" , \
269+ "." , "QGIS Project Files (*.qgs);;All files (*.*)" , "Filter list for selecting files from a dialog box" )
167270 self .dlg .ui .txtQgisFilePath .setText (qgisProjectFile )
168271
169272 def setTemplateFile (self ):
170- templateFile = QFileDialog .getOpenFileName (self .dlg ,
171- "Choose the MapServer template file" ,
172- "." ,
173- "All files (*.*)" ,
174- "Filter list for selecting files from a dialog box" )
273+ templateFile = QFileDialog .getOpenFileName (self .dlg , "Choose the MapServer template file" , \
274+ "." , "All files (*.*)" , "Filter list for selecting files from a dialog box" )
175275 self .dlg .ui .txtWebTemplate .setText (templateFile )
176276
177277 def setHeaderFile (self ):
178- headerFile = QFileDialog .getOpenFileName (self .dlg ,
179- "Choose the MapServer header file" ,
180- "." ,
181- "All files (*.*)" ,
182- "Filter list for selecting files from a dialog box" )
278+ headerFile = QFileDialog .getOpenFileName (self .dlg , "Choose the MapServer header file" , \
279+ "." , "All files (*.*)" , "Filter list for selecting files from a dialog box" )
183280 self .dlg .ui .txtWebHeader .setText (headerFile )
184281
185282 def setFooterFile (self ):
186- footerFile = QFileDialog .getOpenFileName (self .dlg ,
187- "Choose the MapServer footer file" ,
188- "." ,
189- "All files (*.*)" ,
190- "Filter list for selecting files from a dialog box" )
283+ footerFile = QFileDialog .getOpenFileName (self .dlg , "Choose the MapServer footer file" , \
284+ "." , "All files (*.*)" , "Filter list for selecting files from a dialog box" )
191285 self .dlg .ui .txtWebFooter .setText (footerFile )
192-
193- def apply (self ):
194- # create the map file
195- foo = 'bar'
196286
197287 def toggleLayersOnly (self , isChecked ):
198288 # disable other sections if only layer export is desired
199- self .dlg .ui .txtMapName .setEnabled (not isChecked )
200- self .dlg .ui .txtMapWidth .setEnabled (not isChecked )
201- self .dlg .ui .txtMapHeight .setEnabled (not isChecked )
202- self .dlg .ui .cmbMapUnits .setEnabled (not isChecked )
203- self .dlg .ui .cmbMapImageType .setEnabled (not isChecked )
204- self .dlg .ui .txtMapServerUrl .setEnabled (not isChecked )
205- self .dlg .ui .txtFontsetPath .setEnabled (not isChecked )
206- self .dlg .ui .txtSymbolsetPath .setEnabled (not isChecked )
207- self .dlg .ui .txtWebTemplate .setEnabled (not isChecked )
208- self .dlg .ui .txtWebHeader .setEnabled (not isChecked )
209- self .dlg .ui .txtWebFooter .setEnabled (not isChecked )
210- self .dlg .ui .btnChooseFooterFile .setEnabled (not isChecked )
211- self .dlg .ui .btnChooseHeaderFile .setEnabled (not isChecked )
212- self .dlg .ui .btnChooseTemplateFile .setEnabled (not isChecked )
289+ self .dlg .ui .grpPaths .setEnabled (not isChecked )
290+ self .dlg .ui .grpMap .setEnabled (not isChecked )
0 commit comments