|
33 | 33 | from qgis.PyQt.QtCore import QCoreApplication, QDir
|
34 | 34 | from qgis.PyQt.QtWidgets import QDialog, QMenu, QAction, QFileDialog
|
35 | 35 | from qgis.PyQt.QtGui import QCursor
|
36 |
| -from qgis.gui import QgsEncodingFileDialog, QgsExpressionBuilderDialog |
| 36 | +from qgis.gui import QgsEncodingSelectionDialog |
37 | 37 | from qgis.core import (QgsDataSourceUri,
|
38 | 38 | QgsCredentials,
|
39 | 39 | QgsExpression,
|
40 | 40 | QgsSettings,
|
41 | 41 | QgsProcessingParameterFeatureSink,
|
| 42 | + QgsProcessingParameterRasterDestination, |
42 | 43 | QgsProcessingOutputLayerDefinition,
|
43 | 44 | QgsProcessingParameterDefinition,
|
44 | 45 | QgsProcessingParameterFileDestination,
|
@@ -138,6 +139,11 @@ def selectOutput(self):
|
138 | 139 | actionSaveToPostGIS.setEnabled(bool(names))
|
139 | 140 | popupMenu.addAction(actionSaveToPostGIS)
|
140 | 141 |
|
| 142 | + actionSetEncoding = QAction( |
| 143 | + self.tr('Change file encoding ({})...').format(self.encoding), self.btnSelect) |
| 144 | + actionSetEncoding.triggered.connect(self.selectEncoding) |
| 145 | + popupMenu.addAction(actionSetEncoding) |
| 146 | + |
141 | 147 | popupMenu.exec_(QCursor.pos())
|
142 | 148 |
|
143 | 149 | def saveToTemporary(self):
|
@@ -172,71 +178,78 @@ def saveToPostGIS(self):
|
172 | 178 | self.leText.setText("postgis:" + uri.uri())
|
173 | 179 |
|
174 | 180 | def saveToSpatialite(self):
|
175 |
| - fileFilter = self.tr('SpatiaLite files (*.sqlite)', 'OutputFile') |
| 181 | + file_filter = self.tr('SpatiaLite files (*.sqlite)', 'OutputFile') |
176 | 182 |
|
177 | 183 | settings = QgsSettings()
|
178 | 184 | if settings.contains('/Processing/LastOutputPath'):
|
179 | 185 | path = settings.value('/Processing/LastOutputPath')
|
180 | 186 | else:
|
181 | 187 | path = ProcessingConfig.getSetting(ProcessingConfig.OUTPUT_FOLDER)
|
182 | 188 |
|
183 |
| - fileDialog = QgsEncodingFileDialog( |
184 |
| - self, self.tr('Save SpatiaLite'), path, fileFilter, self.encoding) |
185 |
| - fileDialog.setFileMode(QFileDialog.AnyFile) |
186 |
| - fileDialog.setAcceptMode(QFileDialog.AcceptSave) |
187 |
| - fileDialog.setOption(QFileDialog.DontConfirmOverwrite, True) |
| 189 | + filename, filter = QFileDialog.getSaveFileName(self, self.tr("Save file"), path, |
| 190 | + file_filter, options=QFileDialog.DontConfirmOverwrite) |
188 | 191 |
|
189 |
| - if fileDialog.exec_() == QDialog.Accepted: |
| 192 | + if filename is not None: |
190 | 193 | self.use_temporary = False
|
191 |
| - files = fileDialog.selectedFiles() |
192 |
| - self.encoding = str(fileDialog.encoding()) |
193 |
| - fileName = str(files[0]) |
194 |
| - selectedFileFilter = str(fileDialog.selectedNameFilter()) |
195 |
| - if not fileName.lower().endswith( |
196 |
| - tuple(re.findall("\\*(\\.[a-z]{1,10})", fileFilter))): |
197 |
| - ext = re.search("\\*(\\.[a-z]{1,10})", selectedFileFilter) |
198 |
| - if ext: |
199 |
| - fileName += ext.group(1) |
| 194 | + if not filename.lower().endswith('.sqlite'): |
| 195 | + filename += '.sqlite' |
200 | 196 | settings.setValue('/Processing/LastOutputPath',
|
201 |
| - os.path.dirname(fileName)) |
202 |
| - settings.setValue('/Processing/encoding', self.encoding) |
| 197 | + os.path.dirname(filename)) |
203 | 198 |
|
204 | 199 | uri = QgsDataSourceUri()
|
205 |
| - uri.setDatabase(fileName) |
| 200 | + uri.setDatabase(filename) |
206 | 201 | uri.setDataSource('', self.parameter.name().lower(),
|
207 | 202 | 'the_geom' if isinstance(self.parameter, QgsProcessingParameterFeatureSink) and self.parameter.hasGeometry() else None)
|
208 | 203 | self.leText.setText("spatialite:" + uri.uri())
|
209 | 204 |
|
210 | 205 | def selectFile(self):
|
211 |
| - fileFilter = getFileFilter(self.parameter) |
212 |
| - |
| 206 | + file_filter = getFileFilter(self.parameter) |
213 | 207 | settings = QgsSettings()
|
| 208 | + if isinstance(self.parameter, QgsProcessingParameterFeatureSink): |
| 209 | + last_ext_path = '/Processing/LastVectorOutputExt' |
| 210 | + last_ext = settings.value(last_ext_path, '.gpkg') |
| 211 | + elif isinstance(self.parameter, QgsProcessingParameterRasterDestination): |
| 212 | + last_ext_path = '/Processing/LastRasterOutputExt' |
| 213 | + last_ext = settings.value(last_ext_path, '.tif') |
| 214 | + else: |
| 215 | + last_ext_path = None |
| 216 | + last_ext = None |
| 217 | + |
| 218 | + # get default filter |
| 219 | + filters = file_filter.split(';;') |
| 220 | + try: |
| 221 | + last_filter = [f for f in filters if '*{}'.format(last_ext) in f.lower()][0] |
| 222 | + except: |
| 223 | + last_filter = None |
| 224 | + |
214 | 225 | if settings.contains('/Processing/LastOutputPath'):
|
215 | 226 | path = settings.value('/Processing/LastOutputPath')
|
216 | 227 | else:
|
217 | 228 | path = ProcessingConfig.getSetting(ProcessingConfig.OUTPUT_FOLDER)
|
218 | 229 |
|
219 |
| - fileDialog = QgsEncodingFileDialog( |
220 |
| - self, self.tr('Save file'), path, fileFilter, self.encoding) |
221 |
| - fileDialog.setFileMode(QFileDialog.AnyFile) |
222 |
| - fileDialog.setAcceptMode(QFileDialog.AcceptSave) |
223 |
| - fileDialog.setOption(QFileDialog.DontConfirmOverwrite, False) |
224 |
| - |
225 |
| - if fileDialog.exec_() == QDialog.Accepted: |
| 230 | + filename, filter = QFileDialog.getSaveFileName(self, self.tr("Save file"), path, |
| 231 | + file_filter, last_filter) |
| 232 | + if filename: |
226 | 233 | self.use_temporary = False
|
227 |
| - files = fileDialog.selectedFiles() |
228 |
| - self.encoding = str(fileDialog.encoding()) |
229 |
| - fileName = str(files[0]) |
230 |
| - selectedFileFilter = str(fileDialog.selectedNameFilter()) |
231 |
| - if not fileName.lower().endswith( |
232 |
| - tuple(re.findall("\\*(\\.[a-z]{1,10})", fileFilter))): |
233 |
| - ext = re.search("\\*(\\.[a-z]{1,10})", selectedFileFilter) |
| 234 | + if not filename.lower().endswith( |
| 235 | + tuple(re.findall("\\*(\\.[a-z]{1,10})", file_filter))): |
| 236 | + ext = re.search("\\*(\\.[a-z]{1,10})", filter) |
234 | 237 | if ext:
|
235 |
| - fileName += ext.group(1) |
236 |
| - self.leText.setText(fileName) |
| 238 | + filename += ext.group(1) |
| 239 | + self.leText.setText(filename) |
237 | 240 | settings.setValue('/Processing/LastOutputPath',
|
238 |
| - os.path.dirname(fileName)) |
| 241 | + os.path.dirname(filename)) |
| 242 | + if not last_ext_path is None: |
| 243 | + settings.setValue(last_ext_path, os.path.splitext(filename)[1].lower()) |
| 244 | + |
| 245 | + def selectEncoding(self): |
| 246 | + dialog = QgsEncodingSelectionDialog( |
| 247 | + self, self.tr('File encoding'), self.encoding) |
| 248 | + if dialog.exec_() == QDialog.Accepted: |
| 249 | + self.encoding = dialog.encoding() |
| 250 | + settings = QgsSettings() |
239 | 251 | settings.setValue('/Processing/encoding', self.encoding)
|
| 252 | + dialog.deleteLater() |
240 | 253 |
|
241 | 254 | def selectDirectory(self):
|
242 | 255 | lastDir = self.leText.text()
|
|
0 commit comments