8000 Backport PR #22711: RangeSlider handle set_val bugfix · meeseeksmachine/matplotlib@4dfa216 · GitHub
[go: up one dir, main page]

Skip to content

Commit 4dfa216

Browse files
QuLogicmeeseeksmachine
authored andcommitted
Backport PR matplotlib#22711: RangeSlider handle set_val bugfix
1 parent 9687a2a commit 4dfa216

File tree

2 files changed

+32
-5
lines changed

2 files changed

+32
-5
lines changed

lib/matplotlib/tests/test_widgets.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1037,19 +1037,30 @@ def test_range_slider(orientation):
10371037
# Check initial value is set correctly
10381038
assert_allclose(slider.val, (0.1, 0.34))
10391039

1040+
def handle_positions(slider):
1041+
if orientation == "vertical":
1042+
return [h.get_ydata()[0] for h in slider._handles]
1043+
else:
1044+
return [h.get_xdata()[0] for h in slider._handles]
1045+
10401046
slider.set_val((0.2, 0.6))
10411047
assert_allclose(slider.val, (0.2, 0.6))
1048+
assert_allclose(handle_positions(slider), (0.2, 0.6))
1049+
10421050
box = slider.poly.get_extents().transformed(ax.transAxes.inverted())
10431051
assert_allclose(box.get_points().flatten()[idx], [0.2, .25, 0.6, .75])
10441052

10451053
slider.set_val((0.2, 0.1))
10461054
assert_allclose(slider.val, (0.1, 0.2))
1055+
assert_allclose(handle_positions(slider), (0.1, 0.2))
10471056

10481057
slider.set_val((-1, 10))
10491058
assert_allclose(slider.val, (0, 1))
1059+
assert_allclose(handle_positions(slider), (0, 1))
10501060

10511061
slider.reset()
1052-
assert_allclose(slider.val, [0.1, 0.34])
1062+
assert_allclose(slider.val, (0.1, 0.34))
1063+
assert_allclose(handle_positions(slider), (0.1, 0.34))
10531064

10541065

10551066
def check_polygon_selector(event_sequence, expected_result, selections_count):

lib/matplotlib/widgets.py

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -813,7 +813,10 @@ def _update_val_from_pos(self, pos):
813813
val = self._max_in_bounds(pos)
814814
self.set_max(val)
815815
if self._active_handle:
816-
self._active_handle.set_xdata([val])
816+
if self.orientation == "vertical":
817+
self._active_handle.set_ydata([val])
818+
else:
819+
self._active_handle.set_xdata([val])
817820

818821
def _update(self, event):
819822
"""Update the slider position."""
@@ -836,11 +839,16 @@ def _update(self, event):
836839
return
837840

838841
# determine which handle was grabbed
839-
handle = self._handles[
840-
np.argmin(
842+
if self.orientation == "vertical":
843+
handle_index = np.argmin(
844+
np.abs([h.get_ydata()[0] - event.ydata for h in self._handles])
845+
)
846+
else:
847+
handle_index = np.argmin(
841848
np.abs([h.get_xdata()[0] - event.xdata for h in self._handles])
842849
)
843-
]
850+
handle = self._handles[handle_index]
851+
844852
# these checks ensure smooth behavior if the handles swap which one
845853
# has a higher value. i.e. if one is dragged over and past the other.
846854
if handle is not self._active_handle:
@@ -907,14 +915,22 @@ def set_val(self, val):
907915
xy[2] = .75, val[1]
908916
xy[3] = .75, val[0]
909917
xy[4] = .25, val[0]
918+
919+
self._handles[0].set_ydata([val[0]])
920+
self._handles[1].set_ydata([val[1]])
910921
else:
911922
xy[0] = val[0], .25
912923
xy[1] = val[0], .75
913924
xy[2] = val[1], .75
914925
xy[3] = val[1], .25
915926
xy[4] = val[0], .25
927+
928+
self._handles[0].set_xdata([val[0]])
929+
self._handles[1].set_xdata([val[1]])
930+
916931
self.poly.xy = xy
917932
self.valtext.set_text(self._format(val))
933+
918934
if self.drawon:
919935
self.ax.figure.canvas.draw_idle()
920936
self.val = val

0 commit comments

Comments
 (0)
0