Skip to content

Commit b298c76

Browse files
committedOct 5, 2016
[processing] implemented parameter widget wrappers
Conflicts: python/plugins/processing/core/GeoAlgorithm.py python/plugins/processing/gui/ExtentSelectionPanel.py python/plugins/processing/modeler/ModelerParametersDialog.py
1 parent 8cc9a50 commit b298c76

File tree

10 files changed

+916
-979
lines changed

10 files changed

+916
-979
lines changed
 

‎python/plugins/processing/core/GeoAlgorithm.py

Lines changed: 52 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,7 @@
4242
from processing.core.ProcessingConfig import ProcessingConfig
4343
from processing.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
4444
from processing.core.SilentProgress import SilentProgress
45-
from processing.core.parameters import ParameterExtent
46-
from processing.core.parameters import ParameterRaster, ParameterVector, ParameterMultipleInput, ParameterTable, Parameter
45+
from processing.core.parameters import ParameterRaster, ParameterVector, ParameterMultipleInput, ParameterTable, Parameter, ParameterExtent
4746
from processing.core.outputs import OutputVector, OutputRaster, OutputTable, OutputHTML, Output
4847
from processing.algs.gdal.GdalUtils import GdalUtils
4948
from processing.tools import dataobjects, vector
@@ -363,56 +362,6 @@ def checkOutputFileExtensions(self):
363362
if ext not in exts + ['dbf']:
364363
out.value = out.value + '.' + exts[0]
365364

366-
def resolveTemporaryOutputs(self):
367-
"""Sets temporary outputs (output.value = None) with a
368-
temporary file instead.
369-
"""
370-
for out in self.outputs:
371-
if not out.hidden and out.value is None:
372-
setTempOutput(out, self)
373-
374-
def setOutputCRS(self):
375-
layers = dataobjects.getAllLayers()
376-
for param in self.parameters:
377-
if isinstance(param, (ParameterRaster, ParameterVector, ParameterMultipleInput)):
378-
if param.value:
379-
if isinstance(param, ParameterMultipleInput):
380-
inputlayers = param.value.split(';')
381-
else:
382-
inputlayers = [param.value]
383-
for inputlayer in inputlayers:
384-
for layer in layers:
385-
if layer.source() == inputlayer:
386-
self.crs = layer.crs()
387-
return
388-
p = dataobjects.getObjectFromUri(inputlayer)
389-
if p is not None:
390-
self.crs = p.crs()
391-
p = None
392-
return
393-
try:
394-
from qgis.utils import iface
395-
if iface is not None:
396-
self.crs = iface.mapCanvas().mapSettings().destinationCrs()
397-
except:
398-
pass
399-
400-
def resolveDataObjects(self):
401-
layers = dataobjects.getAllLayers()
402-
for param in self.parameters:
403-
if isinstance(param, (ParameterRaster, ParameterVector, ParameterTable,
404-
ParameterMultipleInput)):
405-
if param.value:
406-
if isinstance(param, ParameterMultipleInput):
407-
inputlayers = param.value.split(';')
408-
else:
409-
inputlayers = [param.value]
410-
for i, inputlayer in enumerate(inputlayers):
411-
for layer in layers:
412-
if layer.name() == inputlayer:
413-
inputlayers[i] = layer.source()
414-
break
415-
param.setValue(";".join(inputlayers))
416365

417366
def canUseAutoExtent(self):
418367
for param in self.parameters:
@@ -468,6 +417,57 @@ def addToRegion(self, layer, first):
468417
self.xmax = max(self.xmax, layer.extent().xMaximum())
469418
self.ymin = min(self.ymin, layer.extent().yMinimum())
470419
self.ymax = max(self.ymax, layer.extent().yMaximum())
420+
421+
def resolveTemporaryOutputs(self):
422+
"""Sets temporary outputs (output.value = None) with a
423+
temporary file instead.
424+
"""
425+
for out in self.outputs:
426+
if not out.hidden and out.value is None:
427+
setTempOutput(out, self)
428+
429+
def setOutputCRS(self):
430+
layers = dataobjects.getAllLayers()
431+
for param in self.parameters:
432+
if isinstance(param, (ParameterRaster, ParameterVector, ParameterMultipleInput)):
433+
if param.value:
434+
if isinstance(param, ParameterMultipleInput):
435+
inputlayers = param.value.split(';')
436+
else:
437+
inputlayers = [param.value]
438+
for inputlayer in inputlayers:
439+
for layer in layers:
440+
if layer.source() == inputlayer:
441+
self.crs = layer.crs()
442+
return
443+
p = dataobjects.getObjectFromUri(inputlayer)
444+
if p is not None:
445+
self.crs = p.crs()
446+
p = None
447+
return
448+
try:
449+
from qgis.utils import iface
450+
if iface is not None:
451+
self.crs = iface.mapCanvas().mapSettings().destinationCrs()
452+
except:
453+
pass
454+
455+
def resolveDataObjects(self):
456+
layers = dataobjects.getAllLayers()
457+
for param in self.parameters:
458+
if isinstance(param, (ParameterRaster, ParameterVector, ParameterTable,
459+
ParameterMultipleInput)):
460+
if param.value:
461+
if isinstance(param, ParameterMultipleInput):
462+
inputlayers = param.value.split(';')
463+
else:
464+
inputlayers = [param.value]
465+
for i, inputlayer in enumerate(inputlayers):
466+
for layer in layers:
467+
if layer.name() == inputlayer:
468+
inputlayers[i] = layer.source()
469+
break
470+
param.setValue(";".join(inputlayers))
471471

472472
def checkInputCRS(self):
473473
"""It checks that all input layers use the same CRS. If so,

‎python/plugins/processing/core/parameters.py

Lines changed: 89 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@
3030

3131
import sys
3232
import os
33-
import inspect
33+
from inspect import isclass
34+
from copy import deepcopy
35+
3436

3537
from qgis.PyQt.QtCore import QCoreApplication
3638
from qgis.core import QgsRasterLayer, QgsVectorLayer
@@ -52,7 +54,7 @@ def _splitParameterOptions(line):
5254
isOptional = False
5355
definition = tokens[1]
5456
return isOptional, tokens[0], definition
55-
57+
5658
def _createDescriptiveName(s):
5759
return s.replace('_', ' ')
5860

@@ -82,8 +84,8 @@ def __init__(self, name='', description='', default=None, optional=False,
8284
self.optional = parseBool(optional)
8385

8486
# TODO: make deep copy and deep update
85-
self.metadata = self.default_metadata.copy()
86-
self.metadata.update(metadata)
87+
self.metadata = deepcopy(self.default_metadata)
88+
self.metadata.update(deepcopy(metadata))
8789

8890
def setValue(self, obj):
8991
"""
@@ -133,7 +135,20 @@ def tr(self, string, context=''):
133135
if context == '':
134136
context = 'Parameter'
135137
return QCoreApplication.translate(context, string)
136-
138+
139+
def wrapper(self, dialog, row=0, col=0):
140+
wrapper = self.metadata.get('widget_wrapper', None)
141+
# wrapper metadata should be a class path
142+
if isinstance(wrapper, basestring):
143+
tokens = wrapper.split('.')
144+
mod = __import__('.'.join(tokens[:-1]), fromlist=[tokens[-1]])
145+
wrapper = getattr(mod, tokens[-1])
146+
# or directly a class object
147+
if isclass(wrapper):
148+
wrapper = wrapper(self, dialog, row, col)
149+
# or a wrapper instance
150+
return wrapper
151+
137152
class ParameterBoolean(Parameter):
138153

139154
default_metadata = {
@@ -162,7 +177,7 @@ def getAsScriptCode(self):
162177
param_type += 'optional '
163178
param_type += 'boolean '
164179
return '##' + self.name + '=' + param_type + str(self.default)
165-
180+
166181
@classmethod
167182
def fromScriptCode(self, line):
168183
isOptional, name, definition = _splitParameterOptions(line)
@@ -175,7 +190,7 @@ def fromScriptCode(self, line):
175190
param = ParameterBoolean(name, descName)
176191
param.optional = isOptional
177192
return param
178-
193+
179194

180195

181196
class ParameterCrs(Parameter):
@@ -236,9 +251,13 @@ def getValueAsCommandLineParameter(self):
236251

237252
class ParameterExtent(Parameter):
238253

254+
default_metadata = {
255+
'widget_wrapper': 'processing.gui.wrappers.ExtentWidgetWrapper'
256+
}
257+
239258
USE_MIN_COVERING_EXTENT = 'USE_MIN_COVERING_EXTENT'
240259

241-
def __init__(self, name='', description='', default=None, optional=False):
260+
def __init__(self, name='', description='', default=None, optional=True):
242261
Parameter.__init__(self, name, description, default, optional)
243262
# The value is a string in the form "xmin, xmax, ymin, ymax"
244263

@@ -271,7 +290,7 @@ def getAsScriptCode(self):
271290
param_type += 'optional '
272291
param_type += 'extent'
273292
return '##' + self.name + '=' + param_type
274-
293+
275294
@classmethod
276295
def fromScriptCode(self, line):
277296
isOptional, name, definition = _splitParameterOptions(line)
@@ -283,6 +302,10 @@ def fromScriptCode(self, line):
283302

284303
class ParameterPoint(Parameter):
285304

305+
default_metadata = {
306+
'widget_wrapper': 'processing.gui.wrappers.PointWidgetWrapper'
307+
}
308+
286309
def __init__(self, name='', description='', default=None, optional=False):
287310
Parameter.__init__(self, name, description, default, optional)
288311
# The value is a string in the form "x, y"
@@ -326,6 +349,10 @@ def fromScriptCode(self, line):
326349

327350
class ParameterFile(Parameter):
328351

352+
default_metadata = {
353+
'widget_wrapper': 'processing.gui.wrappers.FileWidgetWrapper'
354+
}
355+
329356
def __init__(self, name='', description='', isFolder=False, optional=True, ext=None):
330357
Parameter.__init__(self, name, description, None, parseBool(optional))
331358
self.ext = ext
@@ -371,6 +398,7 @@ def fromScriptCode(self, line):
371398

372399

373400
class ParameterFixedTable(Parameter):
401+
374402

375403
def __init__(self, name='', description='', numRows=3,
376404
cols=['value'], fixedNumOfRows=False, optional=False):
@@ -423,6 +451,11 @@ class ParameterMultipleInput(ParameterDataObject):
423451
Its value is a string with substrings separated by semicolons,
424452
each of which represents the data source location of each element.
425453
"""
454+
455+
default_metadata = {
456+
'widget_wrapper': 'processing.gui.wrappers.MultipleInputWidgetWrapper'
457+
}
458+
426459

427460
exported = None
428461

@@ -607,13 +640,18 @@ def fromScriptCode(self, line):
607640
descName = _createDescriptiveName(name)
608641
if definition.lower().strip() == 'multiple raster':
609642
return ParameterMultipleInput(name, descName,
610-
dataobjects.TYPE_RASTER, isOptional)
643+
dataobjects.TYPE_RASTER, isOptional)
611644
elif definition.lower().strip() == 'multiple vector':
612645
return ParameterMultipleInput(name, definition,
613646
dataobjects.TYPE_VECTOR_ANY, isOptional)
614-
647+
615648

616649
class ParameterNumber(Parameter):
650+
651+
default_metadata = {
652+
'widget_wrapper': 'processing.gui.wrappers.NumberWidgetWrapper'
653+
}
654+
617655

618656
def __init__(self, name='', description='', minValue=None, maxValue=None,
619657
default=None, optional=False):
@@ -716,6 +754,11 @@ def getValueAsCommandLineParameter(self):
716754

717755

718756
class ParameterRaster(ParameterDataObject):
757+
758+
default_metadata = {
759+
'widget_wrapper': 'processing.gui.wrappers.RasterWidgetWrapper'
760+
}
761+
719762

720763
def __init__(self, name='', description='', optional=False, showSublayersDialog=True):
721764
ParameterDataObject.__init__(self, name, description, None, optional)
@@ -787,6 +830,11 @@ def fromScriptCode(self, line):
787830
return ParameterRaster(name, descName, optional=isOptional)
788831

789832
class ParameterSelection(Parameter):
833+
834+
default_metadata = {
835+
'widget_wrapper': 'processing.gui.wrappers.SelectionWidgetWrapper'
836+
}
837+
790838

791839
def __init__(self, name='', description='', options=[], default=None, isSource=False,
792840
optional=False):
@@ -838,9 +886,14 @@ def fromScriptCode(self, line):
838886
elif definition.lower().strip().startswith('selection'):
839887
options = definition.strip()[len('selection '):].split(';')
840888
return ParameterSelection(name, descName, options, optional=isOptional)
841-
842-
889+
890+
843891
class ParameterString(Parameter):
892+
893+
default_metadata = {
894+
'widget_wrapper': 'processing.gui.wrappers.StringWidgetWrapper'
895+
}
896+
844897

845898
NEWLINE = '\n'
846899
ESCAPED_NEWLINE = '\\n'
@@ -894,6 +947,11 @@ def fromScriptCode(self, line):
894947
return ParameterString(name, descName, multiline=True, optional=isOptional)
895948

896949
class ParameterTable(ParameterDataObject):
950+
951+
default_metadata = {
952+
'widget_wrapper': 'processing.gui.wrappers.TableWidgetWrapper'
953+
}
954+
897955

898956
def __init__(self, name='', description='', optional=False):
899957
ParameterDataObject.__init__(self, name, description, None, optional)
@@ -976,11 +1034,13 @@ class ParameterTableField(Parameter):
9761034

9771035
"""A parameter representing a table field.
9781036
Its value is a string that represents the name of the field.
979-
980-
In a script you can use it with
981-
##Field=[optional] field [number|string] Parentinput
9821037
"""
9831038

1039+
default_metadata = {
1040+
'widget_wrapper': 'processing.gui.wrappers.TableFieldWidgetWrapper'
1041+
}
1042+
1043+
9841044
DATA_TYPE_NUMBER = 0
9851045
DATA_TYPE_STRING = 1
9861046
DATA_TYPE_ANY = -1
@@ -1040,10 +1100,10 @@ def fromScriptCode(self, line):
10401100
else:
10411101
parent = definition.strip()[len('field') + 1:]
10421102
datatype = ParameterTableField.DATA_TYPE_ANY
1043-
1103+
10441104
return ParameterTableField(name, descName, parent, datatype, isOptional)
1045-
1046-
1105+
1106+
10471107
class ParameterTableMultipleField(Parameter):
10481108

10491109
"""A parameter representing several table fields.
@@ -1129,6 +1189,11 @@ def fromScriptCode(self, line):
11291189

11301190

11311191
class ParameterVector(ParameterDataObject):
1192+
1193+
default_metadata = {
1194+
'widget_wrapper': 'processing.gui.wrappers.VectorWidgetWrapper'
1195+
}
1196+
11321197

11331198
def __init__(self, name='', description='', datatype=[-1],
11341199
optional=False):
@@ -1139,6 +1204,7 @@ def __init__(self, name='', description='', datatype=[-1],
11391204
datatype = [int(t) for t in datatype.split(',')]
11401205
self.datatype = datatype
11411206
self.exported = None
1207+
self.allowOnlyOpenedLayers = False
11421208

11431209
def setValue(self, obj):
11441210
self.exported = None
@@ -1260,20 +1326,20 @@ def setValue(self, value):
12601326
return True
12611327

12621328

1263-
paramClasses = [c for c in sys.modules[__name__].__dict__.values() if inspect.isclass(c) and issubclass(c, Parameter)]
1329+
paramClasses = [c for c in sys.modules[__name__].__dict__.values() if isclass(c) and issubclass(c, Parameter)]
12641330

12651331
def getParameterFromString(s):
12661332
print s
1267-
#Try the parameter definitions used in description files
1333+
# Try the parameter definitions used in description files
12681334
if '|' in s:
12691335
tokens = s.split("|")
12701336
params = [t if unicode(t) != unicode(None) else None for t in tokens[1:]]
12711337
clazz = getattr(sys.modules[__name__], tokens[0])
12721338
return clazz(*params)
1273-
else: #try script syntax
1339+
else: # try script syntax
12741340
for paramClass in paramClasses:
12751341
try:
1276-
param = paramClass.fromScriptCode(s)
1342+
param = paramClass.fromScriptCode(s)
12771343
if param is not None:
12781344
return param
12791345
except AttributeError:

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

Lines changed: 7 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,8 @@ def __init__(self, alg):
8585
self.cornerWidget.setLayout(layout)
8686
self.tabWidget.setCornerWidget(self.cornerWidget)
8787

88-
QgsMapLayerRegistry.instance().layerWasAdded.connect(self.mainWidget.layerAdded)
89-
QgsMapLayerRegistry.instance().layersWillBeRemoved.connect(self.mainWidget.layersWillBeRemoved)
88+
QgsMapLayerRegistry.instance().layerWasAdded.connect(self.mainWidget.layerRegistryChanged)
89+
QgsMapLayerRegistry.instance().layersWillBeRemoved.connect(self.mainWidget.layerRegistryChanged)
9090

9191
def runAsBatch(self):
9292
self.close()
@@ -101,17 +101,9 @@ def setParamValues(self):
101101
for param in params:
102102
if param.hidden:
103103
continue
104-
if isinstance(param, ParameterExtent):
105-
continue
106-
wrapper = self.mainWidget.widget_wrappers[param.name]
104+
wrapper = self.mainWidget.wrappers[param.name]
107105
if not self.setParamValue(param, wrapper):
108-
raise AlgorithmDialogBase.InvalidParameterValue(param, wrapper)
109-
110-
for param in params:
111-
if isinstance(param, ParameterExtent):
112-
wrapper = self.mainWidget.widget_wrappers[param.name]
113-
if not self.setParamValue(param, wrapper):
114-
raise AlgorithmDialogBase.InvalidParameterValue(param, wrapper)
106+
raise AlgorithmDialogBase.InvalidParameterValue(param, wrapper.widget)
115107

116108
for output in outputs:
117109
if output.hidden:
@@ -135,61 +127,7 @@ def evaluateExpression(self, text):
135127
return result
136128

137129
def setParamValue(self, param, wrapper, alg=None):
138-
if wrapper.implemented:
139-
return param.setValue(wrapper.value())
140-
141-
widget = wrapper.widget
142-
if isinstance(param, ParameterRaster):
143-
return param.setValue(widget.getValue())
144-
elif isinstance(param, (ParameterVector, ParameterTable)):
145-
try:
146-
return param.setValue(widget.itemData(widget.currentIndex()))
147-
except:
148-
return param.setValue(widget.getValue())
149-
elif isinstance(param, ParameterSelection):
150-
return param.setValue(widget.currentIndex())
151-
elif isinstance(param, ParameterFixedTable):
152-
return param.setValue(widget.table)
153-
elif isinstance(param, ParameterRange):
154-
return param.setValue(widget.getValue())
155-
elif isinstance(param, ParameterTableField):
156-
if param.optional and widget.currentIndex() == 0:
157-
return param.setValue(None)
158-
return param.setValue(widget.currentText())
159-
elif isinstance(param, ParameterTableMultipleField):
160-
if param.optional and len(list(widget.get_selected_items())) == 0:
161-
return param.setValue(None)
162-
return param.setValue(list(widget.get_selected_items()))
163-
elif isinstance(param, ParameterMultipleInput):
164-
if param.datatype == dataobjects.TYPE_FILE:
165-
return param.setValue(widget.selectedoptions)
166-
else:
167-
if param.datatype == dataobjects.TYPE_RASTER:
168-
options = dataobjects.getRasterLayers(sorting=False)
169-
elif param.datatype == dataobjects.TYPE_VECTOR_ANY:
170-
options = dataobjects.getVectorLayers(sorting=False)
171-
else:
172-
options = dataobjects.getVectorLayers([param.datatype], sorting=False)
173-
return param.setValue([options[i] for i in widget.selectedoptions])
174-
elif isinstance(param, (ParameterNumber, ParameterFile,
175-
ParameterExtent, ParameterPoint)):
176-
return param.setValue(widget.getValue())
177-
elif isinstance(param, ParameterString):
178-
if param.multiline:
179-
text = str(widget.toPlainText())
180-
else:
181-
text = widget.text()
182-
183-
if param.evaluateExpressions:
184-
try:
185-
text = self.evaluateExpression(text)
186-
except:
187-
pass
188-
return param.setValue(text)
189-
elif isinstance(param, ParameterGeometryPredicate):
190-
return param.setValue(widget.value())
191-
else:
192-
return param.setValue(str(widget.text()))
130+
return param.setValue(wrapper.value())
193131

194132
def accept(self):
195133
self.settings.setValue("/Processing/dialogBase", self.saveGeometry())
@@ -289,6 +227,6 @@ def finish(self):
289227
'\nOpen the results dialog to check it.'))
290228

291229
def closeEvent(self, evt):
292-
QgsMapLayerRegistry.instance().layerWasAdded.disconnect(self.mainWidget.layerAdded)
293-
QgsMapLayerRegistry.instance().layersWillBeRemoved.disconnect(self.mainWidget.layersWillBeRemoved)
230+
QgsMapLayerRegistry.instance().layerWasAdded.disconnect(self.mainWidget.layerRegistryChanged)
231+
QgsMapLayerRegistry.instance().layersWillBeRemoved.disconnect(self.mainWidget.layerRegistryChanged)
294232
super(AlgorithmDialog, self).closeEvent(evt)

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

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,10 @@
4545

4646
class BatchInputSelectionPanel(QWidget):
4747

48-
def __init__(self, param, row, col, panel):
48+
def __init__(self, param, row, col, dialog):
4949
super(BatchInputSelectionPanel, self).__init__(None)
5050
self.param = param
51-
self.panel = panel
52-
self.table = self.panel.tblParameters
51+
self.dialog = dialog
5352
self.row = row
5453
self.col = col
5554
self.horizontalLayout = QHBoxLayout(self)
@@ -67,6 +66,12 @@ def __init__(self, param, row, col, panel):
6766
self.horizontalLayout.addWidget(self.pushButton)
6867
self.setLayout(self.horizontalLayout)
6968

69+
def _panel(self):
70+
return self.dialog.mainDialog()
71+
72+
def _table(self):
73+
return self._panel().tblParameters
74+
7075
def showPopupMenu(self):
7176
popupmenu = QMenu()
7277

@@ -108,11 +113,11 @@ def showLayerSelectionDialog(self):
108113
if isinstance(self.param, ParameterMultipleInput):
109114
self.text.setText(';'.join(layers[idx].name() for idx in selected))
110115
else:
111-
rowdif = len(selected) - (self.table.rowCount() - self.row)
116+
rowdif = len(selected) - (self._table().rowCount() - self.row)
112117
for i in range(rowdif):
113-
self.panel.addRow()
118+
self._panel().addRow()
114119
for i, layeridx in enumerate(selected):
115-
self.table.cellWidget(i + self.row,
120+
self._table().cellWidget(i + self.row,
116121
self.col).setText(layers[layeridx].name())
117122

118123
def showFileSelectionDialog(self):
@@ -141,11 +146,11 @@ def showFileSelectionDialog(self):
141146
if isinstance(self.param, ParameterMultipleInput):
142147
self.text.setText(';'.join(str(f) for f in files))
143148
else:
144-
rowdif = len(files) - (self.table.rowCount() - self.row)
149+
rowdif = len(files) - (self._table().rowCount() - self.row)
145150
for i in range(rowdif):
146-
self.panel.addRow()
151+
self._panel().addRow()
147152
for i, f in enumerate(files):
148-
self.table.cellWidget(i + self.row,
153+
self._table().cellWidget(i + self.row,
149154
self.col).setText(f)
150155

151156
def setText(self, text):

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

Lines changed: 20 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,7 @@
3636

3737
from qgis.core import QgsApplication
3838

39-
from processing.gui.wrappers import (
40-
DIALOG_BATCH,
41-
wrapper_from_param,
42-
NotYetImplementedWidgetWrapper,
43-
)
39+
from processing.gui.wrappers import NotYetImplementedWidgetWrapper
4440

4541
from processing.gui.FileSelectionPanel import FileSelectionPanel
4642
from processing.gui.CrsSelectionPanel import CrsSelectionPanel
@@ -77,7 +73,7 @@ def __init__(self, parent, alg):
7773
super(BatchPanel, self).__init__(None)
7874
self.setupUi(self)
7975

80-
self.widget_wrappers = []
76+
self.wrappers = []
8177

8278
self.btnAdvanced.hide()
8379

@@ -148,45 +144,15 @@ def initWidgets(self):
148144
self.tblParameters.horizontalHeader().setStretchLastSection(True)
149145

150146
def getWidgetWrapperFromParameter(self, param, row, col):
151-
wrapper = wrapper_from_param(param) # , DIALOG_BATCH)
152-
if wrapper is not None:
153-
return wrapper
147+
return param.wrapper(self.parent, row, col)
154148

155-
widget = self.getWidgetFromParameter(param, row, col)
156-
wrapper = NotYetImplementedWidgetWrapper(param, widget)
157-
return wrapper
158149

159150
def getWidgetFromParameter(self, param, row, col):
160-
if isinstance(param, (ParameterRaster, ParameterVector, ParameterTable,
161-
ParameterMultipleInput)):
162-
item = BatchInputSelectionPanel(param, row, col, self)
163-
elif isinstance(param, ParameterSelection):
164-
item = QComboBox()
165-
item.addItems(param.options)
166-
elif isinstance(param, ParameterFixedTable):
167-
item = FixedTablePanel(param)
168-
elif isinstance(param, ParameterExtent):
169-
item = ExtentSelectionPanel(self.parent, self.alg, param.default)
170-
elif isinstance(param, ParameterPoint):
171-
item = PointSelectionPanel(self.parent, param.default)
172-
elif isinstance(param, ParameterCrs):
173-
item = CrsSelectionPanel(param.default)
174-
elif isinstance(param, ParameterFile):
175-
item = FileSelectionPanel(param.isFolder)
176-
elif isinstance(param, ParameterGeometryPredicate):
151+
if isinstance(param, ParameterGeometryPredicate):
177152
item = GeometryPredicateSelectionPanel(param.enabledPredicates, rows=1)
178153
width = max(self.tblParameters.columnWidth(col),
179154
item.sizeHint().width())
180155
self.tblParameters.setColumnWidth(col, width)
181-
else:
182-
item = QLineEdit()
183-
if param.default is not None:
184-
try:
185-
item.setText(str(param.default))
186-
except:
187-
pass
188-
189-
return item
190156

191157
def load(self):
192158
filename, selected_filter = QFileDialog.getOpenFileName(self,
@@ -211,8 +177,8 @@ def load(self):
211177
continue
212178
if param.name in params:
213179
value = params[param.name]
214-
wrapper = self.widget_wrappers[row][column]
215-
self.setValueInWidgetWrapper(wrapper, value)
180+
wrapper = self.wrappers[row][column]
181+
wrapper.setValue(value)
216182
column += 1
217183

218184
for out in self.alg.outputs:
@@ -221,7 +187,7 @@ def load(self):
221187
if out.name in outputs:
222188
value = outputs[out.name]
223189
widget = self.tblParameters.cellWidget(row, column)
224-
self.setValueInWidget(widget, value)
190+
widget.setValue(value)
225191
column += 1
226192
except TypeError:
227193
QMessageBox.critical(
@@ -235,22 +201,14 @@ def setValueInWidgetWrapper(self, wrapper, value):
235201
self.setValueInWidget(wrapper.widget, value)
236202

237203
def setValueInWidget(self, widget, value):
238-
if isinstance(widget, (BatchInputSelectionPanel, QLineEdit, FileSelectionPanel)):
239-
widget.setText(str(value))
240-
elif isinstance(widget, (BatchOutputSelectionPanel, GeometryPredicateSelectionPanel)):
241-
widget.setValue(str(value))
242-
243-
elif isinstance(widget, QComboBox):
244-
idx = widget.findText(str(value))
245-
if idx != -1:
246-
widget.setCurrentIndex(idx)
204+
if isinstance(widget, (BatchOutputSelectionPanel, GeometryPredicateSelectionPanel)):
205+
widget.setValue(unicode(value))
247206
elif isinstance(widget, ExtentSelectionPanel):
248207
if value is not None:
249208
widget.setExtentFromString(value)
250209
else:
251210
widget.setExtentFromString('')
252-
elif isinstance(widget, CrsSelectionPanel):
253-
widget.setAuthId(value)
211+
254212

255213
def save(self):
256214
toSave = []
@@ -265,7 +223,7 @@ def save(self):
265223
if isinstance(param, ParameterExtent):
266224
col += 1
267225
continue
268-
wrapper = self.widget_wrappers[row][col]
226+
wrapper = self.wrappers[row][col]
269227
if not self.setParamValue(param, wrapper, alg):
270228
self.parent.lblProgress.setText(
271229
self.tr('<b>Missing parameter value: %s (row %d)</b>') % (param.description, row + 1))
@@ -277,7 +235,7 @@ def save(self):
277235
if param.hidden:
278236
continue
279237
if isinstance(param, ParameterExtent):
280-
wrapper = self.widget_wrappers[row][col]
238+
wrapper = self.wrappers[row][col]
281239
if not self.setParamValue(param, wrapper, alg):
282240
self.parent.lblProgress.setText(
283241
self.tr('<b>Missing parameter value: %s (row %d)</b>') % (param.description, row + 1))
@@ -313,29 +271,17 @@ def setParamValue(self, param, wrapper, alg=None):
313271
return param.setValue(wrapper.value())
314272

315273
widget = wrapper.widget
316-
if isinstance(param, (ParameterRaster, ParameterVector, ParameterTable,
317-
ParameterMultipleInput)):
318-
value = widget.getText()
319-
if str(value).strip() == '':
320-
value = None
321-
return param.setValue(value)
322-
elif isinstance(param, ParameterSelection):
323-
return param.setValue(widget.currentIndex())
324-
elif isinstance(param, ParameterFixedTable):
325-
return param.setValue(widget.table)
326-
elif isinstance(param, ParameterExtent):
274+
if isinstance(param, ParameterExtent):
327275
if alg is not None:
328276
widget.useNewAlg(alg)
329277
return param.setValue(widget.getValue())
330-
elif isinstance(param, (ParameterCrs, ParameterFile)):
331-
return param.setValue(widget.getValue())
332278
elif isinstance(param, ParameterGeometryPredicate):
333279
return param.setValue(widget.value())
334280
else:
335281
return param.setValue(widget.text())
336282

337283
def setCellWrapper(self, row, column, wrapper):
338-
self.widget_wrappers[row][column] = wrapper
284+
self.wrappers[row][column] = wrapper
339285
self.tblParameters.setCellWidget(row, column, wrapper.widget)
340286

341287
def addRow(self):
@@ -369,12 +315,12 @@ def addRow(self):
369315
self.tblParameters.setCellWidget(row, column, item)
370316

371317
def removeRows(self):
372-
#~ self.tblParameters.setUpdatesEnabled(False)
373-
#~ indexes = self.tblParameters.selectionModel().selectedIndexes()
374-
#~ indexes.sort()
375-
#~ for i in reversed(indexes):
376-
#~ self.tblParameters.model().removeRow(i.row())
377-
#~ self.tblParameters.setUpdatesEnabled(True)
318+
# ~ self.tblParameters.setUpdatesEnabled(False)
319+
# ~ indexes = self.tblParameters.selectionModel().selectedIndexes()
320+
# ~ indexes.sort()
321+
# ~ for i in reversed(indexes):
322+
# ~ self.tblParameters.model().removeRow(i.row())
323+
# ~ self.tblParameters.setUpdatesEnabled(True)
378324
if self.tblParameters.rowCount() > 2:
379325
self.widget_wrappers.pop()
380326
self.tblParameters.setRowCount(self.tblParameters.rowCount() - 1)

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

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,13 @@
5050

5151
class ExtentSelectionPanel(BASE, WIDGET):
5252

53-
def __init__(self, dialog, alg, default=None):
53+
def __init__(self, dialog, param):
5454
super(ExtentSelectionPanel, self).__init__(None)
5555
self.setupUi(self)
5656

5757
self.dialog = dialog
58-
self.alg = alg
59-
if alg.canUseAutoExtent():
58+
self.param = param
59+
if self.param.optional:
6060
if hasattr(self.leText, 'setPlaceholderText'):
6161
self.leText.setPlaceholderText(
6262
self.tr('[Leave blank to use min covering extent]'))
@@ -68,18 +68,19 @@ def __init__(self, dialog, alg, default=None):
6868
self.tool = RectangleMapTool(canvas)
6969
self.tool.rectangleCreated.connect(self.updateExtent)
7070

71-
if default:
72-
tokens = str(default).split(',')
71+
if param.default:
72+
tokens = param.default.split(',')
7373
if len(tokens) == 4:
7474
try:
7575
float(tokens[0])
7676
float(tokens[1])
7777
float(tokens[2])
7878
float(tokens[3])
79-
self.leText.setText(str(default))
79+
self.leText.setText(param.default)
8080
except:
8181
pass
8282

83+
8384
def selectExtent(self):
8485
popupmenu = QMenu()
8586
useLayerExtentAction = QAction(
@@ -93,7 +94,7 @@ def selectExtent(self):
9394
selectOnCanvasAction.triggered.connect(self.selectOnCanvas)
9495
useLayerExtentAction.triggered.connect(self.useLayerExtent)
9596

96-
if self.canUseAutoExtent():
97+
if self.param.optional:
9798
useMincoveringExtentAction = QAction(
9899
self.tr('Use min covering extent from input layers'),
99100
self.btnSelect)
@@ -153,9 +154,10 @@ def setValueFromRect(self, r):
153154
self.dialog.activateWindow()
154155

155156
def getValue(self):
156-
if str(self.leText.text()).strip() == '':
157+
if str(self.leText.text()).strip() != '':
158+
return str(self.leText.text())
159+
else:
157160
return None
158-
return str(self.leText.text())
159161

160162
def setExtentFromString(self, s):
161163
self.leText.setText(s)

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ def __init__(self, number, minimum, maximum, isInteger):
6262
if self.isInteger:
6363
self.spnValue.setDecimals(0)
6464
else:
65-
#Guess reasonable step value
65+
# Guess reasonable step value
6666
if (maximum == 0 or maximum) and (minimum == 0 or minimum):
6767
self.spnValue.setSingleStep(self.calculateStep(minimum, maximum))
6868

@@ -75,7 +75,7 @@ def __init__(self, number, minimum, maximum, isInteger):
7575
else:
7676
self.spnValue.setMinimum(-99999999)
7777

78-
#Set default value
78+
# Set default value
7979
if number == 0 or number:
8080
self.spnValue.setValue(float(number))
8181
self.spnValue.setClearValue(float(number))
@@ -149,6 +149,9 @@ def expressionContext(self):
149149
def getValue(self):
150150
return self.spnValue.value()
151151

152+
def setValue(self, value):
153+
self.spnValue.setValue(value)
154+
152155
def calculateStep(self, minimum, maximum):
153156
valueRange = maximum - minimum
154157
if valueRange <= 1.0:

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

Lines changed: 26 additions & 316 deletions
Large diffs are not rendered by default.

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

Lines changed: 679 additions & 37 deletions
Large diffs are not rendered by default.

‎python/plugins/processing/modeler/ModelerParametersDialog.py

Lines changed: 13 additions & 388 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)
Please sign in to comment.