8000 Merge pull request #21604 from ericpre/fix_centre_square_rectangle_se… · matplotlib/matplotlib@993c1bc · GitHub
[go: up one dir, main page]

Skip to content

Commit 993c1bc

Browse files
authored
Merge pull request #21604 from ericpre/fix_centre_square_rectangle_selector-split1
Fix centre square rectangle selector part 1
2 parents 02f093b + 133e100 commit 993c1bc

File tree

2 files changed

+333
-21
lines changed

2 files changed

+333
-21
lines changed

lib/matplotlib/tests/test_widgets.py

Lines changed: 267 additions & 0 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)]])
@@ -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)
< 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+
121388
def test_ellipse():
122389
"""For ellipse, test out the key modifiers"""
123390
ax = get_ax()

0 commit comments

Comments
 (0)
0