use bevy::prelude::*;
pub(super) fn plugin(app: &mut App) {
app.register_type::<InteractionPalette>();
app.add_systems(Update, apply_interaction_palette);
}
pub type InteractionQuery<'w, 's, T> =
Query<'w, 's, (&'static Interaction, T), Changed<Interaction>>;
#[derive(Component, Debug, Reflect, Clone)]
#[reflect(Component)]
pub struct InteractionPalette {
pub none: Color,
pub hovered: Color,
pub pressed: Color,
}
impl Default for InteractionPalette {
fn default() -> Self {
Self {
none: Color::BLACK,
hovered: Color::WHITE.mix(&Color::BLACK, 0.5),
pressed: Color::WHITE,
}
}
}
fn apply_interaction_palette(
mut palette_query: InteractionQuery<(&InteractionPalette, &mut BackgroundColor)>,
) {
for (interaction, (palette, mut background)) in &mut palette_query {
*background = match interaction {
Interaction::None => palette.none,
Interaction::Hovered => palette.hovered,
Interaction::Pressed => palette.pressed,
}
.into();
}
}