def OnMouse(self, event: wx.MouseEvent) -> None:
        pos = event.GetPosition()
        x, y, r = self.ROI
        if event.LeftDClick():
            # Set circle centre
            self.MoveCircle(pos, r)
        elif event.Dragging():
            # Drag circle centre or radius
            drag_r = np.sqrt((x - pos[0])**2 + (y - pos[1])**2)
            if self._dragging is None:
                # determine what to drag
                if drag_r < 0.5 * r:
                    # closer to center
                    self._dragging = "xy"
                else:
                    # closer to edge
                    self._dragging = "r"
            elif self._dragging == "r":
                # Drag circle radius
                self.MoveCircle((x, y), drag_r)
            elif self._dragging == "xy":
                # Drag circle centre
                self.MoveCircle(pos, r)

        if not event.Dragging():
            # Stop dragging
            self._dragging = None
            self.circle.SetColor("cyan")

        self.canvas.Draw(Force=True)
Ejemplo n.º 2
0
    def on_mouse_motion(self, evt: wx.MouseEvent):
        # Dragging
        if evt.Dragging() and evt.LeftIsDown():
            if self.selected < 0:
                return
            drag_end_x, drag_end_y = evt.GetPosition()
            control_points = self.tfunc.control_points
            w, h = self.GetSize()
            h = h - 30

            if self.selected == 0 or self.selected == len(control_points) - 1:
                cp = self.get_control_point_area(control_points[self.selected])
                drag_end_x = cp.get_center_x()
                if drag_end_y < 0:
                    drag_end_y = 0
                if drag_end_y > h:
                    drag_end_y = h
            else:
                left_point = self.get_control_point_area(
                    control_points[self.selected - 1])
                right_point = self.get_control_point_area(
                    control_points[self.selected + 1])

                if drag_end_x <= left_point.get_center_x() + 1:
                    drag_end_x = left_point.get_center_x() + 2
                if drag_end_x >= right_point.get_center_x() - 1:
                    drag_end_x = right_point.get_center_x() - 2
                if drag_end_y < 0:
                    drag_end_y = 0
                if drag_end_y > h:
                    drag_end_y = h

            value_range = self.tfunc.sMax - self.tfunc.sMin
            minimum = self.tfunc.sMin
            t = drag_end_x / w
            s = int((t * value_range) + minimum)
            a = (h - drag_end_y) / h

            self.tfunc.update_control_point_scalar(self.selected, s)
            self.tfunc.update_control_point_alpha(self.selected, a)
            self.editor.set_selected_info(self.selected, s, a,
                                          control_points[self.selected].color)
            self.Refresh()
        # Moving around
        else:
            x, y = evt.GetPosition()
            control_points = self.tfunc.control_points
            if any(
                    self.get_control_point_area(cp).contains(x, y)
                    for cp in control_points):
                self.SetCursor(wx.Cursor(wx.CURSOR_HAND))
            else:
                self.SetCursor(wx.Cursor(wx.CURSOR_DEFAULT))
Ejemplo n.º 3
0
    def on_mouse(self, event: wx.MouseEvent) -> None:
        """Handle mouse events.

        Args:
            event: A wx.MouseEvent.
                LMB drag:   move viewport
                RMB drag:   unused
                LMB/RMB up: reset position

        TODO: make this more robust, and capable of handling selection
        """
        if not self._gl_initialized or not self._set_current():
            return

        scale = self.get_scale_factor()
        event.x *= scale
        event.y *= scale

        if event.Dragging():
            if event.LeftIsDown():
                self.rotate_camera(event, orbit=self.orbit_control)
            elif event.RightIsDown() or event.MiddleIsDown():
                self.translate_camera(event)

        elif event.LeftUp() or event.MiddleUp() or event.RightUp():
            pass

        elif event.Entering():
            self._inside = True

        elif event.Leaving():
            self._inside = False

        elif event.Moving():
            self._mouse_pos = event.Position

        else:
            event.Skip()

        self._dirty = True