|
10 | 10 | from glue.core.roi import RectangularROI, RangeROI, CircularROI, EllipticalROI, PolygonalROI
|
11 | 11 | from glue.core.subset import RoiSubsetState
|
12 | 12 | from glue.config import viewer_tool
|
13 |
| -from glue.viewers.common.tool import Tool, CheckableTool |
| 13 | +from glue.viewers.common.tool import CheckableTool |
14 | 14 | from packaging.version import Version
|
15 | 15 |
|
16 | 16 | GLUE_LT_1_11 = Version(glue_version) < Version("1.11")
|
@@ -728,49 +728,40 @@ def activate(self):
|
728 | 728 |
|
729 | 729 |
|
730 | 730 | @viewer_tool
|
731 |
| -class PointSelectTool(Tool): |
| 731 | +class PointSelectTool(InteractCheckableTool): |
732 | 732 | tool_id = 'bqplot:point'
|
733 | 733 | icon = 'glue_point'
|
734 | 734 | action_text = 'Point'
|
735 | 735 | tool_tip = 'Select a single pixel based on the mouse location'
|
736 | 736 |
|
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) |
744 | 739 |
|
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) |
748 | 743 |
|
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 |
751 | 747 |
|
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: |
757 | 750 | 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 |
758 | 755 |
|
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() |
772 | 760 |
|
773 | 761 | 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() |
775 | 766 |
|
776 | 767 |
|
0 commit comments