clocks/
clocks.rs

1//! Simple example demonstrating conic gradients
2
3use bevy::color::palettes::css::BLUE;
4use bevy::color::palettes::css::RED;
5use bevy::prelude::*;
6use bevy_ui_gradients::*;
7use std::f32::consts::TAU;
8
9fn main() {
10    App::new()
11        .add_plugins((DefaultPlugins, UiGradientsPlugin))
12        .add_systems(Startup, setup)
13        .add_systems(Update, update_clocks)
14        .run();
15}
16
17#[derive(Component)]
18struct ClockMode(u32);
19
20fn setup(mut commands: Commands) {
21    commands.spawn(Camera2d);
22
23    commands
24        .spawn(Node {
25            width: Val::Percent(100.),
26            height: Val::Percent(100.),
27            justify_content: JustifyContent::Center,
28            align_items: AlignItems::Center,
29            column_gap: Val::Px(10.),
30            ..Default::default()
31        })
32        .with_children(|commands| {
33            for i in 0..7 {
34                commands.spawn((
35                    Node {
36                        width: Val::Px(150.),
37                        height: Val::Px(150.),
38                        ..Default::default()
39                    },
40                    BorderRadius::MAX,
41                    BackgroundGradient::default(),
42                    ClockMode(i),
43                    Outline {
44                        width: Val::Px(2.),
45                        color: Color::WHITE,
46                        ..Default::default()
47                    },
48                ));
49            }
50        });
51}
52
53fn update_clocks(time: Res<Time>, mut query: Query<(&ClockMode, &mut BackgroundGradient)>) {
54    let t = time.elapsed_secs();
55    for (clock_mode, mut gradient) in query.iter_mut() {
56        let angle = match clock_mode.0 {
57            0 => t,
58            1 => TAU - t,
59            2 => t.rem_euclid(TAU),
60            3 => TAU - (time.elapsed_secs() % (2.0 * TAU) - TAU).abs(),
61            4 => time.elapsed_secs().rem_euclid(12.).floor() * TAU / 12.,
62            5 => 0.,
63            _ => TAU,
64        };
65        *gradient = BackgroundGradient::from(ConicGradient {
66            start: 0.,
67            position: Default::default(),
68            stops: vec![
69                AngularColorStop::new(RED, 0.0),
70                AngularColorStop::new(RED, angle),
71                AngularColorStop::new(BLUE, angle),
72            ],
73        });
74    }
75}