9
9
import numpy as np
10
10
import pytest
11
11
12
- from ndv ._types import MouseButton , MouseMoveEvent , MousePressEvent , MouseReleaseEvent
12
+ from ndv ._types import (
13
+ CursorType ,
14
+ MouseButton ,
15
+ MouseMoveEvent ,
16
+ MousePressEvent ,
17
+ MouseReleaseEvent ,
18
+ )
13
19
from ndv .controllers import ArrayViewer
14
20
from ndv .controllers ._channel_controller import ChannelController
15
21
from ndv .models ._array_display_model import ArrayDisplayModel , ChannelMode
@@ -309,18 +315,21 @@ def test_roi_interaction() -> None:
309
315
return
310
316
311
317
ctrl = ArrayViewer ()
318
+ roi = RectangularROIModel (bounding_box = ((0 , 0 ), (3000 , 3000 )))
319
+ ctrl .roi = roi
320
+ roi_view = ctrl ._roi_view
321
+ assert roi_view is not None
312
322
313
- canvas_roi_start = (0 , 0 )
323
+ # Note that these positions are far apart to satisfy sufficient distance
324
+ # in world space
325
+ ctrl ._canvas .set_range ()
326
+ canvas_roi_start = (200 , 200 )
314
327
world_roi_start = tuple (ctrl ._canvas .canvas_to_world (canvas_roi_start )[:2 ])
315
- canvas_new_start = (- 100 , - 100 )
328
+ canvas_new_start = (100 , 100 )
316
329
world_new_start = tuple (ctrl ._canvas .canvas_to_world (canvas_new_start )[:2 ])
317
- canvas_roi_end = (100 , 100 )
330
+ canvas_roi_end = (300 , 300 )
318
331
world_roi_end = tuple (ctrl ._canvas .canvas_to_world (canvas_roi_end )[:2 ])
319
-
320
- roi = RectangularROIModel (bounding_box = (world_roi_start , world_roi_end ))
321
- ctrl .roi = roi
322
- roi_view = ctrl ._roi_view
323
- assert roi_view is not None
332
+ roi .bounding_box = (world_roi_start , world_roi_end )
324
333
325
334
# Note - avoid diving into rendering logic here - just identify view
326
335
with patch .object (ctrl ._canvas , "elements_at" , return_value = [ctrl ._roi_view ]):
@@ -339,3 +348,42 @@ def test_roi_interaction() -> None:
339
348
canvas_new_start [0 ], canvas_new_start [1 ], MouseButton .LEFT
340
349
)
341
350
ctrl ._canvas .on_mouse_release (mre )
351
+
352
+ # Test translation
353
+ roi .bounding_box = (world_roi_start , world_roi_end )
354
+ mpe = MousePressEvent (
355
+ (canvas_roi_start [0 ] + canvas_roi_end [0 ] / 2 ),
356
+ (canvas_roi_start [1 ] + canvas_roi_end [1 ] / 2 ),
357
+ MouseButton .LEFT ,
358
+ )
359
+ ctrl ._canvas .on_mouse_press (mpe )
360
+ assert roi_view .selected ()
361
+ mme = MouseMoveEvent (
362
+ (canvas_roi_start [0 ] + canvas_new_start [0 ] / 2 ),
363
+ (canvas_roi_start [1 ] + canvas_new_start [1 ] / 2 ),
364
+ MouseButton .LEFT ,
365
+ )
366
+ ctrl ._canvas .on_mouse_move (mme )
367
+ assert roi .bounding_box [0 ] == pytest .approx (world_new_start , 1e-6 )
368
+ assert roi .bounding_box [1 ] == pytest .approx (world_roi_start , 1e-6 )
369
+ mre = MouseReleaseEvent (
370
+ (canvas_roi_start [0 ] + canvas_new_start [0 ] / 2 ),
371
+ (canvas_roi_start [1 ] + canvas_new_start [1 ] / 2 ),
372
+ MouseButton .LEFT ,
373
+ )
374
+ ctrl ._canvas .on_mouse_release (mre )
375
+
376
+ # Test cursors
377
+ roi .bounding_box = (world_roi_start , world_roi_end )
378
+ # Top-Left corner
379
+ mme = MouseMoveEvent (canvas_roi_start [0 ], canvas_roi_start [1 ])
380
+ assert roi_view .get_cursor (mme ) == CursorType .FDIAG_ARROW
381
+ # Top-Right corner
382
+ mme = MouseMoveEvent (canvas_roi_start [0 ], canvas_roi_end [1 ])
383
+ assert roi_view .get_cursor (mme ) == CursorType .BDIAG_ARROW
384
+ # Middle
385
+ mme = MouseMoveEvent (
386
+ (canvas_roi_start [0 ] + canvas_roi_end [0 ]) / 2 ,
387
+ (canvas_roi_start [1 ] + canvas_roi_end [1 ]) / 2 ,
388
+ )
389
+ assert roi_view .get_cursor (mme ) == CursorType .ALL_ARROW
0 commit comments