]> git.saurik.com Git - wxWidgets.git/blobdiff - wxPython/wx/lib/ogl/_lines.py
frame should call skip on child focus event to give owner a chance
[wxWidgets.git] / wxPython / wx / lib / ogl / _lines.py
index c20e9ac2ea39a82a19ea117c3796eb1e1a6cfcab..fdee0ed6b5f400eb6b83058272cdea0d02a95a9a 100644 (file)
@@ -14,7 +14,7 @@
 import sys
 import math
 
 import sys
 import math
 
-from _basic import Shape, ShapeRegion, ControlPoint, RectangleShape
+from _basic import Shape, ShapeRegion, ShapeTextLine, ControlPoint, RectangleShape
 from _oglmisc import *
 
 # Line alignment flags
 from _oglmisc import *
 
 # Line alignment flags
@@ -131,7 +131,7 @@ class LabelShape(RectangleShape):
         RectangleShape.__init__(self, w, h)
         self._lineShape = parent
         self._shapeRegion = region
         RectangleShape.__init__(self, w, h)
         self._lineShape = parent
         self._shapeRegion = region
-        self.SetPen(wx.ThePenList.FindOrCreatePen(wx.Colour(0, 0, 0), 1, wx.DOT))
+        self.SetPen(wx.Pen(wx.Colour(0, 0, 0), 1, wx.DOT))
 
     def OnDraw(self, dc):
         if self._lineShape and not self._lineShape.GetDrawHandles():
 
     def OnDraw(self, dc):
         if self._lineShape and not self._lineShape.GetDrawHandles():
@@ -220,7 +220,6 @@ class LineShape(Shape):
 
     def __del__(self):
         if self._lineControlPoints:
 
     def __del__(self):
         if self._lineControlPoints:
-            self.ClearPointList(self._lineControlPoints)
             self._lineControlPoints = []
         for i in range(3):
             if self._labelObjects[i]:
             self._lineControlPoints = []
         for i in range(3):
             if self._labelObjects[i]:
@@ -289,27 +288,32 @@ class LineShape(Shape):
 
     def MakeLineControlPoints(self, n):
         """Make a given number of control points (minimum of two)."""
 
     def MakeLineControlPoints(self, n):
         """Make a given number of control points (minimum of two)."""
-        if self._lineControlPoints:
-            self.ClearPointList(self._lineControlPoints)
         self._lineControlPoints = []
         
         for _ in range(n):
             point = wx.RealPoint(-999, -999)
             self._lineControlPoints.append(point)
 
         self._lineControlPoints = []
         
         for _ in range(n):
             point = wx.RealPoint(-999, -999)
             self._lineControlPoints.append(point)
 
-    def InsertLineControlPoint(self, dc = None):
-        """Insert a control point at an arbitrary position."""
+        # pi: added _initialised to keep track of when we have set
+        # the middle points to something other than (-999, -999)
+        self._initialised = False
+        
+    def InsertLineControlPoint(self, dc = None, point = None):
+        """Insert a control point at an optional given position."""
         if dc:
             self.Erase(dc)
 
         if dc:
             self.Erase(dc)
 
-        last_point = self._lineControlPoints[-1]
-        second_last_point = self._lineControlPoints[-2]
+        if point:
+            line_x, line_y = point
+        else:
+            last_point = self._lineControlPoints[-1]
+            second_last_point = self._lineControlPoints[-2]
 
 
-        line_x = (last_point[0] + second_last_point[0]) / 2.0
-        line_y = (last_point[1] + second_last_point[1]) / 2.0
+            line_x = (last_point[0] + second_last_point[0]) / 2.0
+            line_y = (last_point[1] + second_last_point[1]) / 2.0
 
         point = wx.RealPoint(line_x, line_y)
 
         point = wx.RealPoint(line_x, line_y)
-        self._lineControlPoints.insert(len(self._lineControlPoints), point)
+        self._lineControlPoints.insert(len(self._lineControlPoints)-1, point)
 
     def DeleteLineControlPoint(self):
         """Delete an arbitary point on the line."""
 
     def DeleteLineControlPoint(self):
         """Delete an arbitary point on the line."""
@@ -346,6 +350,7 @@ class LineShape(Shape):
                         y2 = first_point[1]
                         y1 = last_point[1]
                     self._lineControlPoints[i] = wx.RealPoint((x2 - x1) / 2.0 + x1, (y2 - y1) / 2.0 + y1)
                         y2 = first_point[1]
                         y1 = last_point[1]
                     self._lineControlPoints[i] = wx.RealPoint((x2 - x1) / 2.0 + x1, (y2 - y1) / 2.0 + y1)
+                    self._initialised = True
                     
     def FormatText(self, dc, s, i):
         """Format a text string according to the region size, adding
                     
     def FormatText(self, dc, s, i):
         """Format a text string according to the region size, adding
@@ -503,7 +508,7 @@ class LineShape(Shape):
         first_point = self._lineControlPoints[0]
         last_point = self._lineControlPoints[-1]
 
         first_point = self._lineControlPoints[0]
         last_point = self._lineControlPoints[-1]
 
-        return (first_point[0], first_point[1]), (last_point[0], last_point[1])
+        return first_point[0], first_point[1], last_point[0], last_point[1]
 
     def SetAttachments(self, from_attach, to_attach):
         """Specify which object attachment points should be used at each end
 
     def SetAttachments(self, from_attach, to_attach):
         """Specify which object attachment points should be used at each end
@@ -548,8 +553,8 @@ class LineShape(Shape):
             dy = point2[1] - point1[1]
 
             seg_len = math.sqrt(dx * dx + dy * dy)
             dy = point2[1] - point1[1]
 
             seg_len = math.sqrt(dx * dx + dy * dy)
-            if dy == 0 or dx == 0:
-                return False
+            if dy == 0 and dx == 0:
+                continue
             distance_from_seg = seg_len * float((x - point1[0]) * dy - (y - point1[1]) * dx) / (dy * dy + dx * dx)
             distance_from_prev = seg_len * float((y - point1[1]) * dy + (x - point1[0]) * dx) / (dy * dy + dx * dx)
 
             distance_from_seg = seg_len * float((x - point1[0]) * dy - (y - point1[1]) * dx) / (dy * dy + dx * dx)
             distance_from_prev = seg_len * float((y - point1[1]) * dy + (x - point1[0]) * dx) / (dy * dy + dx * dx)
 
@@ -904,17 +909,25 @@ class LineShape(Shape):
         if not self._from or not self._to:
             return
 
         if not self._from or not self._to:
             return
 
-        if len(self._lineControlPoints) > 2:
-            self.Initialise()
-
         # Do each end - nothing in the middle. User has to move other points
         # manually if necessary
         end_x, end_y, other_end_x, other_end_y = self.FindLineEndPoints()
 
         oldX, oldY = self._xpos, self._ypos
 
         # Do each end - nothing in the middle. User has to move other points
         # manually if necessary
         end_x, end_y, other_end_x, other_end_y = self.FindLineEndPoints()
 
         oldX, oldY = self._xpos, self._ypos
 
+        # pi: The first time we go through FindLineEndPoints we can't
+        # use the middle points (since they don't have sane values),
+        # so we just do what we do for a normal line. Then we call
+        # Initialise to set the middle points, and then FindLineEndPoints
+        # again, but this time (and from now on) we use the middle
+        # points to calculate the end points.
+        # This was buggy in the C++ version too.
+        
         self.SetEnds(end_x, end_y, other_end_x, other_end_y)
 
         self.SetEnds(end_x, end_y, other_end_x, other_end_y)
 
+        if len(self._lineControlPoints) > 2:
+            self.Initialise()
+
         # Do a second time, because one may depend on the other
         end_x, end_y, other_end_x, other_end_y = self.FindLineEndPoints()
         self.SetEnds(end_x, end_y, other_end_x, other_end_y)
         # Do a second time, because one may depend on the other
         end_x, end_y, other_end_x, other_end_y = self.FindLineEndPoints()
         self.SetEnds(end_x, end_y, other_end_x, other_end_y)
@@ -946,8 +959,10 @@ class LineShape(Shape):
         # manually if necessary.
         second_point = self._lineControlPoints[1]
         second_last_point = self._lineControlPoints[-2]
         # manually if necessary.
         second_point = self._lineControlPoints[1]
         second_last_point = self._lineControlPoints[-2]
-        
-        if len(self._lineControlPoints) > 2:
+
+        # pi: If we have a segmented line and this is the first time,
+        # do this as a straight line.
+        if len(self._lineControlPoints) > 2 and self._initialised:
             if self._from.GetAttachmentMode() != ATTACHMENT_MODE_NONE:
                 nth, no_arcs = self.FindNth(self._from, False) # Not incoming
                 end_x, end_y = self._from.GetAttachmentPosition(self._attachmentFrom, nth, no_arcs, self)
             if self._from.GetAttachmentMode() != ATTACHMENT_MODE_NONE:
                 nth, no_arcs = self.FindNth(self._from, False) # Not incoming
                 end_x, end_y = self._from.GetAttachmentPosition(self._attachmentFrom, nth, no_arcs, self)
@@ -999,7 +1014,6 @@ class LineShape(Shape):
         for point in self._lineControlPoints:
             points.append(wx.Point(point[0], point[1]))
 
         for point in self._lineControlPoints:
             points.append(wx.Point(point[0], point[1]))
 
-        #print points
         if self._isSpline:
             dc.DrawSpline(points)
         else:
         if self._isSpline:
             dc.DrawSpline(points)
         else:
@@ -1013,7 +1027,7 @@ class LineShape(Shape):
         # Problem with pen - if not a solid pen, does strange things
         # to the arrowhead. So make (get) a new pen that's solid.
         if self._pen and self._pen.GetStyle() != wx.SOLID:
         # Problem with pen - if not a solid pen, does strange things
         # to the arrowhead. So make (get) a new pen that's solid.
         if self._pen and self._pen.GetStyle() != wx.SOLID:
-            solid_pen = wx.ThePenList.FindOrCreatePen(self._pen.GetColour(), 1, wx.SOLID)
+            solid_pen = wx.Pen(self._pen.GetColour(), 1, wx.SOLID)
             if solid_pen:
                 dc.SetPen(solid_pen)
 
             if solid_pen:
                 dc.SetPen(solid_pen)
 
@@ -1088,7 +1102,7 @@ class LineShape(Shape):
             self._controlPoints.append(control)
 
     def ResetControlPoints(self):
             self._controlPoints.append(control)
 
     def ResetControlPoints(self):
-        if self._canvas and self._lineControlPoints:
+        if self._canvas and self._lineControlPoints and self._controlPoints:
             for i in range(min(len(self._controlPoints), len(self._lineControlPoints))):
                 point = self._lineControlPoints[i]
                 control = self._controlPoints[i]
             for i in range(min(len(self._controlPoints), len(self._lineControlPoints))):
                 point = self._lineControlPoints[i]
                 control = self._controlPoints[i]
@@ -1142,8 +1156,9 @@ class LineShape(Shape):
 
             pt.SetX(x)
             pt.SetY(y)
 
             pt.SetX(x)
             pt.SetY(y)
-            pt._point = x, y
-
+            pt._point[0] = x
+            pt._point[1] = y
+            
             old_pen = self.GetPen()
             old_brush = self.GetBrush()
 
             old_pen = self.GetPen()
             old_brush = self.GetBrush()
 
@@ -1177,7 +1192,8 @@ class LineShape(Shape):
 
             pt._xpos = x
             pt._ypos = y
 
             pt._xpos = x
             pt._ypos = y
-            pt._point = x, y
+            pt._point[0] = x
+            pt._point[1] = y
 
             old_pen = self.GetPen()
             old_brush = self.GetBrush()
 
             old_pen = self.GetPen()
             old_brush = self.GetBrush()
@@ -1213,7 +1229,8 @@ class LineShape(Shape):
             # as it changed shape.
             pt._xpos = pt._originalPos[0]
             pt._ypos = pt._originalPos[1]
             # as it changed shape.
             pt._xpos = pt._originalPos[0]
             pt._ypos = pt._originalPos[1]
-            pt._point = pt._originalPos[0], pt._originalPos[1]
+            pt._point[0] = pt._originalPos[0]
+            pt._point[1] = pt._originalPos[1]
 
             self.OnMoveMiddleControlPoint(dc, pt, rpt)
 
 
             self.OnMoveMiddleControlPoint(dc, pt, rpt)
 
@@ -1221,22 +1238,23 @@ class LineShape(Shape):
             if pt._oldCursor:
                 self._canvas.SetCursor(pt._oldCursor)
 
             if pt._oldCursor:
                 self._canvas.SetCursor(pt._oldCursor)
 
-                if self.GetFrom():
-                    self.GetFrom().MoveLineToNewAttachment(dc, self, x, y)
+            if self.GetFrom():
+                self.GetFrom().MoveLineToNewAttachment(dc, self, x, y)
 
         if pt._type == CONTROL_POINT_ENDPOINT_TO:
             if pt._oldCursor:
                 self._canvas.SetCursor(pt._oldCursor)
 
 
         if pt._type == CONTROL_POINT_ENDPOINT_TO:
             if pt._oldCursor:
                 self._canvas.SetCursor(pt._oldCursor)
 
-                if self.GetTo():
-                    self.GetTo().MoveLineToNewAttachment(dc, self, x, y)
+            if self.GetTo():
+                self.GetTo().MoveLineToNewAttachment(dc, self, x, y)
 
     # This is called only when a non-end control point is moved
     def OnMoveMiddleControlPoint(self, dc, lpt, pt):
         lpt._xpos = pt[0]
         lpt._ypos = pt[1]
 
 
     # This is called only when a non-end control point is moved
     def OnMoveMiddleControlPoint(self, dc, lpt, pt):
         lpt._xpos = pt[0]
         lpt._ypos = pt[1]
 
-        lpt._point = pt[0], pt[1]
+        lpt._point[0] = pt[0]
+        lpt._point[1] = pt[1]
 
         self.GetEventHandler().OnMoveLink(dc)
 
 
         self.GetEventHandler().OnMoveLink(dc)
 
@@ -1360,7 +1378,7 @@ class LineShape(Shape):
         """
         for arrow in self._arcArrows:
             if (position == -1 or position == arrow.GetArrowEnd()) and arrow.GetName() == name:
         """
         for arrow in self._arcArrows:
             if (position == -1 or position == arrow.GetArrowEnd()) and arrow.GetName() == name:
-                return arow
+                return arrow
 
         return None
 
 
         return None
 
@@ -1496,12 +1514,7 @@ class LineShape(Shape):
         labelShape._shapeRegion.SetSize(labelShape.GetWidth(), labelShape.GetHeight())
 
         # Find position in line's region list
         labelShape._shapeRegion.SetSize(labelShape.GetWidth(), labelShape.GetHeight())
 
         # Find position in line's region list
-        i = 0
-        for region in self.GetRegions():
-            if labelShape._shapeRegion == region:
-                self.GetRegions().remove(region)
-            else:
-                i += 1
+        i = self._regions.index(labelShape._shapeRegion)
                 
         xx, yy = self.GetLabelPosition(i)
         # Set the region's offset, relative to the default position for
                 
         xx, yy = self.GetLabelPosition(i)
         # Set the region's offset, relative to the default position for