Skip to content

Commit 51552f3

Browse files
wthollidayclaude
andcommitted
Update vslider to take Binding<f32>, matching hslider API
vslider previously took (f32, Fn) while hslider took impl Binding<f32>. Now both use the same Binding pattern with drag_s, and vslider also renders a filled track and has an accessibility role like hslider. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent bc3a488 commit 51552f3

1 file changed

Lines changed: 25 additions & 10 deletions

File tree

src/views/slider.rs

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -86,36 +86,51 @@ where
8686
}
8787

8888
/// Vertical slider built from other Views.
89-
pub fn vslider(
90-
value: f32,
91-
set_value: impl Fn(&mut Context, f32) + 'static + Copy,
92-
) -> impl SliderMods {
89+
pub fn vslider(value: impl Binding<f32>) -> impl SliderMods {
9390
modview(move |opts: SliderOptions, _| {
9491
state(
9592
|| 0.0,
96-
move |height, _| {
93+
move |height, cx| {
94+
let h = cx[height];
9795
canvas(move |cx, sz, vger| {
9896
let h = cx[height];
99-
let y = value * h;
97+
let v = value.get(cx);
10098
let c = sz.center();
99+
let r = SLIDER_THUMB_RADIUS;
100+
let start_y = r;
101+
let end_y = h - r;
102+
let y = (1.0 - v) * start_y + v * end_y;
103+
101104
let paint = vger.color_paint(BUTTON_BACKGROUND_COLOR);
102105
vger.fill_rect(
103-
euclid::rect(c.x - SLIDER_WIDTH / 2.0, 0.0, SLIDER_WIDTH, sz.height()),
106+
euclid::rect(
107+
c.x - SLIDER_WIDTH / 2.0,
108+
start_y,
109+
SLIDER_WIDTH,
110+
sz.height() - 2.0 * r,
111+
),
112+
0.0,
113+
paint,
114+
);
115+
let paint = vger.color_paint(AZURE_HIGHLIGHT_BACKGROUND);
116+
vger.fill_rect(
117+
euclid::rect(c.x - SLIDER_WIDTH / 2.0, start_y, SLIDER_WIDTH, y),
104118
0.0,
105119
paint,
106120
);
107121
let paint = vger.color_paint(opts.thumb);
108-
vger.fill_circle([c.x, y], SLIDER_THUMB_RADIUS, paint);
122+
vger.fill_circle([c.x, y], r, paint);
109123
})
110124
.geom(move |cx, sz, _| {
111125
if sz.height != cx[height] {
112126
cx[height] = sz.height;
113127
}
114128
})
115-
.drag(move |cx, delta, _, _| {
116-
(set_value)(cx, (value + delta.y / cx[height]).clamp(0.0, 1.0));
129+
.drag_s(value, move |v, delta, _, _| {
130+
*v = (*v + delta.y / h).clamp(0.0, 1.0)
117131
})
118132
},
119133
)
134+
.role(accesskit::Role::Slider)
120135
})
121136
}

0 commit comments

Comments
 (0)