Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 67d8f04

Browse files
committed
Fix square modifier in interactive rectangle selector - in _onmove of existing shape, part 2, with centering off
1 parent bd0572f commit 67d8f04

File tree

2 files changed

+213
-101
lines changed

2 files changed

+213
-101
lines changed

lib/matplotlib/tests/test_widgets.py

Lines changed: 185 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -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)]])
@@ -126,46 +139,36 @@ def onselect(epress, erelease):
126139

127140
tool = widgets.RectangleSelector(ax, onselect, interactive=True)
128141
# Create rectangle
129-
do_event(tool, 'press', xdata=0, ydata=10, button=1)
130-
do_event(tool, 'onmove', xdata=100, ydata=120, button=1)
131-
do_event(tool, 'release', xdata=100, ydata=120, button=1)
142+
_resize_rectangle(tool, 0, 10, 100, 120)
132143
assert tool.extents == (0.0, 100.0, 10.0, 120.0)
133144

134145
# resize NE handle
135146
extents = tool.extents
136147
xdata, ydata = extents[1], extents[3]
137148
xdata_new, ydata_new = xdata + 10, ydata + 5
138-
do_event(tool, 'press', xdata=xdata, ydata=ydata, button=1)
139-
do_event(tool, 'onmove', xdata=xdata_new, ydata=ydata_new, button=1)
140-
do_event(tool, 'release', xdata=xdata_new, ydata=ydata_new, button=1)
141-
assert tool.extents == (0.0, xdata_new, 10.0, ydata_new)
149+
_resize_rectangle(tool, xdata, ydata, xdata_new, ydata_new)
150+
assert tool.extents == (extents[0], xdata_new, extents[2], ydata_new)
142151

143152
# resize E handle
144153
extents = tool.extents
145154
xdata, ydata = extents[1], extents[2] + (extents[3] - extents[2]) / 2
146155
xdata_new, ydata_new = xdata + 10, ydata
147-
do_event(tool, 'press', xdata=xdata, ydata=ydata, button=1)
148-
do_event(tool, 'onmove', xdata=xdata_new, ydata=ydata_new, button=1)
149-
do_event(tool, 'release', xdata=xdata_new, ydata=ydata_new, button=1)
150-
assert tool.extents == (0.0, xdata_new, 10.0, 125.0)
156+
_resize_rectangle(tool, xdata, ydata, xdata_new, ydata_new)
157+
assert tool.extents == (extents[0], xdata_new, extents[2], extents[3])
151158

152159
# resize W handle
153160
extents = tool.extents
154161
xdata, ydata = extents[0], extents[2] + (extents[3] - extents[2]) / 2
155162
xdata_new, ydata_new = xdata + 15, ydata
156-
do_event(tool, 'press', xdata=xdata, ydata=ydata, button=1)
157-
do_event(tool, 'onmove', xdata=xdata_new, ydata=ydata_new, button=1)
158-
do_event(tool, 'release', xdata=xdata_new, ydata=ydata_new, button=1)
159-
assert tool.extents == (xdata_new, 120.0, 10.0, 125.0)
163+
_resize_rectangle(tool, xdata, ydata, xdata_new, ydata_new)
164+
assert tool.extents == (xdata_new, extents[1], extents[2], extents[3])
160165

161166
# resize SW handle
162167
extents = tool.extents
163168
xdata, ydata = extents[0], extents[2]
164169
xdata_new, ydata_new = xdata + 20, ydata + 25
165-
do_event(tool, 'press', xdata=xdata, ydata=ydata, button=1)
166-
do_event(tool, 'onmove', xdata=xdata_new, ydata=ydata_new, button=1)
167-
do_event(tool, 'release', xdata=xdata_new, ydata=ydata_new, button=1)
168-
assert tool.extents == (xdata_new, 120.0, ydata_new, 125.0)
170+
_resize_rectangle(tool, xdata, ydata, xdata_new, ydata_new)
171+
assert tool.extents == (xdata_new, extents[1], ydata_new, extents[3])
169172

170173

171174
@pytest.mark.parametrize('use_default_state', [True, False])
@@ -177,97 +180,209 @@ def onselect(epress, erelease):
177180

178181
tool = widgets.RectangleSelector(ax, onselect, interactive=True)
179182
# Create rectangle
180-
do_event(tool, 'press', xdata=70, ydata=65, button=1)
181-
do_event(tool, 'onmove', xdata=125, ydata=130, button=1)
182-
do_event(tool, 'release', xdata=125, ydata=130, button=1)
183+
_resize_rectangle(tool, 70, 65, 125, 130)
183184
assert tool.extents == (70.0, 125.0, 65.0, 130.0)
184185

185186
if use_default_state:
186187
tool._default_state.add('center')
188+
use_key = None
189+
else:
190+
use_key = 'control'
187191

188192
# resize NE handle
189193
extents = tool.extents
190194
xdata, ydata = extents[1], extents[3]
191195
xdiff, ydiff = 10, 5
192196
xdata_new, ydata_new = xdata + xdiff, ydata + ydiff
193-
do_event(tool, 'press', xdata=xdata, ydata=ydata, button=1)
194-
if not use_default_state:
195-
do_event(tool, 'on_key_press', key='control')
196-
do_event(tool, 'onmove', xdata=xdata_new, ydata=ydata_new, button=1)
197-
if not use_default_state:
198-
do_event(tool, 'on_key_release', key='control')
199-
do_event(tool, 'release', xdata=xdata_new, ydata=ydata_new, button=1)
200-
assert tool.extents == (70.0 - xdiff, xdata_new, 65.0 - ydiff, ydata_new)
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)
201200

202201
# resize E handle
203202
extents = tool.extents
204203
xdata, ydata = extents[1], extents[2] + (extents[3] - extents[2]) / 2
205204
xdiff = 10
206205
xdata_new, ydata_new = xdata + xdiff, ydata
207-
do_event(tool, 'press', xdata=xdata, ydata=ydata, button=1)
208-
if not use_default_state:
209-
do_event(tool, 'on_key_press', key='control')
210-
do_event(tool, 'onmove', xdata=xdata_new, ydata=ydata_new, button=1)
211-
do_event(tool, 'release', xdata=xdata_new, ydata=ydata_new, button=1)
212-
if not use_default_state:
213-
do_event(tool, 'on_key_release', key='control')
214-
assert tool.extents == (60.0 - xdiff, xdata_new, 60.0, 135.0)
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])
215209

216210
# resize E handle negative diff
217211
extents = tool.extents
218212
xdata, ydata = extents[1], extents[2] + (extents[3] - extents[2]) / 2
219213
xdiff = -20
220214
xdata_new, ydata_new = xdata + xdiff, ydata
221-
do_event(tool, 'press', xdata=xdata, ydata=ydata, button=1)
222-
if not use_default_state:
223-
do_event(tool, 'on_key_press', key='control')
224-
do_event(tool, 'onmove', xdata=xdata_new, ydata=ydata_new, button=1)
225-
do_event(tool, 'release', xdata=xdata_new, ydata=ydata_new, button=1)
226-
if not use_default_state:
227-
do_event(tool, 'on_key_release', key='control')
228-
assert tool.extents == (50.0 - xdiff, xdata_new, 60.0, 135.0)
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])
229218

230219
# resize W handle
231220
extents = tool.extents
232221
xdata, ydata = extents[0], extents[2] + (extents[3] - extents[2]) / 2
233222
xdiff = 15
234223
xdata_new, ydata_new = xdata + xdiff, ydata
235-
do_event(tool, 'press', xdata=xdata, ydata=ydata, button=1)
236-
if not use_default_state:
237-
do_event(tool, 'on_key_press', key='control')
238-
do_event(tool, 'onmove', xdata=xdata_new, ydata=ydata_new, button=1)
239-
do_event(tool, 'release', xdata=xdata_new, ydata=ydata_new, button=1)
240-
if not use_default_state:
241-
do_event(tool, 'on_key_release', key='control')
242-
assert tool.extents == (xdata_new, 125.0 - xdiff, 60.0, 135.0)
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)
243291

244292
# resize W handle
245293
extents = tool.extents
246294
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
247304
xdiff = -25
248305
xdata_new, ydata_new = xdata + xdiff, ydata
249-
do_event(tool, 'press', xdata=xdata, ydata=ydata, button=1)
250-
if not use_default_state:
251-
do_event(tool, 'on_key_press', key='control')
252-
do_event(tool, 'onmove', xdata=xdata_new, ydata=ydata_new, button=1)
253-
do_event(tool, 'release', xdata=xdata_new, ydata=ydata_new, button=1)
254-
if not use_default_state:
255-
do_event(tool, 'on_key_release', key='control')
256-
assert tool.extents == (xdata_new, 110.0 - xdiff, 60.0, 135.0)
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)
257309

258310
# resize SW handle
259311
extents = tool.extents
260312
xdata, ydata = extents[0], extents[2]
261313
xdiff, ydiff = 20, 25
262314
xdata_new, ydata_new = xdata + xdiff, ydata + ydiff
263-
do_event(tool, 'press', xdata=xdata, ydata=ydata, button=1)
264-
if not use_default_state:
265-
do_event(tool, 'on_key_press', key='control')
266-
do_event(tool, 'onmove', xdata=xdata_new, ydata=ydata_new, button=1)
267-
do_event(tool, 'release', xdata=xdata_new, ydata=ydata_new, button=1)
268-
if not use_default_state:
269-
do_event(tool, 'on_key_release', key='control')
270-
assert tool.extents == (xdata_new, 135.0 - xdiff, ydata_new, 135.0 - 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)
271386

272387

273388
def test_ellipse():

0 commit comments

Comments
 (0)