1use 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}