Skip to content

Commit 0e16de7

Browse files
authored
Merge pull request #20601 from QuLogic/hide-widget-state
Hide some `_SelectorWidget` state internals.
2 parents 0496a50 + 819caa4 commit 0e16de7

File tree

2 files changed

+61
-47
lines changed

2 files changed

+61
-47
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
Selector widget state internals
2+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3+
Several `~matplotlib.widgets.EllipseSelector`,
4+
`~matplotlib.widgets.RectangleSelector` and `~matplotlib.widgets.SpanSelector`
5+
class internals have been privatized and deprecated:
6+
7+
- ``eventpress``
8+
- ``eventrelease``
9+
- ``state``

lib/matplotlib/widgets.py

+52-47
Original file line numberDiff line numberDiff line change
@@ -1789,11 +1789,15 @@ def __init__(self, ax, onselect, useblit=False, button=None,
17891789
self.validButtons = button
17901790

17911791
# will save the data (position at mouseclick)
1792-
self.eventpress = None
1792+
self._eventpress = None
17931793
# will save the data (pos. at mouserelease)
1794-
self.eventrelease = None
1794+
self._eventrelease = None
17951795
self._prev_event = None
1796-
self.state = set()
1796+
self._state = set()
1797+
1798+
eventpress = _api.deprecate_privatize_attribute("3.5")
1799+
eventrelease = _api.deprecate_privatize_attribute("3.5")
1800+
state = _api.deprecate_privatize_attribute("3.5")
17971801

17981802
def set_active(self, active):
17991803
super().set_active(active)
@@ -1846,14 +1850,14 @@ def ignore(self, event):
18461850
return True
18471851
# If no button was pressed yet ignore the event if it was out
18481852
# of the axes
1849-
if self.eventpress is None:
1853+
if self._eventpress is None:
18501854
return event.inaxes != self.ax
18511855
# If a button was pressed, check if the release-button is the same.
1852-
if event.button == self.eventpress.button:
1856+
if event.button == self._eventpress.button:
18531857
return False
18541858
# If a button was pressed, check if the release-button is the same.
18551859
return (event.inaxes != self.ax or
1856-
event.button != self.eventpress.button)
1860+
event.button != self._eventpress.button)
18571861

18581862
def update(self):
18591863
"""Draw using blit() or draw_idle(), depending on ``self.useblit``."""
@@ -1899,13 +1903,13 @@ def press(self, event):
18991903
"""Button press handler and validator."""
19001904
if not self.ignore(event):
19011905
event = self._clean_event(event)
1902-
self.eventpress = event
1906+
self._eventpress = event
19031907
self._prev_event = event
19041908
key = event.key or ''
19051909
key = key.replace('ctrl', 'control')
19061910
# move state is locked in on a button press
19071911
if key == self.state_modifier_keys['move']:
1908-
self.state.add('move')
1912+
self._state.add('move')
19091913
self._press(event)
19101914
return True
19111915
return False
@@ -1915,13 +1919,13 @@ def _press(self, event):
19151919

19161920
def release(self, event):
19171921
"""Button release event handler and validator."""
1918-
if not self.ignore(event) and self.eventpress:
1922+
if not self.ignore(event) and self._eventpress:
19191923
event = self._clean_event(event)
1920-
self.eventrelease = event
1924+
self._eventrelease = event
19211925
self._release(event)
1922-
self.eventpress = None
1923-
self.eventrelease = None
1924-
self.state.discard('move')
1926+
self._eventpress = None
1927+
self._eventrelease = None
1928+
self._state.discard('move')
19251929
return True
19261930
return False
19271931

@@ -1930,7 +1934,7 @@ def _release(self, event):
19301934

19311935
def onmove(self, event):
19321936
"""Cursor move event handler and validator."""
1933-
if not self.ignore(event) and self.eventpress:
1937+
if not self.ignore(event) and self._eventpress:
19341938
event = self._clean_event(event)
19351939
self._onmove(event)
19361940
return True
@@ -1959,7 +1963,7 @@ def on_key_press(self, event):
19591963
return
19601964
for (state, modifier) in self.state_modifier_keys.items():
19611965
if modifier in key:
1962-
self.state.add(state)
1966+
self._state.add(state)
19631967
self._on_key_press(event)
19641968

19651969
def _on_key_press(self, event):
@@ -1971,7 +1975,7 @@ def on_key_release(self, event):
19711975
key = event.key or ''
19721976
for (state, modifier) in self.state_modifier_keys.items():
19731977
if modifier in key:
1974-
self.state.discard(state)
1978+
self._state.discard(state)
19751979
self._on_key_release(event)
19761980

19771981
def _on_key_release(self, event):
@@ -2240,9 +2244,9 @@ def _onmove(self, event):
22402244

22412245
v = event.xdata if self.direction == 'horizontal' else event.ydata
22422246
if self.direction == 'horizontal':
2243-
vpress = self.eventpress.xdata
2247+
vpress = self._eventpress.xdata
22442248
else:
2245-
vpress = self.eventpress.ydata
2249+
vpress = self._eventpress.ydata
22462250

22472251
# move existing span
22482252
# When "dragging from anywhere", `self._active_handle` is set to 'C'
@@ -2290,7 +2294,7 @@ def _set_active_handle(self, event):
22902294

22912295
# Prioritise center handle over other handles
22922296
# Use 'C' to match the notation used in the RectangleSelector
2293-
if 'move' in self.state:
2297+
if 'move' in self._state:
22942298
self._active_handle = 'C'
22952299
elif e_dist > self.handle_grab_distance:
22962300
# Not close to any handles
@@ -2712,23 +2716,23 @@ def _release(self, event):
27122716

27132717
# update the eventpress and eventrelease with the resulting extents
27142718
x0, x1, y0, y1 = self.extents
2715-
self.eventpress.xdata = x0
2716-
self.eventpress.ydata = y0
2719+
self._eventpress.xdata = x0
2720+
self._eventpress.ydata = y0
27172721
xy0 = self.ax.transData.transform([x0, y0])
2718-
self.eventpress.x, self.eventpress.y = xy0
2722+
self._eventpress.x, self._eventpress.y = xy0
27192723

2720-
self.eventrelease.xdata = x1
2721-
self.eventrelease.ydata = y1
2724+
self._eventrelease.xdata = x1
2725+
self._eventrelease.ydata = y1
27222726
xy1 = self.ax.transData.transform([x1, y1])
2723-
self.eventrelease.x, self.eventrelease.y = xy1
2727+
self._eventrelease.x, self._eventrelease.y = xy1
27242728

27252729
# calculate dimensions of box or line
27262730
if self.spancoords == 'data':
2727-
spanx = abs(self.eventpress.xdata - self.eventrelease.xdata)
2728-
spany = abs(self.eventpress.ydata - self.eventrelease.ydata)
2731+
spanx = abs(self._eventpress.xdata - self._eventrelease.xdata)
2732+
spany = abs(self._eventpress.ydata - self._eventrelease.ydata)
27292733
elif self.spancoords == 'pixels':
2730-
spanx = abs(self.eventpress.x - self.eventrelease.x)
2731-
spany = abs(self.eventpress.y - self.eventrelease.y)
2734+
spanx = abs(self._eventpress.x - self._eventrelease.x)
2735+
spany = abs(self._eventpress.y - self._eventrelease.y)
27322736
else:
27332737
_api.check_in_list(['data', 'pixels'],
27342738
spancoords=self.spancoords)
@@ -2743,7 +2747,7 @@ def _release(self, event):
27432747
return
27442748

27452749
# call desired function
2746-
self.onselect(self.eventpress, self.eventrelease)
2750+
self.onselect(self._eventpress, self._eventrelease)
27472751
self.update()
27482752

27492753
return False
@@ -2759,26 +2763,26 @@ def _onmove(self, event):
27592763
y1 = event.ydata
27602764

27612765
# move existing shape
2762-
elif (('move' in self.state or self._active_handle == 'C' or
2766+
elif (('move' in self._state or self._active_handle == 'C' or
27632767
(self.drag_from_anywhere and self._contains(event))) and
27642768
self._extents_on_press is not None):
27652769
x0, x1, y0, y1 = self._extents_on_press
2766-
dx = event.xdata - self.eventpress.xdata
2767-
dy = event.ydata - self.eventpress.ydata
2770+
dx = event.xdata - self._eventpress.xdata
2771+
dy = event.ydata - self._eventpress.ydata
27682772
x0 += dx
27692773
x1 += dx
27702774
y0 += dy
27712775
y1 += dy
27722776

27732777
# new shape
27742778
else:
2775-
center = [self.eventpress.xdata, self.eventpress.ydata]
2776-
center_pix = [self.eventpress.x, self.eventpress.y]
2779+
center = [self._eventpress.xdata, self._eventpress.ydata]
2780+
center_pix = [self._eventpress.x, self._eventpress.y]
27772781
dx = (event.xdata - center[0]) / 2.
27782782
dy = (event.ydata - center[1]) / 2.
27792783

27802784
# square shape
2781-
if 'square' in self.state:
2785+
if 'square' in self._state:
27822786
dx_pix = abs(event.x - center_pix[0])
27832787
dy_pix = abs(event.y - center_pix[1])
27842788
if not dx_pix:
@@ -2790,7 +2794,7 @@ def _onmove(self, event):
27902794
dy *= maxd / (abs(dy_pix) + 1e-6)
27912795

27922796
# from center
2793-
if 'center' in self.state:
2797+
if 'center' in self._state:
27942798
dx *= 2
27952799
dy *= 2
27962800

@@ -2891,7 +2895,7 @@ def _set_active_handle(self, event):
28912895
e_idx, e_dist = self._edge_handles.closest(event.x, event.y)
28922896
m_idx, m_dist = self._center_handle.closest(event.x, event.y)
28932897

2894-
if 'move' in self.state:
2898+
if 'move' in self._state:
28952899
self._active_handle = 'C'
28962900
self._extents_on_press = self.extents
28972901
# Set active handle as closest handle, if mouse click is close enough.
@@ -3204,7 +3208,7 @@ def _remove_vertex(self, i):
32043208
def _press(self, event):
32053209
"""Button press event handler."""
32063210
# Check for selection of a tool handle.
3207-
if ((self._polygon_completed or 'move_vertex' in self.state)
3211+
if ((self._polygon_completed or 'move_vertex' in self._state)
32083212
and len(self._xs) > 0):
32093213
h_idx, h_dist = self._polygon_handles.closest(event.x, event.y)
32103214
if h_dist < self.vertex_select_radius:
@@ -3230,8 +3234,8 @@ def _release(self, event):
32303234

32313235
# Place new vertex.
32323236
elif (not self._polygon_completed
3233-
and 'move_all' not in self.state
3234-
and 'move_vertex' not in self.state):
3237+
and 'move_all' not in self._state
3238+
and 'move_vertex' not in self._state):
32353239
self._xs.insert(-1, event.xdata)
32363240
self._ys.insert(-1, event.ydata)
32373241

@@ -3243,7 +3247,7 @@ def onmove(self, event):
32433247
# Method overrides _SelectorWidget.onmove because the polygon selector
32443248
# needs to process the move callback even if there is no button press.
32453249
# _SelectorWidget.onmove include logic to ignore move event if
3246-
# eventpress is None.
3250+
# _eventpress is None.
32473251
if not self.ignore(event):
32483252
event = self._clean_event(event)
32493253
self._onmove(event)
@@ -3262,16 +3266,16 @@ def _onmove(self, event):
32623266
self._xs[-1], self._ys[-1] = event.xdata, event.ydata
32633267

32643268
# Move all vertices.
3265-
elif 'move_all' in self.state and self.eventpress:
3266-
dx = event.xdata - self.eventpress.xdata
3267-
dy = event.ydata - self.eventpress.ydata
3269+
elif 'move_all' in self._state and self._eventpress:
3270+
dx = event.xdata - self._eventpress.xdata
3271+
dy = event.ydata - self._eventpress.ydata
32683272
for k in range(len(self._xs)):
32693273
self._xs[k] = self._xs_at_press[k] + dx
32703274
self._ys[k] = self._ys_at_press[k] + dy
32713275

32723276
# Do nothing if completed or waiting for a move.
32733277
elif (self._polygon_completed
3274-
or 'move_vertex' in self.state or 'move_all' in self.state):
3278+
or 'move_vertex' in self._state or 'move_all' in self._state):
32753279
return
32763280

32773281
# Position pending vertex.
@@ -3293,7 +3297,8 @@ def _on_key_press(self, event):
32933297
# Remove the pending vertex if entering the 'move_vertex' or
32943298
# 'move_all' mode
32953299
if (not self._polygon_completed
3296-
and ('move_vertex' in self.state or 'move_all' in self.state)):
3300+
and ('move_vertex' in self._state or
3301+
'move_all' in self._state)):
32973302
self._xs, self._ys = self._xs[:-1], self._ys[:-1]
32983303
self._draw_polygon()
32993304

0 commit comments

Comments
 (0)