1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
|
""" A drag drawn line. """
from __future__ import with_statement
from enable.api import Line
from traits.api import Instance
from drawing_tool import DrawingTool
class DragLine(DrawingTool):
"""
A drag drawn line. This is not a straight line, but can be a free-form,
curved path.
"""
# Override the vertex color so as to not draw it.
vertex_color = (0.0, 0.0, 0.0, 0.0)
# Because this class subclasses DrawingTool and not Line, it contains
# an instance of the Line primitive.
line = Instance(Line, args=())
# Override the default value of this inherited trait
draw_mode="overlay"
def reset(self):
self.line.vertex_color = self.vertex_color
self.line.points = []
self.event_state = "normal"
return
#------------------------------------------------------------------------
# "complete" state
#------------------------------------------------------------------------
def complete_draw(self, gc):
""" Draw the completed line. """
self.line.line_dash = None
self.line._draw_mainlayer(gc)
return
#------------------------------------------------------------------------
# "drawing" state
#------------------------------------------------------------------------
def drawing_draw(self, gc):
self.line.line_dash = (4.0, 2.0)
self.line._draw_mainlayer(gc)
return
def drawing_left_up(self, event):
""" Handle the left mouse button coming up in the 'drawing' state. """
self.event_state = 'complete'
event.window.set_pointer('arrow')
self.request_redraw()
self.complete = True
event.handled = True
return
def drawing_mouse_move(self, event):
""" Handle the mouse moving in 'drawing' state. """
last_point = self.line.points[-1]
# If we have moved, we need to add a point.
if last_point != (event.x + self.x, event.y - self.y):
self.line.points.append((event.x + self.x, event.y - self.y))
self.request_redraw()
return
#------------------------------------------------------------------------
# "normal" state
#------------------------------------------------------------------------
def normal_left_down(self, event):
""" Handle the left button down in the 'normal' state. """
self.line.points.append((event.x + self.x, event.y - self.y))
self.event_state = 'drawing'
event.window.set_pointer('pencil')
event.handled = True
self.request_redraw()
return
|