Skip to content

Commit 351fb13

Browse files
committed
Add PointSelectTool class
1 parent 03528d3 commit 351fb13

File tree

1 file changed

+24
-33
lines changed

1 file changed

+24
-33
lines changed

glue_jupyter/bqplot/common/tools.py

Lines changed: 24 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from glue.core.roi import RectangularROI, RangeROI, CircularROI, EllipticalROI, PolygonalROI
1111
from glue.core.subset import RoiSubsetState
1212
from glue.config import viewer_tool
13-
from glue.viewers.common.tool import Tool, CheckableTool
13+
from glue.viewers.common.tool import CheckableTool
1414
from packaging.version import Version
1515

1616
GLUE_LT_1_11 = Version(glue_version) < Version("1.11")
@@ -728,49 +728,40 @@ def activate(self):
728728

729729

730730
@viewer_tool
731-
class PointSelectTool(Tool):
731+
class PointSelectTool(InteractCheckableTool):
732732
tool_id = 'bqplot:point'
733733
icon = 'glue_point'
734734
action_text = 'Point'
735735
tool_tip = 'Select a single pixel based on the mouse location'
736736

737-
_pressed = False
738-
739-
def __init__(self, *args, **kwargs):
740-
super().__init__(*args, **kwargs)
741-
self._move_callback = self._select_pixel
742-
self._press_callback = self._on_press
743-
self._release_callback = self._on_release
737+
def __init__(self, viewer, finalize_callback=None, **kwargs):
738+
super().__init__(viewer, **kwargs)
744739

745-
def _on_press(self, mode):
746-
self._pressed = True
747-
self.viewer.session.edit_subset_mode = ReplaceMode
740+
self.interact = BrushSelector(x_scale=self.viewer.scale_x,
741+
y_scale=self.viewer.scale_y,
742+
color=INTERACT_COLOR)
748743

749-
def _on_release(self, mode):
750-
self._pressed = False
744+
self.interact.observe(self.update_selection, "brushing")
745+
self.interact.observe(self.on_selection_change, "selected")
746+
self.finalize_callback = finalize_callback
751747

752-
def _select_pixel(self, mode):
753-
"""
754-
Select a pixel based on the mouse location
755-
"""
756-
if not self._pressed:
748+
def update_selection(self, *args):
749+
if self.interact.brushing:
757750
return
751+
with self.viewer._output_widget or nullcontext():
752+
if self.interact.selected_x is not None and self.interact.selected_y is not None:
753+
x = self.interact.selected_x
754+
y = self.interact.selected_y
758755

759-
x, y = self._event_xdata, self.event_ydata
760-
761-
if x is None or y is None:
762-
return None
763-
764-
x = int(round(x))
765-
y = int(round(y))
766-
767-
slices = [slice(None)] * self.viewer.state.reference_data.ndim
768-
slices[self.viewer.state.x_att.axis] = slice(x, x + 1)
769-
slices[self.viewer.state.y_att.axis] = slice(y, y + 1)
770-
771-
subset_state = PixelSubsetState(self.viewr.state.reference_data, slices)
756+
def on_selection_change(self, *args):
757+
if self.interact.selected_x is None and self.interact.selected_y is None:
758+
if self.finalize_callback is not None:
759+
self.finalize_callback()
772760

773761
def activate(self):
774-
self.viewer.state.reset_limits()
762+
with self.viewer._output_widget or nullcontext():
763+
self.interact.selected_x = None
764+
self.interact.selected_y = None
765+
super().activate()
775766

776767

0 commit comments

Comments
 (0)