Skip to content

Commit f9f9859

Browse files
committed
Draw links between dependent parameters in graphical modeler
Fix #12907
1 parent f4d703b commit f9f9859

File tree

3 files changed

+34
-2
lines changed

3 files changed

+34
-2
lines changed

python/plugins/processing/modeler/ModelerArrowItem.py

+13-1
Original file line numberDiff line numberDiff line change
@@ -70,11 +70,23 @@ def __init__(self, startItem, startIndex, endItem, endIndex,
7070
Qt.RoundCap, Qt.RoundJoin))
7171
self.setZValue(0)
7272

73+
def setPenStyle(self, style):
74+
pen = self.pen()
75+
pen.setStyle(style)
76+
self.setPen(pen)
77+
self.update()
78+
7379
def updatePath(self):
7480
self.endPoints = []
7581
controlPoints = []
7682
endPt = self.endItem.getLinkPointForParameter(self.endIndex)
77-
startPt = self.startItem.getLinkPointForOutput(self.startIndex)
83+
if isinstance(self.startItem.element, QgsProcessingModelAlgorithm.ModelParameter):
84+
startPt = self.startItem.getLinkPointForParameter(self.startIndex)
85+
else:
86+
startPt = self.startItem.getLinkPointForOutput(self.startIndex)
87+
if isinstance(self.endItem.element, QgsProcessingModelAlgorithm.ModelParameter):
88+
endPt = self.endItem.getLinkPointForParameter(self.startIndex)
89+
7890
if isinstance(self.startItem.element, QgsProcessingModelAlgorithm.ChildAlgorithm):
7991
if self.startIndex != -1:
8092
controlPoints.append(self.startItem.pos() + startPt)

python/plugins/processing/modeler/ModelerGraphicItem.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ def editElement(self):
199199
self.element.setDescription(dlg.param.name())
200200
self.model.addModelParameter(dlg.param, self.element)
201201
self.text = dlg.param.description()
202-
self.update()
202+
self.scene.dialog.repaintModel()
203203
elif isinstance(self.element, QgsProcessingModelAlgorithm.ChildAlgorithm):
204204
dlg = None
205205
try:
@@ -336,6 +336,9 @@ def getLinkPointForParameter(self, paramIndex):
336336
if isinstance(self.element, QgsProcessingModelAlgorithm.ChildAlgorithm) and self.element.parametersCollapsed():
337337
paramIndex = -1
338338
offsetX = 17
339+
if isinstance(self.element, QgsProcessingModelAlgorithm.ModelParameter):
340+
paramIndex = -1
341+
offsetX = 0
339342
font = QFont('Verdana', 8)
340343
font.setPixelSize(12)
341344
fm = QFontMetricsF(font)

python/plugins/processing/modeler/ModelerScene.py

+17
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,22 @@ def paintModel(self, model, controls=True):
9494
item.setPos(inp.position().x(), inp.position().y())
9595
self.paramItems[inp.parameterName()] = item
9696

97+
# Input dependency arrows
98+
for input_name in list(model.parameterComponents().keys()):
99+
idx = 0
100+
parameter_def = model.parameterDefinition(input_name)
101+
if hasattr(parameter_def, 'parentLayerParameter') and parameter_def.parentLayerParameter():
102+
parent_name = parameter_def.parentLayerParameter()
103+
if input_name in self.paramItems and parent_name in self.paramItems:
104+
input_item = self.paramItems[input_name]
105+
parent_item = self.paramItems[parent_name]
106+
arrow = ModelerArrowItem(parent_item, -1, input_item, -1)
107+
input_item.addArrow(arrow)
108+
parent_item.addArrow(arrow)
109+
arrow.setPenStyle(Qt.DotLine)
110+
arrow.updatePath()
111+
self.addItem(arrow)
112+
97113
# We add the algs
98114
for alg in list(model.childAlgorithms().values()):
99115
item = ModelerGraphicItem(alg, model, controls, scene=self)
@@ -104,6 +120,7 @@ def paintModel(self, model, controls=True):
104120
self.algItems[alg.childId()] = item
105121

106122
# And then the arrows
123+
107124
for alg in list(model.childAlgorithms().values()):
108125
idx = 0
109126
for parameter in alg.algorithm().parameterDefinitions():

0 commit comments

Comments
 (0)