Skip to content

Commit 31086d3

Browse files
committedNov 21, 2017
[processing] Move destination encoding option to separate menu action
...instead of embedding in output destination file selector. Otherwise Qt downgrades the file picker to the Qt basic file picker, instead of the native OS file picker. Which is a huge downgrade and barely functional for users. Also remember last selected file format
1 parent f660d78 commit 31086d3

File tree

2 files changed

+45
-20
lines changed

2 files changed

+45
-20
lines changed
 

‎python/plugins/processing/gui/DestinationSelectionPanel.py

Lines changed: 44 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,13 @@
3333
from qgis.PyQt.QtCore import QCoreApplication, QDir
3434
from qgis.PyQt.QtWidgets import QDialog, QMenu, QAction, QFileDialog
3535
from qgis.PyQt.QtGui import QCursor
36-
from qgis.gui import QgsEncodingFileDialog, QgsExpressionBuilderDialog
36+
from qgis.gui import QgsEncodingFileDialog, QgsEncodingSelectionDialog
3737
from qgis.core import (QgsDataSourceUri,
3838
QgsCredentials,
3939
QgsExpression,
4040
QgsSettings,
4141
QgsProcessingParameterFeatureSink,
42+
QgsProcessingParameterRasterDestination,
4243
QgsProcessingOutputLayerDefinition,
4344
QgsProcessingParameterDefinition,
4445
QgsProcessingParameterFileDestination,
@@ -122,6 +123,11 @@ def selectOutput(self):
122123
actionSaveToFile.triggered.connect(self.selectFile)
123124
popupMenu.addAction(actionSaveToFile)
124125

126+
actionSetEncoding = QAction(
127+
self.tr('Change file encoding ({})...').format(self.encoding), self.btnSelect)
128+
actionSetEncoding.triggered.connect(self.selectEncoding)
129+
popupMenu.addAction(actionSetEncoding)
130+
125131
if isinstance(self.parameter, QgsProcessingParameterFeatureSink) \
126132
and self.alg.provider().supportsNonFileBasedOutput():
127133
actionSaveToSpatialite = QAction(
@@ -208,35 +214,53 @@ def saveToSpatialite(self):
208214
self.leText.setText("spatialite:" + uri.uri())
209215

210216
def selectFile(self):
211-
fileFilter = getFileFilter(self.parameter)
212-
217+
file_filter = getFileFilter(self.parameter)
213218
settings = QgsSettings()
219+
if isinstance(self.parameter, QgsProcessingParameterFeatureSink):
220+
last_ext_path = '/Processing/LastVectorOutputExt'
221+
last_ext = settings.value(last_ext_path, '.gpkg')
222+
elif isinstance(self.parameter, QgsProcessingParameterRasterDestination):
223+
last_ext_path = '/Processing/LastRasterOutputExt'
224+
last_ext = settings.value(last_ext_path, '.tif')
225+
else:
226+
last_ext_path = None
227+
last_ext = None
228+
229+
# get default filter
230+
filters = file_filter.split(';;')
231+
try:
232+
last_filter = [f for f in filters if '*{}'.format(last_ext) in f.lower()][0]
233+
except:
234+
last_filter = None
235+
214236
if settings.contains('/Processing/LastOutputPath'):
215237
path = settings.value('/Processing/LastOutputPath')
216238
else:
217239
path = ProcessingConfig.getSetting(ProcessingConfig.OUTPUT_FOLDER)
218240

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:
241+
filename, filter = QFileDialog.getSaveFileName(self, self.tr("Save file"), path,
242+
file_filter, last_filter)
243+
if filename:
226244
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)
245+
if not filename.lower().endswith(
246+
tuple(re.findall("\\*(\\.[a-z]{1,10})", file_filter))):
247+
ext = re.search("\\*(\\.[a-z]{1,10})", filter)
234248
if ext:
235-
fileName += ext.group(1)
236-
self.leText.setText(fileName)
249+
filename += ext.group(1)
250+
self.leText.setText(filename)
237251
settings.setValue('/Processing/LastOutputPath',
238-
os.path.dirname(fileName))
252+
os.path.dirname(filename))
253+
if not last_ext_path is None:
254+
settings.setValue(last_ext_path, os.path.splitext(filename)[1].lower())
255+
256+
def selectEncoding(self):
257+
dialog = QgsEncodingSelectionDialog(
258+
self, self.tr('File encoding'), self.encoding)
259+
if dialog.exec_() == QDialog.Accepted:
260+
self.encoding = dialog.encoding()
261+
settings = QgsSettings()
239262
settings.setValue('/Processing/encoding', self.encoding)
263+
dialog.deleteLater()
240264

241265
def selectDirectory(self):
242266
lastDir = self.leText.text()

‎src/gui/qgsencodingfiledialog.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ QgsEncodingSelectionDialog::QgsEncodingSelectionDialog( QWidget *parent, const Q
132132
layout->addWidget( buttonBox );
133133
setLayout( layout );
134134

135+
mEncodingComboBox->addItem( tr( "System" ) );
135136
mEncodingComboBox->addItems( QgsVectorDataProvider::availableEncodings() );
136137

137138
// Use default encoding if none supplied

0 commit comments

Comments
 (0)
Please sign in to comment.