Skip to content

Commit fcc3437

Browse files
committed
[processing] some fixes and changes in parameters and parameters panel
1 parent a17facf commit fcc3437

File tree

8 files changed

+87
-103
lines changed

8 files changed

+87
-103
lines changed

python/plugins/processing/algs/gdal/GdalAlgorithmDialog.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@ def __init__(self, parent, alg):
7878
self.parametersHaveChanged()
7979

8080
def connectParameterSignals(self):
81-
for w in list(self.widgets.values()):
81+
for wrapper in list(self.wrappers.values()):
82+
w = wrapper.widget
8283
if isinstance(w, QLineEdit):
8384
w.textChanged.connect(self.parametersHaveChanged)
8485
elif isinstance(w, QComboBox):

python/plugins/processing/core/GeoAlgorithm.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,6 @@
1616
* *
1717
***************************************************************************
1818
"""
19-
from builtins import str
20-
from builtins import object
21-
2219

2320
__author__ = 'Victor Olaya'
2421
__date__ = 'August 2012'
@@ -38,6 +35,9 @@
3835

3936
from qgis.core import QgsVectorLayer, QgsRasterLayer
4037

38+
from builtins import str
39+
from builtins import object
40+
from processing.gui.ParametersPanel import ParametersPanel
4141
from processing.core.ProcessingLog import ProcessingLog
4242
from processing.core.ProcessingConfig import ProcessingConfig
4343
from processing.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
@@ -46,10 +46,8 @@
4646
from processing.core.outputs import OutputVector, OutputRaster, OutputTable, OutputHTML, Output
4747
from processing.algs.gdal.GdalUtils import GdalUtils
4848
from processing.tools import dataobjects, vector
49-
from processing.tools.system import setTempOutput
5049
from processing.algs.help import shortHelp
5150

52-
5351
class GeoAlgorithm(object):
5452

5553
def __init__(self):
@@ -134,6 +132,10 @@ def defineCharacteristics(self):
134132
"""
135133
pass
136134

135+
136+
def getParametersPanel(self, parent):
137+
return ParametersPanel(parent, self)
138+
137139
def getCustomParametersDialog(self):
138140
"""If the algorithm has a custom parameters dialog, it should
139141
be returned here, ready to be executed.
@@ -183,6 +185,12 @@ def checkParameterValuesBeforeExecuting(self):
183185
calling from the console.
184186
"""
185187
return None
188+
189+
def processBeforeAddingToModeler(self, alg, model):
190+
"""Add here any task that has to be performed before adding an algorithm
191+
to a model, such as changing the value of a parameter depending on value
192+
of another one"""
193+
pass
186194

187195
# =========================================================
188196

python/plugins/processing/core/parameters.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,6 @@ def __init__(self, name='', description='', default=None, optional=False,
123123

124124
self.optional = parseBool(optional)
125125

126-
# TODO: make deep copy and deep update
127126
self.metadata = deepcopy(self.default_metadata)
128127
self.metadata.update(deepcopy(metadata))
129128

@@ -179,7 +178,7 @@ def tr(self, string, context=''):
179178
def wrapper(self, dialog, row=0, col=0):
180179
wrapper = self.metadata.get('widget_wrapper', None)
181180
# wrapper metadata should be a class path
182-
if isinstance(wrapper, str):
181+
if isinstance(wrapper, basestring):
183182
tokens = wrapper.split('.')
184183
mod = __import__('.'.join(tokens[:-1]), fromlist=[tokens[-1]])
185184
wrapper = getattr(mod, tokens[-1])
@@ -362,7 +361,10 @@ def setValue(self, value):
362361
return False
363362

364363
def getValueAsCommandLineParameter(self):
365-
return '"' + str(self.value) + '"'
364+
if self.value is not None:
365+
return '"' + str(self.value) + '"'
366+
else:
367+
return str(None)
366368

367369
def getAsScriptCode(self):
368370
param_type = ''
@@ -582,8 +584,8 @@ class ParameterMultipleInput(ParameterDataObject):
582584

583585
exported = None
584586

585-
def __init__(self, name='', description='', datatype=-1, optional=False):
586-
ParameterDataObject.__init__(self, name, description, None, optional)
587+
def __init__(self, name='', description='', datatype=-1, optional=False, metadata={}):
588+
ParameterDataObject.__init__(self, name, description, None, optional, metadata=metadata)
587589
self.datatype = int(float(datatype))
588590
self.exported = None
589591
self.minNumInputs = 0
@@ -1133,8 +1135,8 @@ class ParameterString(Parameter):
11331135
ESCAPED_NEWLINE = '\\n'
11341136

11351137
def __init__(self, name='', description='', default=None, multiline=False,
1136-
optional=False, evaluateExpressions=False):
1137-
Parameter.__init__(self, name, description, default, optional)
1138+
optional=False, evaluateExpressions=False, metadata={}):
1139+
Parameter.__init__(self, name, description, default, optional, metadata)
11381140
self.multiline = parseBool(multiline)
11391141
self.evaluateExpressions = parseBool(evaluateExpressions)
11401142

python/plugins/processing/gui/AlgorithmDialog.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@
3939
from processing.core.ProcessingConfig import ProcessingConfig
4040

4141
from processing.gui.BatchAlgorithmDialog import BatchAlgorithmDialog
42-
from processing.gui.ParametersPanel import ParametersPanel
4342
from processing.gui.AlgorithmDialogBase import AlgorithmDialogBase
4443
from processing.gui.AlgorithmExecutor import runalg, runalgIterating
4544
from processing.gui.Postprocessing import handleAlgorithmResults
@@ -63,7 +62,7 @@ def __init__(self, alg):
6362

6463
self.alg = alg
6564

66-
self.setMainWidget(ParametersPanel(self, alg))
65+
self.setMainWidget(alg.getParametersPanel(self))
6766

6867
self.bar = QgsMessageBar()
6968
self.bar.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed)
@@ -99,14 +98,17 @@ def setParamValues(self):
9998
for output in outputs:
10099
if output.hidden:
101100
continue
102-
output.value = self.mainWidget.valueItems[output.name].getValue()
101+
output.value = self.mainWidget.outputWidgets[output.name].getValue()
103102
if isinstance(output, (OutputRaster, OutputVector, OutputTable)):
104103
output.open = self.mainWidget.checkBoxes[output.name].isChecked()
105104

106105
return True
107106

108-
def setParamValue(self, param, wrapper, alg=None):
109-
return param.setValue(wrapper.value())
107+
def setParamValue(self, param, wrapper):
108+
if wrapper.widget:
109+
return param.setValue(wrapper.value())
110+
else:
111+
return True
110112

111113
def checkExtentCRS(self):
112114
unmatchingCRS = False
@@ -131,7 +133,7 @@ def checkExtentCRS(self):
131133
if p.crs() != projectCRS:
132134
unmatchingCRS = True
133135
if isinstance(param, ParameterExtent):
134-
value = self.mainWidget.valueItems[param.name].leText.text().strip()
136+
value = self.mainWidget.wrappers[param.name].widget.leText.text().strip()
135137
if value:
136138
hasExtent = True
137139

python/plugins/processing/gui/ExtentSelectionPanel.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ def __init__(self, dialog, param):
5959
if self.param.optional:
6060
if hasattr(self.leText, 'setPlaceholderText'):
6161
self.leText.setPlaceholderText(
62-
self.tr('[Use "auto" to use min covering extent]'))
62+
self.tr('[Leave blank to use min covering extent]'))
6363

6464
self.btnSelect.clicked.connect(self.selectExtent)
6565

@@ -104,7 +104,7 @@ def selectExtent(self):
104104
popupmenu.exec_(QCursor.pos())
105105

106106
def useMinCoveringExtent(self):
107-
self.leText.setText('auto')
107+
self.leText.setText('')
108108

109109
def useLayerExtent(self):
110110
CANVAS_KEY = 'Use canvas extent'

python/plugins/processing/gui/ParametersPanel.py

Lines changed: 33 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,9 @@ def __init__(self, parent, alg):
6767

6868
self.parent = parent
6969
self.alg = alg
70-
self.valueItems = {}
7170
self.wrappers = {}
71+
self.outputWidgets = {}
7272
self.labels = {}
73-
self.widgets = {}
7473
self.checkBoxes = {}
7574
self.dependentItems = {}
7675
self.iterateButtons = {}
@@ -102,41 +101,39 @@ def initWidgets(self):
102101

103102
wrapper = self.getWidgetWrapperFromParameter(param)
104103
self.wrappers[param.name] = wrapper
105-
self.valueItems[param.name] = wrapper.widget
106104
widget = wrapper.widget
107105

108-
if isinstance(param, ParameterVector):
109-
layout = QHBoxLayout()
110-
layout.setSpacing(2)
111-
layout.setMargin(0)
112-
layout.addWidget(widget)
113-
button = QToolButton()
114-
icon = QIcon(os.path.join(pluginPath, 'images', 'iterate.png'))
115-
button.setIcon(icon)
116-
button.setToolTip(self.tr('Iterate over this layer'))
117-
button.setCheckable(True)
118-
layout.addWidget(button)
119-
self.iterateButtons[param.name] = button
120-
button.toggled.connect(self.buttonToggled)
121-
widget = QWidget()
122-
widget.setLayout(layout)
123-
124-
tooltips = self.alg.getParameterDescriptions()
125-
widget.setToolTip(tooltips.get(param.name, param.description))
126-
127-
label = QLabel(desc)
128-
# label.setToolTip(tooltip)
129-
self.labels[param.name] = label
130-
if param.isAdvanced:
131-
self.layoutAdvanced.addWidget(label)
132-
self.layoutAdvanced.addWidget(widget)
133-
else:
134-
self.layoutMain.insertWidget(
135-
self.layoutMain.count() - 2, label)
136-
self.layoutMain.insertWidget(
137-
self.layoutMain.count() - 2, widget)
138-
139-
self.widgets[param.name] = widget
106+
if widget is not None:
107+
if isinstance(param, ParameterVector):
108+
layout = QHBoxLayout()
109+
layout.setSpacing(2)
110+
layout.setMargin(0)
111+
layout.addWidget(widget)
112+
button = QToolButton()
113+
icon = QIcon(os.path.join(pluginPath, 'images', 'iterate.png'))
114+
button.setIcon(icon)
115+
button.setToolTip(self.tr('Iterate over this layer'))
116+
button.setCheckable(True)
117+
layout.addWidget(button)
118+
self.iterateButtons[param.name] = button
119+
button.toggled.connect(self.buttonToggled)
120+
widget = QWidget()
121+
widget.setLayout(layout)
122+
123+
tooltips = self.alg.getParameterDescriptions()
124+
widget.setToolTip(tooltips.get(param.name, param.description))
125+
126+
label = QLabel(desc)
127+
# label.setToolTip(tooltip)
128+
self.labels[param.name] = label
129+
if param.isAdvanced:
130+
self.layoutAdvanced.addWidget(label)
131+
self.layoutAdvanced.addWidget(widget)
132+
else:
133+
self.layoutMain.insertWidget(
134+
self.layoutMain.count() - 2, label)
135+
self.layoutMain.insertWidget(
136+
self.layoutMain.count() - 2, widget)
140137

141138
for output in self.alg.outputs:
142139
if output.hidden:
@@ -152,8 +149,7 @@ def initWidgets(self):
152149
check.setChecked(True)
153150
self.layoutMain.insertWidget(self.layoutMain.count() - 1, check)
154151
self.checkBoxes[output.name] = check
155-
self.valueItems[output.name] = widget
156-
152+
self.outputWidgets[output.name] = widget
157153
for wrapper in list(self.wrappers.values()):
158154
wrapper.postInitialize(list(self.wrappers.values()))
159155

python/plugins/processing/gui/wrappers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -831,7 +831,7 @@ def value(self):
831831
else:
832832
text = self.widget.getValue()
833833
return text
834-
if self.dialogType == DIALOG_BATCH:
834+
elif self.dialogType == DIALOG_BATCH:
835835
return self.widget.text()
836836
else:
837837
if self.param.multiline:

python/plugins/processing/modeler/ModelerParametersDialog.py

Lines changed: 19 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -146,20 +146,21 @@ def setupUi(self):
146146
self.wrappers[param.name] = wrapper
147147

148148
widget = wrapper.widget
149-
self.valueItems[param.name] = widget
150-
if param.name in list(tooltips.keys()):
151-
tooltip = tooltips[param.name]
152-
else:
153-
tooltip = param.description
154-
label.setToolTip(tooltip)
155-
widget.setToolTip(tooltip)
156-
if param.isAdvanced:
157-
label.setVisible(self.showAdvanced)
158-
widget.setVisible(self.showAdvanced)
159-
self.widgets[param.name] = widget
160-
161-
self.verticalLayout.addWidget(label)
162-
self.verticalLayout.addWidget(widget)
149+
if widget:
150+
self.valueItems[param.name] = widget
151+
if param.name in list(tooltips.keys()):
152+
tooltip = tooltips[param.name]
153+
else:
154+
tooltip = param.description
155+
label.setToolTip(tooltip)
156+
widget.setToolTip(tooltip)
157+
if param.isAdvanced:
158+
label.setVisible(self.showAdvanced)
159+
widget.setVisible(self.showAdvanced)
160+
self.widgets[param.name] = widget
161+
162+
self.verticalLayout.addWidget(label)
163+
self.verticalLayout.addWidget(widget)
163164

164165
for output in self._alg.outputs:
165166
if output.hidden:
@@ -301,34 +302,6 @@ def resolveValueDescription(self, value):
301302
alg = self.model.algs[value.alg]
302303
return self.tr("'%s' from algorithm '%s'") % (alg.algorithm.getOutputFromName(value.output).description, alg.description)
303304

304-
def setTableContent(self):
305-
params = self._alg.parameters
306-
outputs = self._alg.outputs
307-
visibleParams = [p for p in params if not p.hidden]
308-
visibleOutputs = [p for o in outputs if not o.hidden]
309-
self.tableWidget.setRowCount(len(visibleParams) + len(visibleOutputs))
310-
311-
for i, param in visibleParams:
312-
item = QTableWidgetItem(param.description)
313-
item.setFlags(Qt.ItemIsEnabled)
314-
self.tableWidget.setItem(i, 0, item)
315-
item = self.getWidgetFromParameter(param)
316-
self.valueItems[param.name] = item
317-
self.tableWidget.setCellWidget(i, 1, item)
318-
self.tableWidget.setRowHeight(i, 22)
319-
320-
for i, output in visibleOutputs:
321-
item = QTableWidgetItem(output.description + '<'
322-
+ output.__module__.split('.')[-1] + '>')
323-
item.setFlags(Qt.ItemIsEnabled)
324-
self.tableWidget.setItem(i, 0, item)
325-
item = QLineEdit()
326-
if hasattr(item, 'setPlaceholderText'):
327-
item.setPlaceholderText(ModelerParametersDialog.ENTER_NAME)
328-
self.valueItems[output.name] = item
329-
self.tableWidget.setCellWidget(i, 1, item)
330-
self.tableWidget.setRowHeight(i, 22)
331-
332305
def setPreviousValues(self):
333306
if self._algName is not None:
334307
alg = self.model.algs[self._algName]
@@ -376,12 +349,14 @@ def createAlgorithm(self):
376349
for selected in selectedOptions:
377350
alg.dependencies.append(availableDependencies[selected].name)
378351

352+
self._alg.processBeforeAddingToModeler(alg, self.model)
379353
return alg
380354

381355
def setParamValue(self, alg, param, wrapper):
382356
try:
383-
value = wrapper.value()
384-
alg.params[param.name] = value
357+
if wrapper.widget:
358+
value = wrapper.value()
359+
alg.params[param.name] = value
385360
return True
386361
except InvalidParameterValue:
387362
return False

0 commit comments

Comments
 (0)