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