/usr/lib/python2.7/dist-packages/enable/compass.py is in python-enable 4.1.0-1ubuntu3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 | from __future__ import with_statement
from numpy import array, pi
# Enthought library imports
from traits.api import Bool, Enum, Float, Int
# Local, relative imports
from component import Component
from colors import ColorTrait
class Compass(Component):
""" A compass with triangles at the 4 cardinal directions. The center
of the compass of triangles is the center of the widget.
"""
# Which triangle was clicked
clicked = Enum(None, "n", "e", "s", "w", "c")
# Whether or not to allow clicks on the center
enable_center = Bool(False)
#------------------------------------------------------------------------
# Shape and layout
#------------------------------------------------------------------------
# The length of the triangle from tip to base
triangle_length = Int(11)
# The width of the base of the triangle
triangle_width = Int(8)
# Overall scaling factor for the triangle. Note that this also scales
# the outline width.
scale = Float(1.0)
# The distance from the center of the widget to the center of each triangle
# (halfway along its length, not the orthocenter).
spacing = Int(12)
#------------------------------------------------------------------------
# Appearance Traits
#------------------------------------------------------------------------
# The line color of the triangles
color = ColorTrait("black")
# The line width of the triangles
line_width = Int(2)
# The triangle fill color when the mouse has not been clicked
fill_color = ColorTrait("none")
# The fill color of the triangle that the user has clicked on
clicked_color = ColorTrait("lightgray")
# Override the inherited **event_state** attribute
event_state = Enum("normal", "clicked")
#------------------------------------------------------------------------
# Stub methods for subclasses
#------------------------------------------------------------------------
def mouse_down(self, arrow):
""" Called when the mouse is first pressed inside one of the
triangles. This gets called after self.clicked is set.
Parameters
==========
arrow: "n", "e", "s", "w"
indicates which arrow was pressed
"""
pass
def mouse_up(self):
""" Called when the mouse is released. This gets called after
self.clicked is unset.
"""
pass
#------------------------------------------------------------------------
# Event handling methods
#------------------------------------------------------------------------
def normal_left_down(self, event):
# Determine which arrow was clicked; use a rectangular approximation.
x = event.x - (self.x + self.width / 2)
y = event.y - (self.y + self.height / 2)
half_length = self.triangle_length / 2 * self.scale
half_width = self.triangle_width / 2 * self.scale
offset = self.spacing * self.scale
# Create dict mapping direction to (x, y, x2, y2)
near = offset - half_length
far = offset + half_length
rects = { "n": array((-half_width, near, half_width, far)),
"e": array((near, -half_width, far, half_width)),
"s": array((-half_width, -far, half_width, -near)),
"w": array((-far, -half_width, -near, half_width)) }
if self.enable_center:
rects["c"] = array((-near, -near, near, near))
for direction, rect in rects.items():
if (rect[0] <= x <= rect[2]) and (rect[1] <= y <= rect[3]):
self.event_state = "clicked"
self.clicked = direction
self.mouse_down(direction)
self.request_redraw()
break
event.handled = True
return
def normal_left_dclick(self, event):
return self.normal_left_down(event)
def clicked_left_up(self, event):
self.event_state = "normal"
self.clicked = None
event.handled = True
self.mouse_up()
self.request_redraw()
def clicked_mouse_leave(self, event):
self.clicked_left_up(event)
#------------------------------------------------------------------------
# Rendering methods
#------------------------------------------------------------------------
def get_preferred_size(self):
# Since we can compute our preferred size from the size of the
# arrows and the spacing, we can return a sensible preferred
# size, so override the default implementation in Component.
if self.fixed_preferred_size is not None:
return self.fixed_preferred_size
else:
extent = self.scale * 2 * (self.spacing + self.triangle_length/2)
return [extent + self.hpadding, extent + self.vpadding]
def _draw_mainlayer(self, gc, view_bounds=None, mode="normal"):
with gc:
gc.set_stroke_color(self.color_)
gc.set_line_width(self.line_width)
gc.translate_ctm(self.x + self.width/2, self.y + self.height/2)
s = self.spacing
points_and_angles = [ ("n", (0, s), 0),
("e", (s, 0), -pi/2),
("s", (0, -s), pi),
("w", (-s, 0), pi/2) ]
gc.scale_ctm(self.scale, self.scale)
for dir, (dx,dy), angle in points_and_angles:
if self.event_state == "clicked" and self.clicked == dir:
gc.set_fill_color(self.clicked_color_)
else:
gc.set_fill_color(self.fill_color_)
gc.translate_ctm(dx, dy)
gc.rotate_ctm(angle)
half_height = self.triangle_length / 2
half_width = self.triangle_width / 2
gc.begin_path()
gc.lines( [(-half_width, -half_height),
(0, half_height),
(half_width, -half_height),
(-half_width, -half_height),
(0, half_height)] )
gc.draw_path()
gc.rotate_ctm(-angle)
gc.translate_ctm(-dx, -dy)
if self.event_state == "clicked" and self.clicked == 'c':
# Fill in the center
gc.set_fill_color(self.clicked_color_)
half_width = self.triangle_width / 2
gc.begin_path()
gc.lines( [(-half_width, -half_width),
(half_width, -half_height),
(half_width, half_width),
(-half_width, half_width),
(-half_width, -half_width)] )
gc.draw_path()
|