From 4238ef2d30eb3c8ef4e81f320cd62a8b73e61d2d Mon Sep 17 00:00:00 2001 From: stork Date: Thu, 8 Apr 2021 12:44:23 -0700 Subject: [PATCH 1/2] introduced a simple, customizable, and overridable default material behavior for buttons --- crates/bevy_ui/src/lib.rs | 10 ++ crates/bevy_ui/src/widget/button.rs | 88 +++++++++++++++ examples/ui/button.rs | 159 +++++++++++++++++++--------- 3 files changed, 208 insertions(+), 49 deletions(-) diff --git a/crates/bevy_ui/src/lib.rs b/crates/bevy_ui/src/lib.rs index 352dba04f4972..7d395d93cf038 100644 --- a/crates/bevy_ui/src/lib.rs +++ b/crates/bevy_ui/src/lib.rs @@ -30,6 +30,7 @@ use bevy_math::{Rect, Size}; use bevy_render::RenderStage; use bevy_transform::TransformSystem; use update::ui_z_system; +use widget::DefaultButtonMaterials; #[derive(Default)] pub struct UiPlugin; @@ -43,6 +44,7 @@ pub enum UiSystem { impl Plugin for UiPlugin { fn build(&self, app: &mut AppBuilder) { app.init_resource::() + .init_resource::() .register_type::() .register_type::() .register_type::() @@ -85,6 +87,14 @@ impl Plugin for UiPlugin { .after(UiSystem::Flex) .before(TransformSystem::TransformPropagate), ) + .add_system_to_stage( + CoreStage::PostUpdate, + widget::button_default_materials_system.system(), + ) + .add_system_to_stage( + CoreStage::PostUpdate, + widget::button_materials_system.system(), + ) .add_system_to_stage(RenderStage::Draw, widget::draw_text_system.system()); crate::render::add_ui_graph(app.world_mut()); diff --git a/crates/bevy_ui/src/widget/button.rs b/crates/bevy_ui/src/widget/button.rs index 47baf3b6fae5d..fa8555c439d45 100644 --- a/crates/bevy_ui/src/widget/button.rs +++ b/crates/bevy_ui/src/widget/button.rs @@ -1,2 +1,90 @@ +use bevy_asset::{Assets, Handle}; +use bevy_ecs::prelude::{Changed, FromWorld, Query, Res, With, Without, World}; +use bevy_render::prelude::Color; +use bevy_sprite::ColorMaterial; + +use crate::Interaction; + #[derive(Debug, Clone)] pub struct Button; + +#[derive(Debug, Clone)] +pub struct DefaultButtonMaterials { + pub normal: Handle, + pub hovered: Handle, + pub pressed: Handle, +} + +impl FromWorld for DefaultButtonMaterials { + fn from_world(world: &mut World) -> Self { + let mut materials = world.get_resource_mut::>().unwrap(); + + DefaultButtonMaterials { + normal: materials.add(Color::rgb(0.15, 0.15, 0.15).into()), + hovered: materials.add(Color::rgb(0.25, 0.25, 0.25).into()), + pressed: materials.add(Color::rgb(0.35, 0.75, 0.35).into()), + } + } +} + +#[derive(Debug, Clone)] +pub struct ButtonMaterials { + pub normal: Handle, + pub hovered: Handle, + pub pressed: Handle, +} + +#[derive(Debug, Clone)] +pub struct CustomButtonMaterialBehavior; + +pub fn button_default_materials_system( + default_materials: Res, + mut query: Query< + (&Interaction, &mut Handle), + ( + Changed, + With