Skip to content

Commit 2e6178c

Browse files
committedApr 23, 2013
[sextante]new modeler interface
1 parent 91685e7 commit 2e6178c

File tree

8 files changed

+269
-61
lines changed

8 files changed

+269
-61
lines changed
 
323 Bytes

Error rendering embedded code

Invalid image source.

510 Bytes

Error rendering embedded code

Invalid image source.

70 Bytes

Error rendering embedded code

Invalid image source.

86 Bytes

Error rendering embedded code

Invalid image source.

‎python/plugins/sextante/modeler/ModelerAlgorithm.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,8 @@ def activateAlgorithm(self, algIndex, update = False):
294294
self.deactivated.remove(algIndex)
295295
dependent = self.getDependentAlgorithms(algIndex)
296296
for alg in dependent:
297-
self.deactivated.remove(alg)
297+
if alg in self.deactivated:
298+
self.deactivated.remove(alg)
298299
if update:
299300
self.updateModelerView()
300301
return True

‎python/plugins/sextante/modeler/ModelerArrowItem.py

Lines changed: 69 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
from PyQt4 import QtCore, QtGui
22
import math
3+
from sextante.modeler.ModelerGraphicItem import ModelerGraphicItem
4+
from sextante.core.GeoAlgorithm import GeoAlgorithm
35

46
#portions of this code have been taken and adapted from PyQt examples, released under the following license terms
57

@@ -45,9 +47,11 @@
4547

4648
class ModelerArrowItem(QtGui.QGraphicsLineItem):
4749

48-
def __init__(self, startItem, endItem, parent=None, scene=None):
50+
def __init__(self, startItem, outputIndex, endItem, paramIndex ,parent=None, scene=None):
4951
super(ModelerArrowItem, self).__init__(parent, scene)
5052
self.arrowHead = QtGui.QPolygonF()
53+
self.paramIndex = paramIndex
54+
self.outputIndex = outputIndex
5155
self.myStartItem = startItem
5256
self.myEndItem = endItem
5357
self.setFlag(QtGui.QGraphicsItem.ItemIsSelectable, False)
@@ -66,13 +70,7 @@ def endItem(self):
6670
def boundingRect(self):
6771
#this is a quick fix to avoid arrows not being drawn
6872
return QtCore.QRectF(0, 0, 4000,4000)
69-
#=======================================================================
70-
# extra = (self.pen().width() + 20) / 2.0
71-
# p1 = self.line().p1()
72-
# p2 = self.line().p2()
73-
# return QtCore.QRectF(p1, QtCore.QSizeF(p2.x() - p1.x(), p2.y() - p1.y())).normalized().adjusted(-extra, -extra, extra, extra)
74-
#=======================================================================
75-
73+
7674
def shape(self):
7775
path = super(ModelerArrowItem, self).shape()
7876
path.addPolygon(self.arrowHead)
@@ -82,47 +80,84 @@ def updatePosition(self):
8280
line = QtCore.QLineF(self.mapFromItem(self.myStartItem, 0, 0), self.mapFromItem(self.myEndItem, 0, 0))
8381
self.setLine(line)
8482

85-
def paint(self, painter, option, widget=None):
86-
#if (self.myStartItem.collidesWithItem(self.myEndItem)):
87-
#return
88-
83+
def paint(self, painter, option, widget=None):
8984
myStartItem = self.myStartItem
9085
myEndItem = self.myEndItem
9186
myPen = self.pen()
9287
myPen.setColor(self.myColor)
9388
arrowSize = 6.0
9489
painter.setPen(myPen)
95-
painter.setBrush(self.myColor)
96-
97-
centerLine = QtCore.QLineF(myStartItem.pos(), myEndItem.pos())
98-
endPolygon = myEndItem.polygon()
99-
p1 = endPolygon.first() + myEndItem.pos()
100-
101-
intersectPoint = QtCore.QPointF()
102-
for i in endPolygon:
103-
p2 = i + myEndItem.pos()
104-
polyLine = QtCore.QLineF(p1, p2)
105-
intersectType = polyLine.intersect(centerLine, intersectPoint)
106-
if intersectType == QtCore.QLineF.BoundedIntersection:
107-
break
108-
p1 = p2
109-
110-
self.setLine(QtCore.QLineF(intersectPoint, myStartItem.pos()))
111-
line = self.line()
90+
painter.setBrush(self.myColor)
91+
92+
if isinstance(self.startItem().element, GeoAlgorithm):
93+
if self.startItem().element.outputs:
94+
endPt = self.endItem().getLinkPointForParameter(self.paramIndex)
95+
startPt = self.startItem().getLinkPointForOutput(self.outputIndex)
96+
arrowLine = QtCore.QLineF(myEndItem.pos() + endPt - QtCore.QPointF(endPt.x() + ModelerGraphicItem.BOX_WIDTH /2, 0), myEndItem.pos() + endPt)
97+
painter.drawLine(arrowLine)
98+
tailLine = QtCore.QLineF(myStartItem.pos() + startPt + QtCore.QPointF(ModelerGraphicItem.BOX_WIDTH /2 - startPt.x(),0), myStartItem.pos() + startPt)
99+
painter.drawLine(tailLine)
100+
pt = QtCore.QPointF(myStartItem.pos() + startPt + QtCore.QPointF(- 2, -2))
101+
rect = QtCore.QRectF(pt.x(), pt.y(), 4, 4)
102+
painter.fillRect(rect, QtCore.Qt.gray)
103+
line = QtCore.QLineF(myStartItem.pos() + startPt + QtCore.QPointF(ModelerGraphicItem.BOX_WIDTH /2 - startPt.x(),0),
104+
myEndItem.pos() + endPt - QtCore.QPointF(endPt.x() + ModelerGraphicItem.BOX_WIDTH /2, 0))
105+
else: # case where there is a dependency on an algorithm not on an output
106+
endPolygon = myEndItem.polygon()
107+
p1 = endPolygon.first() + myEndItem.pos()
108+
line = QtCore.QLineF(myStartItem.pos(), myEndItem.pos())
109+
intersectPoint = QtCore.QPointF()
110+
for i in endPolygon:
111+
p2 = i + myEndItem.pos()
112+
polyLine = QtCore.QLineF(p1, p2)
113+
intersectType = polyLine.intersect(line, intersectPoint)
114+
if intersectType == QtCore.QLineF.BoundedIntersection:
115+
break
116+
p1 = p2
117+
118+
self.setLine(QtCore.QLineF(intersectPoint, myStartItem.pos()))
119+
line = self.line()
120+
if line.length() == 0: #division by zero might occur if arrow has no length
121+
return
122+
angle = math.acos(line.dx() / line.length())
123+
if line.dy() >= 0:
124+
angle = (math.pi * 2.0) - angle
125+
126+
arrowP1 = line.p1() + QtCore.QPointF(math.sin(angle + math.pi / 3.0) * arrowSize,
127+
math.cos(angle + math.pi / 3) * arrowSize)
128+
arrowP2 = line.p1() + QtCore.QPointF(math.sin(angle + math.pi - math.pi / 3.0) * arrowSize,
129+
math.cos(angle + math.pi - math.pi / 3.0) * arrowSize)
130+
131+
self.arrowHead.clear()
132+
for point in [line.p1(), arrowP1, arrowP2]:
133+
self.arrowHead.append(point)
134+
135+
painter.drawLine(line)
136+
painter.drawPolygon(self.arrowHead)
137+
return;
138+
else:
139+
endPt = self.endItem().getLinkPointForParameter(self.paramIndex)
140+
arrowLine = QtCore.QLineF(myEndItem.pos() + endPt - QtCore.QPointF(endPt.x() + ModelerGraphicItem.BOX_WIDTH /2, 0), myEndItem.pos() + endPt)
141+
painter.drawLine(arrowLine)
142+
line = QtCore.QLineF(myStartItem.pos(),
143+
myEndItem.pos() + endPt - QtCore.QPointF(endPt.x() + ModelerGraphicItem.BOX_WIDTH /2, 0))
144+
145+
self.setLine(line);
112146

113147
if line.length() == 0: #division by zero might occur if arrow has no length
114148
return
149+
115150
angle = math.acos(line.dx() / line.length())
116151
if line.dy() >= 0:
117152
angle = (math.pi * 2.0) - angle
118153

119-
arrowP1 = line.p1() + QtCore.QPointF(math.sin(angle + math.pi / 3.0) * arrowSize,
120-
math.cos(angle + math.pi / 3) * arrowSize)
121-
arrowP2 = line.p1() + QtCore.QPointF(math.sin(angle + math.pi - math.pi / 3.0) * arrowSize,
122-
math.cos(angle + math.pi - math.pi / 3.0) * arrowSize)
154+
arrowP1 = arrowLine.p2() + QtCore.QPointF(-math.cos(math.pi / 9.0) * arrowSize,
155+
math.sin(math.pi / 9.0) * arrowSize)
156+
arrowP2 = arrowLine.p2() + QtCore.QPointF(-math.cos(math.pi / 9.0) * arrowSize,
157+
-math.sin(math.pi / 9.0) * arrowSize)
123158

124159
self.arrowHead.clear()
125-
for point in [line.p1(), arrowP1, arrowP2]:
160+
for point in [arrowLine.p2(), arrowP1, arrowP2]:
126161
self.arrowHead.append(point)
127162

128163
painter.drawLine(line)

‎python/plugins/sextante/modeler/ModelerGraphicItem.py

Lines changed: 184 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -32,32 +32,82 @@
3232

3333
class ModelerGraphicItem(QtGui.QGraphicsItem):
3434

35-
BOX_HEIGHT = 70
35+
BOX_HEIGHT = 30
3636
BOX_WIDTH = 200
3737

3838
def __init__(self, element, elementIndex, model):
3939
super(ModelerGraphicItem, self).__init__(None, None)
4040
self.model = model
4141
self.element = element
4242
self.elementIndex = elementIndex
43+
self.inputFolded = True
44+
self.outputFolded = True
4345
if isinstance(element, Parameter):
4446
icon = QtGui.QIcon(os.path.dirname(__file__) + "/../images/input.png")
4547
self.pixmap = icon.pixmap(20, 20, state=QtGui.QIcon.On)
4648
self.text = element.description
4749
else:
50+
state=QtGui.QIcon.On
51+
if self.elementIndex in self.model.deactivated:
52+
state=QtGui.QIcon.Off
4853
self.text = element.name
49-
self.pixmap = element.getIcon().pixmap(20, 20, state=QtGui.QIcon.On)
54+
self.pixmap = element.getIcon().pixmap(15, 15, state=state)
5055
self.arrows = []
5156
self.setFlag(QtGui.QGraphicsItem.ItemIsMovable, True)
5257
self.setFlag(QtGui.QGraphicsItem.ItemIsSelectable, True)
5358
self.setZValue(1000)
59+
60+
icon = QtGui.QIcon(os.path.dirname(__file__) + "/../images/edit.png")
61+
pt = QtCore.QPointF(ModelerGraphicItem.BOX_WIDTH / 2 - FlatButtonGraphicItem.WIDTH / 2, ModelerGraphicItem.BOX_HEIGHT / 2 - FlatButtonGraphicItem.HEIGHT / 2 + 1)
62+
self.editButton = FlatButtonGraphicItem(icon, pt, self.editElement)
63+
self.editButton.setParentItem(self)
64+
icon = QtGui.QIcon(os.path.dirname(__file__) + "/../images/delete.png")
65+
pt = QtCore.QPointF(ModelerGraphicItem.BOX_WIDTH / 2 - FlatButtonGraphicItem.WIDTH / 2, -ModelerGraphicItem.BOX_HEIGHT / 2 + FlatButtonGraphicItem.HEIGHT / 2 + 1)
66+
self.deleteButton = FlatButtonGraphicItem(icon, pt, self.removeElement)
67+
self.deleteButton.setParentItem(self)
68+
69+
if isinstance(element, GeoAlgorithm):
70+
if element.parameters:
71+
pt = self.getLinkPointForParameter(-1)
72+
x = self.getXPositionForFoldButton()
73+
pt = QtCore.QPointF(x, pt.y())
74+
self.inButton = FoldButtonGraphicItem(pt, self.foldInput)
75+
self.inButton.setParentItem(self)
76+
if element.outputs:
77+
pt = self.getLinkPointForOutput(-1)
78+
x = self.getXPositionForFoldButton()
79+
pt = QtCore.QPointF(x, pt.y())
80+
self.outButton = FoldButtonGraphicItem(pt, self.foldOutput)
81+
self.outButton.setParentItem(self)
82+
5483

84+
def foldInput(self, folded):
85+
self.inputFolded = folded
86+
self.prepareGeometryChange()
87+
if self.element.outputs:
88+
pt = self.getLinkPointForOutput(-1)
89+
x = self.getXPositionForFoldButton()
90+
pt = QtCore.QPointF(x, pt.y())
91+
self.outButton.position = pt
92+
self.update()
93+
94+
def foldOutput(self, folded):
95+
self.outputFolded = folded
96+
self.prepareGeometryChange()
97+
self.update()
98+
5599
def addArrow(self, arrow):
56100
self.arrows.append(arrow)
57101

58102
def boundingRect(self):
103+
font = QtGui.QFont("Verdana", 8)
104+
fm = QtGui.QFontMetricsF(font)
105+
numParams = 0 if self.inputFolded else len(self.element.parameters)
106+
numOutputs = 0 if self.outputFolded else len(self.element.outputs)
107+
numElements = numParams + numOutputs + 3
108+
h = (fm.height() * 1.2) * numElements
59109
rect = QtCore.QRectF(-(ModelerGraphicItem.BOX_WIDTH + 2)/2, -(ModelerGraphicItem.BOX_HEIGHT + 2)/2,
60-
ModelerGraphicItem.BOX_WIDTH + 2, ModelerGraphicItem.BOX_HEIGHT + 2)
110+
ModelerGraphicItem.BOX_WIDTH + 2, ModelerGraphicItem.BOX_HEIGHT + h)
61111
return rect
62112

63113
def mouseDoubleClickEvent(self, event):
@@ -79,9 +129,11 @@ def contextMenuEvent(self, event):
79129
popupmenu.exec_(event.screenPos())
80130

81131
def deactivateAlgorithm(self):
132+
self.model.setPositions(self.scene().getParameterPositions(), self.scene().getAlgorithmPositions())
82133
self.model.deactivateAlgorithm(self.elementIndex, True)
83134

84135
def activateAlgorithm(self):
136+
self.model.setPositions(self.scene().getParameterPositions(), self.scene().getAlgorithmPositions())
85137
if not self.model.activateAlgorithm(self.elementIndex, True):
86138
QtGui.QMessageBox.warning(None, "Could not activate Algorithm",
87139
"The selected algorithm depends on other currently non-active algorithms.\nActivate them them before trying to activate it.")
@@ -119,44 +171,96 @@ def getAdjustedText(self, text):
119171
font = QtGui.QFont("Verdana", 8)
120172
fm = QtGui.QFontMetricsF(font)
121173
w = fm.width(text)
122-
if w < self.BOX_WIDTH:
174+
if w < self.BOX_WIDTH - 25 - FlatButtonGraphicItem.WIDTH:
123175
return text
124176

125177
text = text[0:-3] + "..."
126178
w = fm.width(text)
127-
while(w > self.BOX_WIDTH):
179+
while(w > self.BOX_WIDTH - 25 - FlatButtonGraphicItem.WIDTH):
128180
text = text[0:-4] + "..."
129181
w = fm.width(text)
130182
return text
131183

132184

133185
def paint(self, painter, option, widget=None):
134186

135-
rect = QtCore.QRectF(-(ModelerGraphicItem.BOX_WIDTH + 2)/2, -(ModelerGraphicItem.BOX_HEIGHT + 2)/2,
187+
rect = QtCore.QRectF(-(ModelerGraphicItem.BOX_WIDTH + 2)/2.0, -(ModelerGraphicItem.BOX_HEIGHT + 2)/2.0,
136188
ModelerGraphicItem.BOX_WIDTH + 2, ModelerGraphicItem.BOX_HEIGHT + 2)
137189
painter.setPen(QtGui.QPen(QtCore.Qt.gray, 1))
138190
painter.setBrush(QtGui.QBrush(QtCore.Qt.white, QtCore.Qt.SolidPattern))
139191
painter.drawRect(rect)
140192
font = QtGui.QFont("Verdana", 8)
141193
painter.setFont(font)
194+
painter.setPen(QtGui.QPen(QtCore.Qt.black))
142195
if self.isSelected():
143196
painter.setPen(QtGui.QPen(QtCore.Qt.blue))
144-
else:
145-
painter.setPen(QtGui.QPen(QtCore.Qt.black))
197+
if isinstance(self.element, GeoAlgorithm):
198+
if self.elementIndex in self.model.deactivated:
199+
painter.setPen(QtGui.QPen(QtCore.Qt.lightGray))
146200
fm = QtGui.QFontMetricsF(font)
147201
text = self.getAdjustedText(self.text)
148-
w = fm.width(QtCore.QString(text))
149202
h = fm.height()
150-
pt = QtCore.QPointF(-w/2, h/2)
203+
pt = QtCore.QPointF(-(ModelerGraphicItem.BOX_WIDTH)/2 + 25, h/2.0)
151204
painter.drawText(pt, text)
152-
if isinstance(self.element, GeoAlgorithm):
153-
if self.elementIndex in self.model.deactivated:
154-
painter.setPen(QtGui.QPen(QtCore.Qt.red))
155-
w = fm.width(QtCore.QString("[deactivated]"))
156-
pt = QtCore.QPointF(-w/2, h+h/2)
157-
painter.drawText(pt, "[deactivated]")
158-
painter.drawPixmap(-10 , -(ModelerGraphicItem.BOX_HEIGHT )/3,self.pixmap)
205+
painter.setPen(QtGui.QPen(QtCore.Qt.black))
206+
if isinstance(self.element, GeoAlgorithm):
207+
h = (fm.height() * 1.2)
208+
h = h + ModelerGraphicItem.BOX_HEIGHT / 2.0
209+
pt = QtCore.QPointF(-(ModelerGraphicItem.BOX_WIDTH)/2 + 25, h)
210+
painter.drawText(pt, "In")
211+
i = 1
212+
if not self.inputFolded:
213+
for param in self.element.parameters:
214+
text = self.getAdjustedText(param.description)
215+
h = (fm.height() * 1.2) * (i + 1)
216+
h = h + ModelerGraphicItem.BOX_HEIGHT / 2.0
217+
pt = QtCore.QPointF(-(ModelerGraphicItem.BOX_WIDTH)/2 + 33, h)
218+
painter.drawText(pt, text)
219+
i += 1
220+
h = (fm.height() * 1.2) * (i + 1)
221+
h = h + ModelerGraphicItem.BOX_HEIGHT / 2.0
222+
pt = QtCore.QPointF(-(ModelerGraphicItem.BOX_WIDTH)/2 + 25, h)
223+
painter.drawText(pt, "Out")
224+
i += 1
225+
if not self.outputFolded:
226+
for out in self.element.outputs:
227+
text = self.getAdjustedText(out.description)
228+
h = (fm.height() * 1.2) * (i + 1)
229+
h = h + ModelerGraphicItem.BOX_HEIGHT / 2.0
230+
pt = QtCore.QPointF(-(ModelerGraphicItem.BOX_WIDTH)/2 + 33, h)
231+
painter.drawText(pt, text)
232+
i += 1
233+
painter.drawPixmap(-(ModelerGraphicItem.BOX_WIDTH / 2.0) + 3, -8, self.pixmap)
159234

235+
def getLinkPointForParameter(self, paramIndex):
236+
offsetX = 30
237+
if self.inputFolded:
238+
paramIndex = -1
239+
offsetX = 22
240+
font = QtGui.QFont("Verdana", 8)
241+
fm = QtGui.QFontMetricsF(font)
242+
h = (fm.height() * 1.2) * (paramIndex + 2) - fm.height() / 2.0
243+
h = h + ModelerGraphicItem.BOX_HEIGHT / 2.0
244+
return QtCore.QPointF(-(ModelerGraphicItem.BOX_WIDTH)/2 + offsetX, h)
245+
246+
247+
def getXPositionForFoldButton(self):
248+
return 0
249+
250+
def getLinkPointForOutput(self, outputIndex):
251+
if isinstance(self.element, GeoAlgorithm):
252+
numParams = 0 if self.inputFolded else len(self.element.parameters)
253+
outputIndex = outputIndex if not self.outputFolded else -1
254+
text = self.getAdjustedText(self.element.outputs[outputIndex].description)
255+
font = QtGui.QFont("Verdana", 8)
256+
fm = QtGui.QFontMetricsF(font)
257+
w = fm.width(QtCore.QString(text))
258+
h = (fm.height() * 1.2) * (outputIndex + 3 + numParams) - fm.height() / 2.0
259+
y = h + ModelerGraphicItem.BOX_HEIGHT / 2.0
260+
x = -(ModelerGraphicItem.BOX_WIDTH)/2 + 33 + w + 5 if not self.outputFolded else 10
261+
return QtCore.QPointF(x, y)
262+
else:
263+
return QtCore.QPointF(0, 0)
160264

161265
def itemChange(self, change, value):
162266
if change == QtGui.QGraphicsItem.ItemPositionChange:
@@ -166,11 +270,72 @@ def itemChange(self, change, value):
166270
return value
167271

168272
def polygon(self):
273+
font = QtGui.QFont("Verdana", 8)
274+
fm = QtGui.QFontMetricsF(font)
275+
numElements = len(self.element.parameters) + len(self.element.outputs) + 3
276+
h = (fm.height() * 1.2) * numElements
169277
pol = QtGui.QPolygonF([
170278
QtCore.QPointF(-(ModelerGraphicItem.BOX_WIDTH + 2)/2, -(ModelerGraphicItem.BOX_HEIGHT + 2)/2),
171-
QtCore.QPointF(-(ModelerGraphicItem.BOX_WIDTH + 2)/2, (ModelerGraphicItem.BOX_HEIGHT + 2)/2),
172-
QtCore.QPointF((ModelerGraphicItem.BOX_WIDTH + 2)/2, (ModelerGraphicItem.BOX_HEIGHT + 2)/2),
279+
QtCore.QPointF(-(ModelerGraphicItem.BOX_WIDTH + 2)/2, (ModelerGraphicItem.BOX_HEIGHT + 2)/2 + h),
280+
QtCore.QPointF((ModelerGraphicItem.BOX_WIDTH + 2)/2, (ModelerGraphicItem.BOX_HEIGHT + 2)/2 + h),
173281
QtCore.QPointF((ModelerGraphicItem.BOX_WIDTH + 2)/2, -(ModelerGraphicItem.BOX_HEIGHT + 2)/2),
174282
QtCore.QPointF(-(ModelerGraphicItem.BOX_WIDTH + 2)/2, -(ModelerGraphicItem.BOX_HEIGHT + 2)/2)])
175283
return pol
176284

285+
class FlatButtonGraphicItem(QtGui.QGraphicsItem):
286+
287+
WIDTH = 16
288+
HEIGHT = 16
289+
290+
def __init__(self, icon, position, action):
291+
super(FlatButtonGraphicItem, self).__init__(None, None)
292+
self.setAcceptHoverEvents(True)
293+
self.setFlag(QtGui.QGraphicsItem.ItemIsMovable, False)
294+
self.pixmap = icon.pixmap(self.WIDTH, self.HEIGHT, state=QtGui.QIcon.On)
295+
self.position = position
296+
self.isIn = False
297+
self.action = action
298+
299+
def mousePressEvent(self, event):
300+
self.action()
301+
302+
def paint(self, painter, option, widget=None):
303+
pt = QtCore.QPointF(-self.WIDTH / 2, -self.HEIGHT / 2) + self.position
304+
rect = QtCore.QRectF(pt.x(), pt.y(), self.WIDTH, self.HEIGHT)
305+
if self.isIn:
306+
painter.setPen(QtGui.QPen(QtCore.Qt.transparent, 1))
307+
painter.setBrush(QtGui.QBrush(QtCore.Qt.lightGray, QtCore.Qt.SolidPattern))
308+
else:
309+
painter.setPen(QtGui.QPen(QtCore.Qt.transparent, 1))
310+
painter.setBrush(QtGui.QBrush(QtCore.Qt.white, QtCore.Qt.SolidPattern))
311+
painter.drawRect(rect)
312+
painter.drawPixmap(pt.x(), pt.y(), self.pixmap)
313+
314+
def boundingRect(self):
315+
rect = QtCore.QRectF(self.position.x() - self.WIDTH / 2, self.position.y() - self.HEIGHT / 2, self.WIDTH, self.HEIGHT)
316+
return rect
317+
318+
def hoverEnterEvent(self, event):
319+
self.isIn = True
320+
self.update()
321+
322+
def hoverLeaveEvent(self, event):
323+
self.isIn = False
324+
self.update()
325+
326+
class FoldButtonGraphicItem(FlatButtonGraphicItem):
327+
328+
icons = { True : QtGui.QIcon(os.path.dirname(__file__) + "/../images/plus.gif"),
329+
False : QtGui.QIcon(os.path.dirname(__file__) + "/../images/minus.gif")}
330+
331+
def __init__(self, position, action):
332+
self.folded = True
333+
icon = self.icons[True]
334+
super(FoldButtonGraphicItem, self).__init__(icon, position, action)
335+
336+
def mousePressEvent(self, event):
337+
self.folded = not self.folded
338+
icon = self.icons[self.folded]
339+
self.pixmap = icon.pixmap(self.WIDTH, self.HEIGHT, state=QtGui.QIcon.On)
340+
self.action(self.folded)
341+

‎python/plugins/sextante/modeler/ModelerScene.py

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,16 @@ def getItemsFromAAP(self, aap, isMultiple):
7777
iModelParam=0
7878
for modelparam in self.model.parameters:
7979
if modelparam.name == aap.param:
80-
items.append(self.paramItems[iModelParam])
80+
items.append((self.paramItems[iModelParam], -1))
8181
break
8282
iModelParam+=1
8383
else:
84-
items.append(self.algItems[start])
84+
idx = 0
85+
for output in self.model.algs[start].outputs:
86+
if output.name == aap.param:
87+
items.append((self.algItems[start], idx))
88+
break
89+
idx += 1
8590

8691
return items
8792

@@ -110,15 +115,17 @@ def paintModel(self, model):
110115
iAlg=0
111116
for alg in model.algs:
112117
params = model.algParameters[iAlg]
113-
for key in params.keys():
114-
param = params[key]
118+
idx = 0
119+
for parameter in alg.parameters:
120+
param = params[parameter.name]
115121
if param:
116-
sourceItems = self.getItemsFromAAP(param, isinstance(alg.getParameterFromName(key), ParameterMultipleInput))
122+
sourceItems = self.getItemsFromAAP(param, isinstance(alg.getParameterFromName(parameter.name), ParameterMultipleInput))
117123
for sourceItem in sourceItems:
118-
arrow = ModelerArrowItem(sourceItem, self.algItems[iAlg])
124+
arrow = ModelerArrowItem(sourceItem[0], sourceItem[1], self.algItems[iAlg], idx)
119125
self.addItem(arrow)
126+
idx += 1
120127
for depend in model.dependencies[iAlg]:
121-
arrow = ModelerArrowItem(self.algItems[depend], self.algItems[iAlg])
128+
arrow = ModelerArrowItem(self.algItems[depend], -1, self.algItems[iAlg], -1)
122129
self.addItem(arrow)
123130
iAlg+=1
124131

0 commit comments

Comments
 (0)
Please sign in to comment.