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

Skip to content

Commit b8ef165

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

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
@@ -90,6 +90,19 @@ def onselect(epress, erelease):
9090
assert tool.center == (180, 190)
9191

9292

93+
def _resize_rectangle(tool, xdata, ydata, xdata_new, ydata_new,
94+
use_key=None):
95+
do_event(tool, 'press', xdata=xdata, ydata=ydata, button=1)
96+
if use_key is not None:
97+
do_event(tool, 'on_key_press', key=use_key)
98+
do_event(tool, 'onmove', xdata=xdata_new, ydata=ydata_new, button=1)
99+
if use_key is not None:
100+
do_event(tool, 'on_key_release', key=use_key)
101+
do_event(tool, 'release', xdata=xdata_new, ydata=ydata_new, button=1)
102+
103+
return tool
104+
105+
93106
def test_rectangle_resize():
94107
ax = get_ax()
95108

@@ -98,46 +111,36 @@ def onselect(epress, erelease):
98111

99112
tool = widgets.RectangleSelector(ax, onselect, interactive=True)
100113
# Create rectangle
101-
do_event(tool, 'press', xdata=0, ydata=10, button=1)
102-
do_event(tool, 'onmove', xdata=100, ydata=120, button=1)
103-
do_event(tool, 'release', xdata=100, ydata=120, button=1)
114+
_resize_rectangle(tool, 0, 10, 100, 120)
104115
assert tool.extents == (0.0, 100.0, 10.0, 120.0)
105116

106117
# resize NE handle
107118
extents = tool.extents
108119
xdata, ydata = extents[1], extents[3]
109120
xdata_new, ydata_new = xdata + 10, ydata + 5
110-
do_event(tool, 'press', xdata=xdata, ydata=ydata, button=1)
111-
do_event(tool, 'onmove', xdata=xdata_new, ydata=ydata_new, button=1)
112-
do_event(tool, 'release', xdata=xdata_new, ydata=ydata_new, button=1)
113-
assert tool.extents == (0.0, xdata_new, 10.0, ydata_new)
121+
_resize_rectangle(tool, xdata, ydata, xdata_new, ydata_new)
122+
assert tool.extents == (extents[0], xdata_new, extents[2], ydata_new)
114123

115124
# resize E handle
116125
extents = tool.extents
117126
xdata, ydata = extents[1], extents[2] + (extents[3] - extents[2]) / 2
118127
xdata_new, ydata_new = xdata + 10, ydata
119-
do_event(tool, 'press', xdata=xdata, ydata=ydata, button=1)
120-
do_event(tool, 'onmove', xdata=xdata_new, ydata=ydata_new, button=1)
121-
do_event(tool, 'release', xdata=xdata_new, ydata=ydata_new, button=1)
122-
assert tool.extents == (0.0, xdata_new, 10.0, 125.0)
128+
_resize_rectangle(tool, xdata, ydata, xdata_new, ydata_new)
129+
assert tool.extents == (extents[0], xdata_new, extents[2], extents[3])
123130

124131
# resize W handle
125132
extents = tool.extents
126133
xdata, ydata = extents[0], extents[2] + (extents[3] - extents[2]) / 2
127134
xdata_new, ydata_new = xdata + 15, ydata
128-
do_event(tool, 'press', xdata=xdata, ydata=ydata, button=1)
129-
do_event(tool, 'onmove', xdata=xdata_new, ydata=ydata_new, button=1)
130-
do_event(tool, 'release', xdata=xdata_new, ydata=ydata_new, button=1)
131-
assert tool.extents == (xdata_new, 120.0, 10.0, 125.0)
135+
_resize_rectangle(tool, xdata, ydata, xdata_new, ydata_new)
136+
assert tool.extents == (xdata_new, extents[1], extents[2], extents[3])
132137

133138
# resize SW handle
134139
extents = tool.extents
135140
xdata, ydata = extents[0], extents[2]
136141
xdata_new, ydata_new = xdata + 20, ydata + 25
137-
do_event(tool, 'press', xdata=xdata, ydata=ydata, button=1)
138-
do_event(tool, 'onmove', xdata=xdata_new, ydata=ydata_new, button=1)
139-
do_event(tool, 'release', xdata=xdata_new, ydata=ydata_new, button=1)
140-
assert tool.extents == (xdata_new, 120.0, ydata_new, 125.0)
142+
_resize_rectangle(tool, xdata, ydata, xdata_new, ydata_new)
143+
assert tool.extents == (xdata_new, extents[1], ydata_new, extents[3])
141144

142145

143146
@pytest.mark.parametrize('use_default_state', [True, False])
@@ -149,97 +152,209 @@ def onselect(epress, erelease):
149152

150153
tool = widgets.RectangleSelector(ax, onselect, interactive=True)
151154
# Create rectangle
152-
do_event(tool, 'press', xdata=70, ydata=65, button=1)
153-
do_event(tool, 'onmove', xdata=125, ydata=130, button=1)
154-
do_event(tool, 'release', xdata=125, ydata=130, button=1)
155+
_resize_rectangle(tool, 70, 65, 125, 130)
155156
assert tool.extents == (70.0, 125.0, 65.0, 130.0)
156157

157158
if use_default_state:
158159
tool._default_state.add('center')
160+
use_key = None
161+
else:
162+
use_key = 'control'
159163

160164
# resize NE handle
161165
extents = tool.extents
162166
xdata, ydata = extents[1], extents[3]
163167
xdiff, ydiff = 10, 5
164168
xdata_new, ydata_new = xdata + xdiff, ydata + ydiff
165-
do_event(tool, 'press', xdata=xdata, ydata=ydata, button=1)
166-
if not use_default_state:
167-
do_event(tool, 'on_key_press', key='control')
168-
do_event(tool, 'onmove', xdata=xdata_new, ydata=ydata_new, button=1)
169-
if not use_default_state:
170-
do_event(tool, 'on_key_release', key='control')
171-
do_event(tool, 'release', xdata=xdata_new, ydata=ydata_new, button=1)
172-
assert tool.extents == (70.0 - xdiff, xdata_new, 65.0 - ydiff, ydata_new)
169+
_resize_rectangle(tool, xdata, ydata, xdata_new, ydata_new, use_key)
170+
assert tool.extents == (extents[0] - xdiff, xdata_new,
171+
extents[2] - ydiff, ydata_new)
173172

174173
# resize E handle
175174
extents = tool.extents
176175
xdata, ydata = extents[1], extents[2] + (extents[3] - extents[2]) / 2
177176
xdiff = 10
178177
xdata_new, ydata_new = xdata + xdiff, ydata
179-
do_event(tool, 'press', xdata=xdata, ydata=ydata, button=1)
180-
if not use_default_state:
181-
do_event(tool, 'on_key_press', key='control')
182-
do_event(tool, 'onmove', xdata=xdata_new, ydata=ydata_new, button=1)
183-
do_event(tool, 'release', xdata=xdata_new, ydata=ydata_new, button=1)
184-
if not use_default_state:
185-
do_event(tool, 'on_key_release', key='control')
186-
assert tool.extents == (60.0 - xdiff, xdata_new, 60.0, 135.0)
178+
_resize_rectangle(tool, xdata, ydata, xdata_new, ydata_new, use_key)
179+
assert tool.extents == (extents[0] - xdiff, xdata_new,
180+
extents[2], extents[3])
187181

188182
# resize E handle negative diff
189183
extents = tool.extents
190184
xdata, ydata = extents[1], extents[2] + (extents[3] - extents[2]) / 2
191185
xdiff = -20
192186
xdata_new, ydata_new = xdata + xdiff, ydata
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-
do_event(tool, 'release', xdata=xdata_new, ydata=ydata_new, button=1)
198-
if not use_default_state:
199-
do_event(tool, 'on_key_release', key='control')
200-
assert tool.extents == (50.0 - xdiff, xdata_new, 60.0, 135.0)
187+
_resize_rectangle(tool, xdata, ydata, xdata_new, ydata_new, use_key)
188+
assert tool.extents == (extents[0] - xdiff, xdata_new,
189+
extents[2], extents[3])
201190

202191
# resize W handle
203192
extents = tool.extents
204193
xdata, ydata = extents[0], extents[2] + (extents[3] - extents[2]) / 2
205194
xdiff = 15
206195
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 == (xdata_new, 125.0 - xdiff, 60.0, 135.0)
196+
_resize_rectangle(tool, xdata, ydata, xdata_new, ydata_new, use_key)
197+
assert tool.extents == (xdata_new, extents[1] - xdiff,
198+
extents[2], extents[3])
199+
200+
# resize W handle negative diff
201+
extents = tool.extents
202+
xdata, ydata = extents[0], extents[2] + (extents[3] - extents[2]) / 2
203+
xdiff = -25
204+
xdata_new, ydata_new = xdata + xdiff, ydata
205+
_resize_rectangle(tool, xdata, ydata, xdata_new, ydata_new, use_key)
206+
assert tool.extents == (xdata_new, extents[1] - xdiff,
207+
extents[2], extents[3])
208+
209+
# resize SW handle
210+
extents = tool.extents
211+
xdata, ydata = extents[0], extents[2]
212+
xdiff, ydiff = 20, 25
213+
xdata_new, ydata_new = xdata + xdiff, ydata + ydiff
214+
_resize_rectangle(tool, xdata, ydata, xdata_new, ydata_new, use_key)
215+
assert tool.extents == (xdata_new, extents[1] - xdiff,
216+
ydata_new, extents[3] - ydiff)
217+
218+
219+
@pytest.mark.parametrize('use_default_state', [True, False])
220+
def test_rectangle_resize_square(use_default_state):
221+
ax = get_ax()
222+
223+
def onselect(epress, erelease):
224+
pass
225+
226+
tool = widgets.RectangleSelector(ax, onselect, interactive=True)
227+
# Create rectangle
228+
_resize_rectangle(tool, 70, 65, 120, 115)
229+
assert tool.extents == (70.0, 120.0, 65.0, 115.0)
230+
231+
if use_default_state:
232+
tool._default_state.add('square')
233+
use_key = None
234+
else:
235+
use_key = 'shift'
236+
237+
# resize NE handle
238+
extents = tool.extents
239+
xdata, ydata = extents[1], extents[3]
240+
xdiff, ydiff = 10, 5
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 == (extents[0], xdata_new,
244+
extents[2], extents[3] + xdiff)
245+
246+
# resize E handle
247+
extents = tool.extents
248+
xdata, ydata = extents[1], extents[2] + (extents[3] - extents[2]) / 2
249+
xdiff = 10
250+
xdata_new, ydata_new = xdata + xdiff, ydata
251+
_resize_rectangle(tool, xdata, ydata, xdata_new, ydata_new, use_key)
252+
assert tool.extents == (extents[0], xdata_new,
253+
extents[2], extents[3] + xdiff)
254+
255+
# resize E handle negative diff
256+
extents = tool.extents
257+
xdata, ydata = extents[1], extents[2] + (extents[3] - extents[2]) / 2
258+
xdiff = -20
259+
xdata_new, ydata_new = xdata + xdiff, ydata
260+
_resize_rectangle(tool, xdata, ydata, xdata_new, ydata_new, use_key)
261+
assert tool.extents == (extents[0], xdata_new,
262+
extents[2], extents[3] + xdiff)
215263

216264
# resize W handle
217265
extents = tool.extents
218266
xdata, ydata = extents[0], extents[2] + (extents[3] - extents[2]) / 2
267+
xdiff = 15
268+
xdata_new, ydata_new = xdata + xdiff, ydata
269+
_resize_rectangle(tool, xdata, ydata, xdata_new, ydata_new, use_key)
270+
assert tool.extents == (xdata_new, extents[1],
271+
extents[2], extents[3] - xdiff)
272+
273+
# resize W handle negative diff
274+
extents = tool.extents
275+
xdata, ydata = extents[0], extents[2] + (extents[3] - extents[2]) / 2
219276
xdiff = -25
220277
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 == (xdata_new, 110.0 - xdiff, 60.0, 135.0)
278+
_resize_rectangle(tool, xdata, ydata, xdata_new, ydata_new, use_key)
279+
assert tool.extents == (xdata_new, extents[1],
280+
extents[2], extents[3] - xdiff)
229281

230282
# resize SW handle
231283
extents = tool.extents
232284
xdata, ydata = extents[0], extents[2]
233285
xdiff, ydiff = 20, 25
234286
xdata_new, ydata_new = xdata + xdiff, ydata + ydiff
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, 135.0 - xdiff, ydata_new, 135.0 - ydiff)
287+
_resize_rectangle(tool, xdata, ydata, xdata_new, ydata_new, use_key)
288+
assert tool.extents == (extents[0] + ydiff, extents[1],
289+
ydata_new, extents[3])
290+
291+
292+
def test_rectangle_resize_square_center():
293+
ax = get_ax()
294+
295+
def onselect(epress, erelease):
296+
pass
297+
298+
tool = widgets.RectangleSelector(ax, onselect, interactive=True)
299+
# Create rectangle
300+
_resize_rectangle(tool, 70, 65, 120, 115)
301+
tool._default_state.add('square')
302+
tool._default_state.add('center')
303+
assert tool.extents == (70.0, 120.0, 65.0, 115.0)
304+
305+
# resize NE handle
306+
extents = tool.extents
307+
xdata, ydata = extents[1], extents[3]
308+
xdiff, ydiff = 10, 5
309+
xdata_new, ydata_new = xdata + xdiff, ydata + ydiff
310+
_resize_rectangle(tool, xdata, ydata, xdata_new, ydata_new)
311+
assert tool.extents == (extents[0] - xdiff, xdata_new,
312+
extents[2] - xdiff, extents[3] + xdiff)
313+
314+
# resize E handle
315+
extents = tool.extents
316+
xdata, ydata = extents[1], extents[2] + (extents[3] - extents[2]) / 2
317+
xdiff = 10
318+
xdata_new, ydata_new = xdata + xdiff, ydata
319+
_resize_rectangle(tool, xdata, ydata, xdata_new, ydata_new)
320+
assert tool.extents == (extents[0] - xdiff, xdata_new,
321+
extents[2] - xdiff, extents[3] + xdiff)
322+
323+
# resize E handle negative diff
324+
extents = tool.extents
325+
xdata, ydata = extents[1], extents[2] + (extents[3] - extents[2]) / 2
326+
xdiff = -20
327+
xdata_new, ydata_new = xdata + xdiff, ydata
328+
_resize_rectangle(tool, xdata, ydata, xdata_new, ydata_new)
329+
assert tool.extents == (extents[0] - xdiff, xdata_new,
330+
extents[2] - xdiff, extents[3] + xdiff)
331+
332+
# resize W handle
333+
extents = tool.extents
334+
xdata, ydata = extents[0], extents[2] + (extents[3] - extents[2]) / 2
335+
xdiff = 5
336+
xdata_new, ydata_new = xdata + xdiff, ydata
337+
_resize_rectangle(tool, xdata, ydata, xdata_new, ydata_new)
338+
assert tool.extents == (xdata_new, extents[1] - xdiff,
339+
extents[2] + xdiff, extents[3] - xdiff)
340+
341+
# resize W handle negative diff
342+
extents = tool.extents
343+
xdata, ydata = extents[0], extents[2] + (extents[3] - extents[2]) / 2
344+
xdiff = -25
345+
xdata_new, ydata_new = xdata + xdiff, ydata
346+
_resize_rectangle(tool, xdata, ydata, xdata_new, ydata_new)
347+
assert tool.extents == (xdata_new, extents[1] - xdiff,
348+
extents[2] + xdiff, extents[3] - xdiff)
349+
350+
# resize SW handle
351+
extents = tool.extents
352+
xdata, ydata = extents[0], extents[2]
353+
xdiff, ydiff = 20, 25
354+
xdata_new, ydata_new = xdata + xdiff, ydata + ydiff
355+
_resize_rectangle(tool, xdata, ydata, xdata_new, ydata_new)
356+
assert tool.extents == (extents[0] + ydiff, extents[1] - ydiff,
357+
ydata_new, extents[3] - ydiff)
243358

244359

245360
def test_ellipse():

0 commit comments

Comments
 (0)