1
""" The base class for moveable shapes. """
4
# Standard library imports.
7
# Enthought library imports.
8
from enthought.enable.api import ColorTrait, Component, Pointer
9
from enthought.kiva import Font, MODERN
10
from enthought.traits.api import Float, Property, Str, Tuple
13
class Shape(Component):
14
""" The base class for moveable shapes. """
16
#### 'Component' interface ################################################
18
# The background color of this component.
19
bgcolor = 'transparent'
21
#### 'Shape' interface ####################################################
23
# The coordinates of the centre of the shape.
24
centre = Property(Tuple)
27
fill_color = ColorTrait
29
# The pointer for the 'normal' event state.
30
normal_pointer = Pointer('arrow')
32
# The pointer for the 'moving' event state.
33
moving_pointer = Pointer('hand')
36
text_color = ColorTrait
38
# The text displayed in the shape.
41
#### 'Private' interface ##################################################
43
# The difference between the location of a mouse-click and the component's
48
###########################################################################
49
# 'Interactor' interface
50
###########################################################################
52
def normal_key_pressed(self, event):
53
""" Event handler. """
55
print 'normal_key_pressed', event.character
59
def normal_left_down(self, event):
60
""" Event handler. """
62
if self.is_in(event.x, event.y):
63
self.event_state = 'moving'
65
event.window.mouse_owner = self
66
event.window.set_pointer(self.moving_pointer)
68
self._offset_x = event.x - self.x
69
self._offset_y = event.y - self.y
71
self.container.bring_to_top(self)
75
def moving_mouse_move(self, event):
76
""" Event handler. """
78
self.position = [event.x - self._offset_x, event.y - self._offset_y]
83
def moving_left_up(self, event):
84
""" Event handler. """
86
self.event_state = 'normal'
88
event.window.set_pointer(self.normal_pointer)
89
event.window.mouse_owner = None
95
def moving_mouse_leave(self, event):
96
""" Event handler. """
98
self.moving_left_up(event)
102
###########################################################################
104
###########################################################################
106
def _get_centre(self):
107
""" Property getter. """
110
ox, oy = self.position
117
def _text_default(self):
118
""" Trait initializer. """
120
return type(self).__name__
122
###########################################################################
123
# Protected 'Shape' interface
124
###########################################################################
126
def _distance_between(self, (x1, y1), (x2, y2)):
127
""" Return the distance between two points. """
129
return math.sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2))
131
def _draw_text(self, gc):
132
""" Draw the shape's text. """
134
if len(self.text) > 0:
135
gc.set_fill_color(self._get_text_color(self.event_state))
137
gc.set_font(Font(family=MODERN, size=16))
138
tx, ty, tw, th = gc.get_text_extent(self.text)
142
gc.set_text_position(x+(dx-tw)/2, y+(dy-th)/2)
144
gc.show_text(self.text)
148
def _get_fill_color(self, event_state):
149
""" Return the fill color based on the event state. """
151
if event_state == 'normal':
152
fill_color = self.fill_color_
155
r, g, b, a = self.fill_color_
156
fill_color = (r, g, b, 0.5)
160
def _get_text_color(self, event_state):
161
""" Return the text color based on the event state. """
163
if event_state == 'normal':
164
text_color = self.text_color_
167
r, g, b, a = self.text_color_
168
text_color = (r, g, b, 0.5)
172
#### EOF ######################################################################