@@ -55,6 +55,19 @@ def test_rectangle_selector():
55
55
check_rectangle (props = dict (fill = True ))
56
56
57
57
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
+
58
71
@pytest .mark .parametrize ('drag_from_anywhere, new_center' ,
59
72
[[True , (60 , 75 )],
60
73
[False , (30 , 20 )]])
@@ -118,6 +131,260 @@ def onselect(epress, erelease):
118
131
assert artist .get_alpha () == 0.3
119
132
120
133
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 )
<
179B
/td>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
+
121
388
def test_ellipse ():
122
389
"""For ellipse, test out the key modifiers"""
123
390
ax = get_ax ()
0 commit comments