@@ -16,12 +16,17 @@ class MoveInfo:
1616 stores move info for a WorldObject
1717 """
1818
19- # last position for an edge, fill, or vertex in world coordinates
20- # can be None, such as key events
21- last_position : Union [np .ndarray , None ]
19+ # The initial selection. Differs per type of selector
20+ start_selection : Any
21+
22+ # The initial world position of the cursor
23+ start_position : np .ndarray | None
24+
25+ # Delta position in world coordinates
26+ delta : np .ndarray
2227
2328 # WorldObject or "key" event
24- source : Union [ WorldObject , str ]
29+ source : WorldObject | str
2530
2631
2732# key bindings used to move the selector
@@ -148,9 +153,6 @@ def __init__(
148153
149154 self ._axis = axis
150155
151- # current delta in world coordinates
152- self .delta : np .ndarray = None
153-
154156 self .arrow_keys_modifier = arrow_keys_modifier
155157 # if not False, moves the slider on every render cycle
156158 self ._key_move_value = False
@@ -278,9 +280,14 @@ def _move_start(self, event_source: WorldObject, ev):
278280 pygfx ``Event``
279281
280282 """
281- last_position = self ._plot_area .map_screen_to_world (ev )
283+ position = self ._plot_area .map_screen_to_world (ev )
282284
283- self ._move_info = MoveInfo (last_position = last_position , source = event_source )
285+ self ._move_info = MoveInfo (
286+ start_selection = None ,
287+ start_position = position ,
288+ delta = np .zeros_like (position ),
289+ source = event_source ,
290+ )
284291 self ._moving = True
285292
286293 self ._initial_controller_state = self ._plot_area .controller .enabled
@@ -303,21 +310,14 @@ def _move(self, ev):
303310 # disable controller during moves
304311 self ._plot_area .controller .enabled = False
305312
306- # get pointer current world position
307- world_pos = self ._plot_area .map_screen_to_world (ev )
308-
309- # outside this viewport
310- if world_pos is None :
311- return
313+ # get pointer current world position, in 'mouse capute mode'
314+ world_pos = self ._plot_area .map_screen_to_world (ev , allow_outside = True )
312315
313- # compute the delta
314- self .delta = world_pos - self ._move_info .last_position
316+ # update the delta
317+ self ._move_info . delta = world_pos - self ._move_info .start_position
315318 self ._pygfx_event = ev
316319
317- self ._move_graphic (self .delta )
318-
319- # update last position
320- self ._move_info .last_position = world_pos
320+ self ._move_graphic (self ._move_info )
321321
322322 # restore the initial controller state
323323 # if it was disabled, keep it disabled
@@ -370,22 +370,26 @@ def _move_to_pointer(self, ev):
370370 if world_pos is None :
371371 return
372372
373- self . delta = world_pos - current_pos_world
373+ delta = world_pos - current_pos_world
374374 self ._pygfx_event = ev
375375
376376 # use fill by default as the source, such as in region selectors
377377 if len (self ._fill ) > 0 :
378- self ._move_info = MoveInfo (
379- last_position = current_pos_world , source = self ._fill [0 ]
378+ move_info = MoveInfo (
379+ start_selection = None ,
380+ start_position = None ,
381+ delta = delta ,
382+ source = self ._fill [0 ],
380383 )
381384 # else use an edge, such as for linear selector
382385 else :
383- self ._move_info = MoveInfo (
384- last_position = current_pos_world , source = self ._edges [0 ]
386+ move_info = MoveInfo (
387+ start_position = current_pos_world ,
388+ last_position = current_pos_world ,
389+ source = self ._edges [0 ],
385390 )
386391
387- self ._move_graphic (self .delta )
388- self ._move_info = None
392+ self ._move_graphic (move_info )
389393
390394 def _pointer_enter (self , ev ):
391395
@@ -428,15 +432,23 @@ def _key_hold(self):
428432 # set event source
429433 # use fill by default as the source
430434 if len (self ._fill ) > 0 :
431- self ._move_info = MoveInfo (last_position = None , source = self ._fill [0 ])
435+ move_info = MoveInfo (
436+ start_selection = None ,
437+ start_position = None ,
438+ delta = delta ,
439+ source = self ._fill [0 ],
440+ )
432441 # else use an edge
433442 else :
434- self ._move_info = MoveInfo (last_position = None , source = self ._edges [0 ])
443+ move_info = MoveInfo (
444+ start_selection = None ,
445+ start_position = None ,
446+ delta = delta ,
447+ source = self ._edges [0 ],
448+ )
435449
436450 # move the graphic
437- self ._move_graphic (delta = delta )
438-
439- self ._move_info = None
451+ self ._move_graphic (move_info )
440452
441453 def _key_down (self , ev ):
442454 # key bind modifier must be set and must be used for the event
@@ -458,8 +470,6 @@ def _key_up(self, ev):
458470 if ev .key in key_bind_direction .keys ():
459471 self ._key_move_value = False
460472
461- self ._move_info = None
462-
463473 def _fpl_prepare_del (self ):
464474 if hasattr (self , "_pfunc_fill" ):
465475 self ._plot_area .renderer .remove_event_handler (
0 commit comments