Draw links between dependent parameters in graphical modeler

Fix #12907
This commit is contained in:
Nyall Dawson 2017-06-29 11:37:08 +10:00
parent f4d703bd38
commit f9f98593e0
3 changed files with 34 additions and 2 deletions

View File

@ -70,11 +70,23 @@ class ModelerArrowItem(QGraphicsPathItem):
Qt.RoundCap, Qt.RoundJoin))
self.setZValue(0)
def setPenStyle(self, style):
pen = self.pen()
pen.setStyle(style)
self.setPen(pen)
self.update()
def updatePath(self):
self.endPoints = []
controlPoints = []
endPt = self.endItem.getLinkPointForParameter(self.endIndex)
startPt = self.startItem.getLinkPointForOutput(self.startIndex)
if isinstance(self.startItem.element, QgsProcessingModelAlgorithm.ModelParameter):
startPt = self.startItem.getLinkPointForParameter(self.startIndex)
else:
startPt = self.startItem.getLinkPointForOutput(self.startIndex)
if isinstance(self.endItem.element, QgsProcessingModelAlgorithm.ModelParameter):
endPt = self.endItem.getLinkPointForParameter(self.startIndex)
if isinstance(self.startItem.element, QgsProcessingModelAlgorithm.ChildAlgorithm):
if self.startIndex != -1:
controlPoints.append(self.startItem.pos() + startPt)

View File

@ -199,7 +199,7 @@ class ModelerGraphicItem(QGraphicsItem):
self.element.setDescription(dlg.param.name())
self.model.addModelParameter(dlg.param, self.element)
self.text = dlg.param.description()
self.update()
self.scene.dialog.repaintModel()
elif isinstance(self.element, QgsProcessingModelAlgorithm.ChildAlgorithm):
dlg = None
try:
@ -336,6 +336,9 @@ class ModelerGraphicItem(QGraphicsItem):
if isinstance(self.element, QgsProcessingModelAlgorithm.ChildAlgorithm) and self.element.parametersCollapsed():
paramIndex = -1
offsetX = 17
if isinstance(self.element, QgsProcessingModelAlgorithm.ModelParameter):
paramIndex = -1
offsetX = 0
font = QFont('Verdana', 8)
font.setPixelSize(12)
fm = QFontMetricsF(font)

View File

@ -94,6 +94,22 @@ class ModelerScene(QGraphicsScene):
item.setPos(inp.position().x(), inp.position().y())
self.paramItems[inp.parameterName()] = item
# Input dependency arrows
for input_name in list(model.parameterComponents().keys()):
idx = 0
parameter_def = model.parameterDefinition(input_name)
if hasattr(parameter_def, 'parentLayerParameter') and parameter_def.parentLayerParameter():
parent_name = parameter_def.parentLayerParameter()
if input_name in self.paramItems and parent_name in self.paramItems:
input_item = self.paramItems[input_name]
parent_item = self.paramItems[parent_name]
arrow = ModelerArrowItem(parent_item, -1, input_item, -1)
input_item.addArrow(arrow)
parent_item.addArrow(arrow)
arrow.setPenStyle(Qt.DotLine)
arrow.updatePath()
self.addItem(arrow)
# We add the algs
for alg in list(model.childAlgorithms().values()):
item = ModelerGraphicItem(alg, model, controls, scene=self)
@ -104,6 +120,7 @@ class ModelerScene(QGraphicsScene):
self.algItems[alg.childId()] = item
# And then the arrows
for alg in list(model.childAlgorithms().values()):
idx = 0
for parameter in alg.algorithm().parameterDefinitions():