use crate::element::ElementProps;
use crate::parser::AttributeMap;
use crate::parser::color::{darken_color, lighten_color};
use crate::parser::values::parse_ui_rect;
use crate::widgets::Widget;
use bevy::app::App;
use bevy::color::Color;
use bevy::prelude::{Entity, World};
use roxmltree::Node;
#[derive(Clone, Debug, Default)]
pub struct ButtonWidget;
impl Widget for ButtonWidget {
fn name() -> &'static str
where
Self: Sized,
{
"Button"
}
fn setup(&self, _: &mut App) {}
fn parse(&mut self, _: &Node, _: AttributeMap) -> Result<(), String>
where
Self: Sized,
{
Ok(())
}
fn spawn(&self, entity: Entity, _: &mut World) -> Entity {
entity
}
fn apply_defaults(
&self,
node: &Node,
default: &mut ElementProps,
hover: &mut ElementProps,
click: &mut ElementProps,
) {
let base_bg = default
.bg_color
.unwrap_or_else(|| Color::srgb(0.2, 0.2, 0.2));
if !node.has_attribute("padding") {
default.node.padding = parse_ui_rect("15px 20px").unwrap();
}
if !node.has_attribute("hover.padding") {
hover.node.padding = default.node.padding;
}
if node.has_attribute("click.padding") {
click.node.padding = default.node.padding;
}
if default.bg_color.is_none() {
default.bg_color = Some(base_bg);
}
if !node.has_attribute("hover.bg-color") {
hover.bg_color = Some(lighten_color(base_bg, 0.15));
}
if !node.has_attribute("click.bg-color") {
click.bg_color = Some(darken_color(base_bg, 0.15));
}
}
fn dyn_clone(&self) -> Box<dyn Widget> {
Box::new(Self)
}
}