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)
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))
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