1use bevy_asset::prelude::*;
2use bevy_color::prelude::*;
3use bevy_ecs::prelude::*;
4use bevy_image::prelude::*;
5use bevy_ui::prelude::*;
6
7use crate::UiToBundle;
8
9pub mod grid;
10pub mod stack;
11
12pub mod prelude {
13 pub use super::grid::prelude::*;
14 pub use super::stack::prelude::*;
15 pub use super::{BackgroundContainer, BackgroundStyle, BorderContainer, BorderStyle};
16}
17
18pub trait BackgroundContainer {
20 fn background_node(&mut self) -> &mut BackgroundStyle;
22
23 fn background_color(mut self, color: impl Into<Color>) -> Self
25 where
26 Self: Sized,
27 {
28 *self.background_node() = BackgroundStyle::Color(color.into());
29 self
30 }
31
32 fn background_image(mut self, image: Handle<Image>) -> Self
34 where
35 Self: Sized,
36 {
37 *self.background_node() = BackgroundStyle::Image(image);
38 self
39 }
40}
41
42pub enum BackgroundStyle {
44 Color(Color),
46 Image(Handle<Image>),
48}
49
50impl UiToBundle for BackgroundStyle {
51 fn pack(self) -> impl Bundle {
52 match self {
53 BackgroundStyle::Color(color) => (
54 BackgroundColor(color),
55 ImageNode::solid_color(Srgba::NONE.into()),
56 ),
57 BackgroundStyle::Image(handle) => {
58 (BackgroundColor(Srgba::NONE.into()), ImageNode::new(handle))
59 }
60 }
61 }
62}
63
64impl Default for BackgroundStyle {
65 fn default() -> Self {
66 BackgroundStyle::Color(Srgba::NONE.into())
67 }
68}
69
70pub trait BorderContainer {
72 fn border_node(&mut self) -> &mut BorderStyle;
74
75 fn border_color(mut self, border_color: impl Into<Color>) -> Self
77 where
78 Self: Sized,
79 {
80 self.border_node().border_color.0 = border_color.into();
81 self
82 }
83
84 fn border_radius(mut self, border_radius: BorderRadius) -> Self
86 where
87 Self: Sized,
88 {
89 self.border_node().border_radius = border_radius;
90 self
91 }
92}
93
94pub struct BorderStyle {
96 border_radius: BorderRadius,
98 border_color: BorderColor,
100}
101
102impl UiToBundle for BorderStyle {
103 fn pack(self) -> impl Bundle {
104 (self.border_radius, self.border_color)
105 }
106}
107
108impl Default for BorderStyle {
109 fn default() -> Self {
110 Self {
111 border_radius: BorderRadius::ZERO,
112 border_color: BorderColor(Srgba::NONE.into()),
113 }
114 }
115}