Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix RangeSelection clipping #217

Merged
merged 3 commits into from Oct 23, 2014
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGES.txt
Expand Up @@ -25,6 +25,7 @@ Fixes
* Avoid a numpy crash when using a data source of a unicode array (PR#213).
* PanTool with `restrict_to_data` selected works with empty data sources
(PR#215).
* RangeSelection properly clips bounds when leaving selection area (PR#217).
* Fix white gap between image border and image (PR#219).
* Fix redraw color mapped image plot when color mapper updates (PR#221)
* Fix behaviour of mappers when stretch_data trait is False (PR#227)
Expand Down
11 changes: 9 additions & 2 deletions chaco/tools/range_selection.py
Expand Up @@ -510,9 +510,16 @@ def selecting_mouse_leave(self, event):

pos = self._get_axis_coord(event)
if pos >= high:
selection_high = self.mapper.map_data(high)
# clip to the boundary appropriate for the mapper's orientation.
if self.mapper.sign == 1:
selection_high = self.mapper.map_data(high)
else:
selection_high = self.mapper.map_data(low)
elif pos <= low:
selection_low = self.mapper.map_data(low)
if self.mapper.sign == 1:
selection_low = self.mapper.map_data(low)
else:
selection_low = self.mapper.map_data(high)

self.selection = (selection_low, selection_high)
event.window.set_pointer("arrow")
Expand Down
57 changes: 57 additions & 0 deletions chaco/tools/tests/range_selection_test_case.py
@@ -0,0 +1,57 @@
import unittest

import numpy as np

from chaco.array_plot_data import ArrayPlotData
from chaco.plot import Plot
from chaco.tools.range_selection import RangeSelection
from enable.testing import EnableTestAssistant


class RangeSelectionTestCase(EnableTestAssistant, unittest.TestCase):

def test_selecting_mouse_leave_clipping(self):
# Regression test for #216.
plot_data = ArrayPlotData()
arr = np.arange(4.0)
plot_data.set_data("x", arr)
plot_data.set_data("y", arr)

for origin in ('bottom left', 'top left', 'bottom right', 'top right'):
for orientation in ('h', 'v'):
for axis in ('index', 'value'):
plot = Plot(
plot_data, orientation=orientation, origin='top right'
)

renderer = plot.plot(('x', 'y'))[0]
renderer.bounds = [10, 20]
tool = RangeSelection(
renderer, left_button_selects=True, axis=axis,
)
renderer.tools.append(tool)

low_x, low_y = plot.position
high_x = low_x + renderer.bounds[0] - 1
high_y = low_y + renderer.bounds[1] - 1

cx = 5
cy = 5

bounds = (
(low_x - 1, low_y),
(high_x + 1, low_y),
(low_x, low_y - 1),
(low_x, high_y + 1),
)
for x, y in bounds:
self.mouse_down(tool, x=cx, y=cy)
self.mouse_leave(tool, x=x, y=y)
selection = tool.selection
self.assertTrue(selection[0] <= selection[1])
self.mouse_up(tool, x=x, y=y)


if __name__ == '__main__':
import nose
nose.run()