@@ -55,6 +55,19 @@ def test_rectangle_selector():
5555 check_rectangle (props = dict (fill = True ))
5656
5757
58+ def _resize_rectangle (tool , xdata , ydata , xdata_new , ydata_new ,
59+ use_key = None ):
60+ do_event (tool , 'press' , xdata = xdata , ydata = ydata , button = 1 )
61+ if use_key is not None :
62+ do_event (tool , 'on_key_press' , key = use_key )
63+ do_event (tool , 'onmove' , xdata = xdata_new , ydata = ydata_new , button = 1 )
64+ if use_key is not None :
65+ do_event (tool , 'on_key_release' , key = use_key )
66+ do_event (tool , 'release' , xdata = xdata_new , ydata = ydata_new , button = 1 )
67+
68+ return tool
69+
70+
5871@pytest .mark .parametrize ('drag_from_anywhere, new_center' ,
5972 [[True , (60 , 75 )],
6073 [False , (30 , 20 )]])
@@ -118,6 +131,260 @@ def onselect(epress, erelease):
118131 assert artist .get_alpha () == 0.3
119132
120133
134+ def test_rectangle_resize ():
135+ ax = get_ax ()
136+
137+ def onselect (epress , erelease ):
138+ pass
139+
140+ tool = widgets .RectangleSelector (ax , onselect , interactive = True )
141+ # Create rectangle
142+ _resize_rectangle (tool , 0 , 10 , 100 , 120 )
143+ assert tool .extents == (0.0 , 100.0 , 10.0 , 120.0 )
144+
145+ # resize NE handle
146+ extents = tool .extents
147+ xdata , ydata = extents [1 ], extents [3 ]
148+ xdata_new , ydata_new = xdata + 10 , ydata + 5
149+ _resize_rectangle (tool , xdata , ydata , xdata_new , ydata_new )
150+ assert tool .extents == (extents [0 ], xdata_new , extents [2 ], ydata_new )
151+
152+ # resize E handle
153+ extents = tool .extents
154+ xdata , ydata = extents [1 ], extents [2 ] + (extents [3 ] - extents [2 ]) / 2
155+ xdata_new , ydata_new = xdata + 10 , ydata
156+ _resize_rectangle (tool , xdata , ydata , xdata_new , ydata_new )
157+ assert tool .extents == (extents [0 ], xdata_new , extents [2 ], extents [3 ])
158+
159+ # resize W handle
160+ extents = tool .extents
161+ xdata , ydata = extents [0 ], extents [2 ] + (extents [3 ] - extents [2 ]) / 2
162+ xdata_new , ydata_new = xdata + 15 , ydata
163+ _resize_rectangle (tool , xdata , ydata , xdata_new , ydata_new )
164+ assert tool .extents == (xdata_new , extents [1 ], extents [2 ], extents [3 ])
165+
166+ # resize SW handle
167+ extents = tool .extents
168+ xdata , ydata = extents [0 ], extents [2 ]
169+ xdata_new , ydata_new = xdata + 20 , ydata + 25
170+ _resize_rectangle (tool , xdata , ydata , xdata_new , ydata_new )
171+ assert tool .extents == (xdata_new , extents [1 ], ydata_new , extents [3 ])
172+
173+
174+ @pytest .mark .parametrize ('use_default_state' , [True , False ])
175+ def test_rectangle_resize_center (use_default_state ):
176+ ax = get_ax ()
177+
178+ def onselect (epress , erelease ):
179+ pass
180+
181+ tool = widgets .RectangleSelector (ax , onselect , interactive = True )
182+ # Create rectangle
183+ _resize_rectangle (tool , 70 , 65 , 125 , 130 )
184+ assert tool .extents == (70.0 , 125.0 , 65.0 , 130.0 )
185+
186+ if use_default_state :
187+ tool ._default_state .add ('center' )
188+ use_key = None
189+ else :
190+ use_key = 'control'
191+
192+ # resize NE handle
193+ extents = tool .extents
194+ xdata , ydata = extents [1 ], extents [3 ]
195+ xdiff , ydiff = 10 , 5
196+ xdata_new , ydata_new = xdata + xdiff , ydata + ydiff
197+ _resize_rectangle (tool , xdata , ydata , xdata_new , ydata_new , use_key )
198+ assert tool .extents == (extents [0 ] - xdiff , xdata_new ,
199+ extents [2 ] - ydiff , ydata_new )
200+
201+ # resize E handle
202+ extents = tool .extents
203+ xdata , ydata = extents [1 ], extents [2 ] + (extents [3 ] - extents [2 ]) / 2
204+ xdiff = 10
205+ xdata_new , ydata_new = xdata + xdiff , ydata
206+ _resize_rectangle (tool , xdata , ydata , xdata_new , ydata_new , use_key )
207+ assert tool .extents == (extents [0 ] - xdiff , xdata_new ,
208+ extents [2 ], extents [3 ])
209+
210+ # resize E handle negative diff
211+ extents = tool .extents
212+ xdata , ydata = extents [1 ], extents [2 ] + (extents [3 ] - extents [2 ]) / 2
213+ xdiff = - 20
214+ xdata_new , ydata_new = xdata + xdiff , ydata
215+ _resize_rectangle (tool , xdata , ydata , xdata_new , ydata_new , use_key )
216+ assert tool .extents == (extents [0 ] - xdiff , xdata_new ,
217+ extents [2 ], extents [3 ])
218+
219+ # resize W handle
220+ extents = tool .extents
221+ xdata , ydata = extents [0 ], extents [2 ] + (extents [3 ] - extents [2 ]) / 2
222+ xdiff = 15
223+ xdata_new , ydata_new = xdata + xdiff , ydata
224+ _resize_rectangle (tool , xdata , ydata , xdata_new , ydata_new , use_key )
225+ assert tool .extents == (xdata_new , extents [1 ] - xdiff ,
226+ extents [2 ], extents [3 ])
227+
228+ # resize W handle negative diff
229+ extents = tool .extents
230+ xdata , ydata = extents [0 ], extents [2 ] + (extents [3 ] - extents [2 ]) / 2
231+ xdiff = - 25
232+ xdata_new , ydata_new = xdata + xdiff , ydata
233+ _resize_rectangle (tool , xdata , ydata , xdata_new , ydata_new , use_key )
234+ assert tool .extents == (xdata_new , extents [1 ] - xdiff ,
235+ extents [2 ], extents [3 ])
236+
237+ # resize SW handle
238+ extents = tool .extents
239+ xdata , ydata = extents [0 ], extents [2 ]
240+ xdiff , ydiff = 20 , 25
241+ xdata_new , ydata_new = xdata + xdiff , ydata + ydiff
242+ _resize_rectangle (tool , xdata , ydata , xdata_new , ydata_new , use_key )
243+ assert tool .extents == (xdata_new , extents [1 ] - xdiff ,
244+ ydata_new , extents [3 ] - ydiff )
245+
246+
247+ @pytest .mark .parametrize ('use_default_state' , [True , False ])
248+ def test_rectangle_resize_square (use_default_state ):
249+ ax = get_ax ()
250+
251+ def onselect (epress , erelease ):
252+ pass
253+
254+ tool = widgets .RectangleSelector (ax , onselect , interactive = True )
255+ # Create rectangle
256+ _resize_rectangle (tool , 70 , 65 , 120 , 115 )
257+ assert tool .extents == (70.0 , 120.0 , 65.0 , 115.0 )
258+
259+ if use_default_state :
260+ tool ._default_state .add ('square' )
261+ use_key = None
262+ else :
263+ use_key = 'shift'
264+
265+ # resize NE handle
266+ extents = tool .extents
267+ xdata , ydata = extents [1 ], extents [3 ]
268+ xdiff , ydiff = 10 , 5
269+ xdata_new , ydata_new = xdata + xdiff , ydata + ydiff
270+ _resize_rectangle (tool , xdata , ydata , xdata_new , ydata_new , use_key )
271+ assert tool .extents == (extents [0 ], xdata_new ,
272+ extents [2 ], extents [3 ] + xdiff )
273+
274+ # resize E handle
275+ extents = tool .extents
276+ xdata , ydata = extents [1 ], extents [2 ] + (extents [3 ] - extents [2 ]) / 2
277+ xdiff = 10
278+ xdata_new , ydata_new = xdata + xdiff , ydata
279+ _resize_rectangle (tool , xdata , ydata , xdata_new , ydata_new , use_key )
280+ assert tool .extents == (extents [0 ], xdata_new ,
281+ extents [2 ], extents [3 ] + xdiff )
282+
283+ # resize E handle negative diff
284+ extents = tool .extents
285+ xdata , ydata = extents [1 ], extents [2 ] + (extents [3 ] - extents [2 ]) / 2
286+ xdiff = - 20
287+ xdata_new , ydata_new = xdata + xdiff , ydata
288+ _resize_rectangle (tool , xdata , ydata , xdata_new , ydata_new , use_key )
289+ assert tool .extents == (extents [0 ], xdata_new ,
290+ extents [2 ], extents [3 ] + xdiff )
291+
292+ # resize W handle
293+ extents = tool .extents
294+ xdata , ydata = extents [0 ], extents [2 ] + (extents [3 ] - extents [2 ]) / 2
295+ xdiff = 15
296+ xdata_new , ydata_new = xdata + xdiff , ydata
297+ _resize_rectangle (tool , xdata , ydata , xdata_new , ydata_new , use_key )
298+ assert tool .extents == (xdata_new , extents [1 ],
299+ extents [2 ], extents [3 ] - xdiff )
300+
301+ # resize W handle negative diff
302+ extents = tool .extents
303+ xdata , ydata = extents [0 ], extents [2 ] + (extents [3 ] - extents [2 ]) / 2
304+ xdiff = - 25
305+ xdata_new , ydata_new = xdata + xdiff , ydata
306+ _resize_rectangle (tool , xdata , ydata , xdata_new , ydata_new , use_key )
307+ assert tool .extents == (xdata_new , extents [1 ],
308+ extents [2 ], extents [3 ] - xdiff )
309+
310+ # resize SW handle
311+ extents = tool .extents
312+ xdata , ydata = extents [0 ], extents [2 ]
313+ xdiff , ydiff = 20 , 25
314+ xdata_new , ydata_new = xdata + xdiff , ydata + ydiff
315+ _resize_rectangle (tool , xdata , ydata , xdata_new , ydata_new , use_key )
316+ assert tool .extents == (extents [0 ] + ydiff , extents [1 ],
317+ ydata_new , extents [3 ])
318+
319+
320+ def test_rectangle_resize_square_center ():
321+ ax = get_ax ()
322+
323+ def onselect (epress , erelease ):
324+ pass
325+
326+ tool = widgets .RectangleSelector (ax , onselect , interactive = True )
327+ # Create rectangle
328+ _resize_rectangle (tool , 70 , 65 , 120 , 115 )
329+ tool ._default_state .add ('square' )
330+ tool ._default_state .add ('center' )
331+ assert tool .extents == (70.0 , 120.0 , 65.0 , 115.0 )
332+
333+ # resize NE handle
334+ extents = tool .extents
335+ xdata , ydata = extents [1 ], extents [3 ]
336+ xdiff , ydiff = 10 , 5
337+ xdata_new , ydata_new = xdata + xdiff , ydata + ydiff
338+ _resize_rectangle (tool , xdata , ydata , xdata_new , ydata_new )
339+ assert tool .extents == (extents [0 ] - xdiff , xdata_new ,
340+ extents [2 ] - xdiff , extents [3 ] + xdiff )
341+
342+ # resize E handle
343+ extents = tool .extents
344+ xdata , ydata = extents [1 ], extents [2 ] + (extents [3 ] - extents [2 ]) / 2
345+ xdiff = 10
346+ xdata_new , ydata_new = xdata + xdiff , ydata
347+ _resize_rectangle (tool , xdata , ydata , xdata_new , ydata_new )
348+ assert tool .extents == (extents [0 ] - xdiff , xdata_new ,
349+ extents [2 ] - xdiff , extents [3 ] + xdiff )
350+
351+ # resize E handle negative diff
352+ extents = tool .extents
353+ xdata , ydata = extents [1 ], extents [2 ] + (extents [3 ] - extents [2 ]) / 2
354+ xdiff = - 20
355+ xdata_new , ydata_new = xdata + xdiff , ydata
356+ _resize_rectangle (tool , xdata , ydata , xdata_new , ydata_new )
357+ assert tool .extents == (extents [0 ] - xdiff , xdata_new ,
358+ extents [2 ] - xdiff , extents [3 ] + xdiff )
359+
360+ # resize W handle
361+ extents = tool .extents
362+ xdata , ydata = extents [0 ], extents [2 ] + (extents [3 ] - extents [2 ]) / 2
363+ xdiff = 5
364+ xdata_new , ydata_new = xdata + xdiff , ydata
365+ _resize_rectangle (tool , xdata , ydata , xdata_new , ydata_new )
366+ assert tool .extents == (xdata_new , extents [1 ] - xdiff ,
367+ extents [2 ] + xdiff , extents [3 ] - xdiff )
368+
369+ # resize W handle negative diff
370+ extents = tool .extents
371+ xdata , ydata = extents [0 ], extents [2 ] + (extents [3 ] - extents [2 ]) / 2
372+ xdiff = - 25
373+ xdata_new , ydata_new = xdata + xdiff , ydata
374+ _resize_rectangle (tool , xdata , ydata , xdata_new , ydata_new )
375+ assert tool .extents == (xdata_new , extents [1 ] - xdiff ,
376+ extents [2 ] + xdiff , extents [3 ] - xdiff )
377+
378+ # resize SW handle
379+ extents = tool .extents
380+ xdata , ydata = extents [0 ], extents [2 ]
381+ xdiff , ydiff = 20 , 25
382+ xdata_new , ydata_new = xdata + xdiff , ydata + ydiff
383+ _resize_rectangle (tool , xdata , ydata , xdata_new , ydata_new )
384+ assert tool .extents == (extents [0 ] + ydiff , extents [1 ] - ydiff ,
385+ ydata_new , extents [3 ] - ydiff )
386+
387+
121388def test_ellipse ():
122389 """For ellipse, test out the key modifiers"""
123390 ax = get_ax ()
0 commit comments