X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ae601e32a8877d7968fd4552ea7857be11a4d15c..f50de1504e002ba3afac3491c8b4817870c850d8:/wxPython/wx/lib/ogl/_lines.py?ds=inline diff --git a/wxPython/wx/lib/ogl/_lines.py b/wxPython/wx/lib/ogl/_lines.py index 74f5b78d74..d316630fbb 100644 --- a/wxPython/wx/lib/ogl/_lines.py +++ b/wxPython/wx/lib/ogl/_lines.py @@ -14,7 +14,7 @@ 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 @@ -220,7 +220,6 @@ class LineShape(Shape): def __del__(self): if self._lineControlPoints: - self.ClearPointList(self._lineControlPoints) 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).""" - if self._lineControlPoints: - self.ClearPointList(self._lineControlPoints) 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) - 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) - 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.""" @@ -345,7 +349,8 @@ class LineShape(Shape): else: y2 = first_point[1] y1 = last_point[1] - self._lineControlPoints[i] = (x2 - x1) / 2.0 + x1, (y2 - y1) / 2.0 + y1 + 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 @@ -490,8 +495,8 @@ class LineShape(Shape): def SetEnds(self, x1, y1, x2, y2): """Set the end positions of the line.""" - self._lineControlPoints[0] = x1, y1 - self._lineControlPoints[-1] = x2, y2 + self._lineControlPoints[0] = wx.RealPoint(x1, y1) + self._lineControlPoints[-1] = wx.RealPoint(x2, y2) # Find centre point self._xpos = (x1 + x2) / 2.0 @@ -503,7 +508,7 @@ class LineShape(Shape): 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 @@ -548,8 +553,8 @@ class LineShape(Shape): 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) @@ -904,20 +909,25 @@ class LineShape(Shape): 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() - first = self._lineControlPoints[0] - last = self._lineControlPoints[-1] - 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) + 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) @@ -949,8 +959,10 @@ class LineShape(Shape): # 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) @@ -1002,7 +1014,6 @@ class LineShape(Shape): for point in self._lineControlPoints: points.append(wx.Point(point[0], point[1])) - #print points if self._isSpline: dc.DrawSpline(points) else: @@ -1091,7 +1102,7 @@ class LineShape(Shape): 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] @@ -1145,8 +1156,9 @@ class LineShape(Shape): 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() @@ -1180,7 +1192,8 @@ class LineShape(Shape): 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() @@ -1216,7 +1229,8 @@ class LineShape(Shape): # 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) @@ -1224,22 +1238,23 @@ class LineShape(Shape): 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 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] - lpt._point = pt[0], pt[1] + lpt._point[0] = pt[0] + lpt._point[1] = pt[1] self.GetEventHandler().OnMoveLink(dc) @@ -1363,7 +1378,7 @@ class LineShape(Shape): """ for arrow in self._arcArrows: if (position == -1 or position == arrow.GetArrowEnd()) and arrow.GetName() == name: - return arow + return arrow return None @@ -1499,12 +1514,7 @@ class LineShape(Shape): 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