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
Loading
510 Bytes
Loading
70 Bytes
Loading
86 Bytes
Loading

‎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.