/usr/lib/python2.7/dist-packages/chaco/tools/scatter_inspector.py is in python-chaco 4.4.1-1.2.
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 | """ Defines the ScatterInspector tool class.
"""
# Enthought library imports
from traits.api import Bool, Str
# Local, relative imports
from select_tool import SelectTool
class ScatterInspector(SelectTool):
""" A tool for inspecting scatter plots.
It writes the index of the point under the cursor to the metadata of the
index and value data sources, and allows clicking to select the point.
Other components can listen for metadata updates on the data sources.
By default, it writes the index of the point under the cursor to the "hover"
key in metadata, and the index of a clicked point to "selection".
"""
# If persistent_hover is False, then a point will be de-hovered as soon as
# the mouse leaves its hittesting area. If persistent_hover is True, then
# a point does no de-hover until another point get hover focus.
persistent_hover = Bool(False)
# The names of the data source metadata for hover and selection.
hover_metadata_name = Str('hover')
selection_metadata_name = Str('selections')
#------------------------------------------------------------------------
# Override/configure inherited traits
#------------------------------------------------------------------------
# This tool is not visible
visible = False
# This tool does not have a visual reprentation
draw_mode = "none"
def normal_mouse_move(self, event):
""" Handles the mouse moving when the tool is in the 'normal' state.
If the cursor is within **threshold** of a data point, the method
writes the index to the plot's data sources' "hover" metadata.
"""
plot = self.component
index = plot.map_index((event.x, event.y), threshold=self.threshold)
if index is not None:
plot.index.metadata[self.hover_metadata_name] = [index]
if hasattr(plot, "value"):
plot.value.metadata[self.hover_metadata_name] = [index]
elif not self.persistent_hover:
plot.index.metadata.pop(self.hover_metadata_name, None)
if hasattr(plot, "value"):
plot.value.metadata.pop(self.hover_metadata_name, None)
return
def _get_selection_state(self, event):
plot = self.component
index = plot.map_index((event.x, event.y), threshold=self.threshold)
#index_md = plot.index.metadata.get(self.selection_metadata_name, None)
#value_md = plot.value.metadata.get(self.selection_metadata_name, None)
already_selected = False
for name in ('index', 'value'):
if not hasattr(plot, name):
continue
md = getattr(plot, name).metadata
if md is None or self.selection_metadata_name not in md:
continue
if index in md[self.selection_metadata_name]:
already_selected = True
break
return already_selected, (index is not None)
def _get_selection_token(self, event):
plot = self.component
index = plot.map_index((event.x, event.y), threshold=self.threshold)
return index
def _deselect(self, index=None):
""" Deselects a particular index. If no index is given, then
deselects all points.
"""
plot = self.component
for name in ('index', 'value'):
if not hasattr(plot, name):
continue
md = getattr(plot, name).metadata
if not self.selection_metadata_name in md:
pass
elif index in md[self.selection_metadata_name]:
new_list = md[self.selection_metadata_name][:]
new_list.remove(index)
md[self.selection_metadata_name] = new_list
getattr(plot, name).metadata_changed = True
return
def _select(self, index, append=True):
plot = self.component
for name in ('index', 'value'):
if not hasattr(plot, name):
continue
md = getattr(plot, name).metadata
selection = md.get(self.selection_metadata_name, None)
# If no existing selection
if selection is None:
md[self.selection_metadata_name] = [index]
# check for list-like object supporting append
else:
if append:
if index not in md[self.selection_metadata_name]:
new_list = md[self.selection_metadata_name] + [index]
md[self.selection_metadata_name] = new_list
# Manually trigger the metadata_changed event on
# the datasource. Datasources only automatically
# fire notifications when the values inside the
# metadata dict change, but they do not listen
# for further changes on those values.
getattr(plot, name).metadata_changed = True
else:
md[self.selection_metadata_name] = [index]
return
# EOF
|