use crate::element::{ElementProps, ElementWidget};
use crate::parser::color::{darken_color, lighten_color};
use crate::parser::values::parse_ui_rect;
use crate::widgets::Widget;
use bevy::asset::AssetServer;
use bevy::color::Color;
use bevy::prelude::{Component, Entity, EntityCommands};
use roxmltree::Node;
#[derive(Clone, Debug, Component)]
pub struct ButtonWidget;
impl Widget for ButtonWidget {
fn spawn(&self, commands: &mut EntityCommands, _: &AssetServer) -> Entity {
commands.id()
}
fn parse(_: &Node, _: Option<&str>, _: Option<&ElementWidget>) -> Result<Self, String>
where
Self: Sized,
{
Ok(Self)
}
fn apply_defaults(
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));
}
}
}