Source code for openalea.grapheditor.edgefactory
# -*- python -*-
#
# OpenAlea.Visualea: OpenAlea graphical user interface
#
# Copyright 2006-2009 INRIA - CIRAD - INRA
#
# File author(s): Daniel Barbeau <daniel.barbeau@sophia.inria.fr>
# Original code from visualea.compositenode_widget
# (Samuel Dufour Kowalski, Christophe Pradal)
#
# Distributed under the Cecill-C License.
# See accompanying file LICENSE.txt or copy at
# http://www.cecill.info/licences/Licence_CeCILL-C_V1-en.html
#
# OpenAlea WebSite : http://openalea.gforge.inria.fr
#
###############################################################################
__license__ = "Cecill-C"
__revision__ = " $Id$ "
from qtpy import QtCore, QtGui
# def EdgeFactory():
# try:
# settings = Settings()
# style = settings.get('UI', 'EdgeStyle')
# except:
# style = 'Spline'
# if style == 'Line':
# return LinearEdgePath()
# elif style == 'Polyline':
# return PolylineEdgePath()
# else:
# return SplineEdgePath()
[docs]
class LinearEdgePath:
""" Draw edges as line. """
def __init__(self):
self.p1 = QtCore.QPointF()
self.p2 = QtCore.QPointF()
[docs]
def shape(self):
path = QtGui.QPainterPath()
# Enlarge selection zone
diff = self.p2 - self.p1
if( abs(diff.x()) > abs(diff.y())):
dp = QtCore.QPointF(0, 10)
else:
dp = QtCore.QPointF(10, 0)
p1 = self.p1 - dp
p2 = self.p1 + dp
p3 = self.p2 + dp
p4 = self.p2 - dp
poly = QtGui.QPolygonF([p1, p2, p3, p4])
path.addPolygon(poly)
return path
[docs]
def get_path( self, p1, p2):
self.p1 = p1
self.p2 = p2
path = QtGui.QPainterPath(self.p1)
path.lineTo(self.p2)
return path
[docs]
class PolylineEdgePath(LinearEdgePath):
""" Edge as Polyline """
WIDTH = 30
def __init__(self):
LinearEdgePath.__init__(self)
[docs]
def shape(self):
return None
[docs]
def get_path( self, p1, p2 ):
self.p1 = p1
self.p2 = p2
path = QtGui.QPainterPath(self.p1)
points = []
sd= self.p2 - self.p1
if abs(sd.x()) <= self.WIDTH: # draw a line
pass
elif sd.y() < 2 * self.WIDTH:
s1 = self.p1 + QtCore.QPointF(0,self.WIDTH)
d1 = self.p2 - QtCore.QPointF(0,self.WIDTH)
s1d1= d1 -s1
s2 = s1 + QtCore.QPointF(s1d1.x() / 2., 0)
d2 = s2 + QtCore.QPointF(0, s1d1.y())
points.extend([s1, s2, d2, d1])
else:
s1 = self.p1 + QtCore.QPointF(0, sd.y() / 2.)
d1= self.p2 - QtCore.QPointF(0, sd.y() / 2.)
points.extend([s1, d1])
points.append(self.p2)
for pt in points:
path.lineTo(pt)
return path
[docs]
class SplineEdgePath(PolylineEdgePath):
""" Edge as Spline """
def __init__(self):
PolylineEdgePath.__init__(self)
[docs]
def get_path( self, p1, p2):
self.p1 = p1
self.p2 = p2
path = QtGui.QPainterPath(self.p1)
sd= self.p2- self.p1
if abs(sd.x()) <= self.WIDTH: # draw a line
path.lineTo(self.p2)
elif sd.y() < self.WIDTH:
py = QtCore.QPointF(0, max(self.WIDTH, - sd.y()))
path.cubicTo(self.p1 + py, self.p2 - py, self.p2)
else:
py = QtCore.QPointF(0, sd.y() / 2.)
pm = (self.p1 + self.p2) / 2.
path.quadTo(self.p1 + py, pm)
path.quadTo(self.p2 - py, self.p2)
return path