Skip to content

Commit d742acc

Browse files
committed
Decouple stateful components from color slider patch
1 parent 027e39c commit d742acc

File tree

2 files changed

+36
-40
lines changed

2 files changed

+36
-40
lines changed

crates/bevy_feathers/src/controls/color_slider.rs

Lines changed: 36 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
use core::f32::consts::PI;
22

33
use bevy_app::{Plugin, PreUpdate};
4-
use bevy_asset::Handle;
54
use bevy_color::{Alpha, Color, Hsla};
65
use bevy_core_widgets::{
76
CallbackTemplate, CoreSlider, CoreSliderThumb, SliderRange, SliderValue, TrackClick,
87
ValueChange,
98
};
109
use bevy_ecs::{
11-
bundle::Bundle,
1210
component::Component,
1311
entity::Entity,
1412
hierarchy::Children,
@@ -25,13 +23,9 @@ use bevy_ui::{
2523
FlexDirection, Gradient, InterpolationColorSpace, LinearGradient, Node, Outline, PositionType,
2624
UiRect, UiTransform, Val, Val2, ZIndex,
2725
};
28-
use bevy_ui_render::ui_material::MaterialNode;
2926

3027
use crate::{
31-
alpha_pattern::{AlphaPattern, AlphaPatternMaterial},
32-
cursor::EntityCursor,
33-
palette,
34-
rounded_corners::RoundedCorners,
28+
alpha_pattern::AlphaPattern, cursor::EntityCursor, palette, rounded_corners::RoundedCorners,
3529
};
3630

3731
const SLIDER_HEIGHT: f32 = 16.0;
@@ -144,8 +138,6 @@ pub struct SliderBaseColor(pub Color);
144138

145139
/// Color slider template properties, passed to [`color_slider`] function.
146140
pub struct ColorSliderProps {
147-
/// Slider current value
148-
pub value: f32,
149141
/// On-change handler
150142
pub on_change: CallbackTemplate<In<ValueChange<f32>>>,
151143
/// Which color component we're editing
@@ -155,7 +147,6 @@ pub struct ColorSliderProps {
155147
impl Default for ColorSliderProps {
156148
fn default() -> Self {
157149
Self {
158-
value: 0.0,
159150
on_change: CallbackTemplate::Ignore,
160151
channel: ColorChannel::Alpha,
161152
}
@@ -164,7 +155,7 @@ impl Default for ColorSliderProps {
164155

165156
/// A color slider widget.
166157
#[derive(Component, Default, Clone)]
167-
#[require(SliderBaseColor(Color::WHITE))]
158+
#[require(SliderValue, SliderBaseColor(Color::WHITE))]
168159
pub struct ColorSlider {
169160
/// Which channel is being edited by this slider.
170161
pub channel: ColorChannel,
@@ -174,8 +165,38 @@ pub struct ColorSlider {
174165
#[derive(Component, Default, Clone)]
175166
struct ColorSliderTrack;
176167

168+
/// Marker for the left/right endcaps
169+
#[derive(Component, Default, Clone)]
170+
#[require(BackgroundColor)]
171+
struct ColorSliderEndCap;
172+
173+
#[derive(Component, Default, Clone)]
174+
#[require(
175+
BackgroundGradient(vec![Gradient::Linear(LinearGradient {
176+
angle: PI * 0.5,
177+
stops: vec![
178+
ColorStop::new(Color::NONE, Val::Percent(0.)),
179+
ColorStop::new(Color::NONE, Val::Percent(50.)),
180+
ColorStop::new(Color::NONE, Val::Percent(100.)),
181+
],
182+
color_space: InterpolationColorSpace::Srgba,
183+
})])
184+
)]
185+
struct ColorSliderGradient;
186+
177187
/// Marker for the thumb
178188
#[derive(Component, Default, Clone)]
189+
#[require(
190+
Node {
191+
position_type: PositionType::Absolute,
192+
left: Val::Percent(0.),
193+
top: Val::Percent(50.),
194+
width: Val::Px(THUMB_SIZE),
195+
height: Val::Px(THUMB_SIZE),
196+
border: UiRect::all(Val::Px(2.0)),
197+
..Default::default()
198+
}
199+
)]
179200
struct ColorSliderThumb;
180201

181202
/// Spawn a new slider widget.
@@ -201,7 +222,6 @@ pub fn color_slider(props: ColorSliderProps) -> impl Scene {
201222
ColorSlider {
202223
channel: {props.channel.clone()},
203224
}
204-
SliderValue({props.value})
205225
template_value(channel_range)
206226
EntityCursor::System(bevy_window::SystemCursorIcon::Pointer)
207227
TabIndex(0)
@@ -216,41 +236,24 @@ pub fn color_slider(props: ColorSliderProps) -> impl Scene {
216236
}
217237
template_value(RoundedCorners::All.to_border_radius(TRACK_RADIUS))
218238
ColorSliderTrack
219-
AlphaPattern
220-
MaterialNode::<AlphaPatternMaterial>(Handle::default())
239+
AlphaPattern::default()
221240
[
222241
// Left endcap
223242
(
243+
ColorSliderEndCap
224244
Node {
225245
width: Val::Px({THUMB_SIZE * 0.5}),
226246
}
227247
template_value(RoundedCorners::Left.to_border_radius(TRACK_RADIUS))
228-
BackgroundColor({palette::X_AXIS})
229248
),
230249
// Track with gradient
231250
(
232251
Node {
233252
flex_grow: 1.0,
234253
}
235-
BackgroundGradient({vec![Gradient::Linear(LinearGradient {
236-
angle: PI * 0.5,
237-
stops: vec![
238-
ColorStop::new(Color::NONE, Val::Percent(0.)),
239-
ColorStop::new(Color::NONE, Val::Percent(50.)),
240-
ColorStop::new(Color::NONE, Val::Percent(100.)),
241-
],
242-
color_space: InterpolationColorSpace::Srgba,
243-
})]})
254+
ColorSliderGradient
244255
ZIndex(1)
245256
[
246-
Node {
247-
position_type: PositionType::Absolute,
248-
left: Val::Percent(0.),
249-
top: Val::Percent(50.),
250-
width: Val::Px(THUMB_SIZE),
251-
height: Val::Px(THUMB_SIZE),
252-
border: UiRect::all(Val::Px(2.0)),
253-
}
254257
CoreSliderThumb
255258
ColorSliderThumb
256259
BorderRadius::MAX
@@ -268,11 +271,11 @@ pub fn color_slider(props: ColorSliderProps) -> impl Scene {
268271
),
269272
// Right endcap
270273
(
274+
ColorSliderEndCap
271275
Node {
272276
width: Val::Px({THUMB_SIZE * 0.5}),
273277
}
274278
template_value(RoundedCorners::Right.to_border_radius(TRACK_RADIUS))
275-
BackgroundColor({palette::Z_AXIS})
276279
),
277280
]
278281
]

examples/ui/feathers.rs

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,6 @@ fn demo_root() -> impl Scene {
252252
),
253253
:color_slider(
254254
ColorSliderProps {
255-
value: 0.5,
256255
on_change: callback(
257256
|change: In<ValueChange<f32>>, mut color: ResMut<DemoWidgetStates>| {
258257
color.rgb_color.red = change.value;
@@ -263,7 +262,6 @@ fn demo_root() -> impl Scene {
263262
),
264263
:color_slider(
265264
ColorSliderProps {
266-
value: 0.5,
267265
on_change: callback(
268266
|change: In<ValueChange<f32>>, mut color: ResMut<DemoWidgetStates>| {
269267
color.rgb_color.green = change.value;
@@ -274,7 +272,6 @@ fn demo_root() -> impl Scene {
274272
),
275273
:color_slider(
276274
ColorSliderProps {
277-
value: 0.5,
278275
on_change: callback(
279276
|change: In<ValueChange<f32>>, mut color: ResMut<DemoWidgetStates>| {
280277
color.rgb_color.blue = change.value;
@@ -285,7 +282,6 @@ fn demo_root() -> impl Scene {
285282
),
286283
:color_slider(
287284
ColorSliderProps {
288-
value: 0.5,
289285
on_change: callback(
290286
|change: In<ValueChange<f32>>, mut color: ResMut<DemoWidgetStates>| {
291287
color.rgb_color.alpha = change.value;
@@ -302,7 +298,6 @@ fn demo_root() -> impl Scene {
302298
),
303299
:color_slider(
304300
ColorSliderProps {
305-
value: 0.5,
306301
on_change: callback(
307302
|change: In<ValueChange<f32>>, mut color: ResMut<DemoWidgetStates>| {
308303
color.hsl_color.hue = change.value;
@@ -313,7 +308,6 @@ fn demo_root() -> impl Scene {
313308
),
314309
:color_slider(
315310
ColorSliderProps {
316-
value: 0.5,
317311
on_change: callback(
318312
|change: In<ValueChange<f32>>, mut color: ResMut<DemoWidgetStates>| {
319313
color.hsl_color.saturation = change.value;
@@ -324,7 +318,6 @@ fn demo_root() -> impl Scene {
324318
),
325319
:color_slider(
326320
ColorSliderProps {
327-
value: 0.5,
328321
on_change: callback(
329322
|change: In<ValueChange<f32>>, mut color: ResMut<DemoWidgetStates>| {
330323
color.hsl_color.lightness = change.value;

0 commit comments

Comments
 (0)