docs: def draw_transition(self, from_pos, to_pos, width, waypoints=None, selected=False, depth=0):
          """Draw a state with the given properties
  
          This method is called by the controller to draw the specified transition.
  
          :param tuple from_pos: Starting position
          :param tuple to_pos: Ending position
          :param float width: A measure for the width of a transition line
          :param list waypoints: A list of optional waypoints to connect in between
          :param bool selected: Whether the transition shell be shown as active/selected
          :param float depth: The Z layer
          :return: The OpenGL id of the transition
          :rtype: int
          """
          if not waypoints:
              waypoints = []
          # "Generate" unique ID for each object
          id = self.name_counter
          self.name_counter += 1
  
          glPushName(id)
          self._set_closest_stroke_width(width)
  
          color = self.transition_color if not selected else self.transition_selected_color
          color.set()
  
          points = [from_pos]
          points.extend(waypoints)
  
          last_p = to_pos  # Transition endpoint
          sec_last_p = points[len(points) - 1]  # Point before endpoint
          # Calculate max possible arrow length
          length = min(width, dist(sec_last_p, last_p) / 2.)
          mid, p2, p3 = self._calculate_arrow_points(last_p, sec_last_p, length)
          self._draw_triangle(last_p, p2, p3, depth, fill_color=color)
  
          points.append(mid)
  
          # Draw the transitions as simple straight line connecting start- way- and endpoints
          glBegin(GL_LINE_STRIP)
          for point in points:
              glVertex3f(point[0], point[1], depth)
          glEnd()
  
          self._set_closest_stroke_width(width / 1.5)
          for waypoint in waypoints:
              self._draw_circle(waypoint[0], waypoint[1], width / 6., depth + 1, fill_color=color)
  
          glPopName()
  
          return id