fix integrate frame api...

still sucks to use
This commit is contained in:
griffi-gh 2024-03-24 00:52:37 +01:00
parent 899774a7e1
commit 3c680ea294
5 changed files with 80 additions and 62 deletions

View file

@ -1,15 +1,16 @@
use hui::{ use hui::{
draw::TextureFormat, draw::TextureFormat,
signal::Signal,
layout::{Alignment, Direction},
element::{ element::{
container::Container,
text::Text,
image::Image,
br::Break, br::Break,
container::Container,
image::Image,
slider::Slider, slider::Slider,
text::Text,
UiElementExt, UiElementExt,
}, },
frame::FrameRect,
layout::{Alignment, Direction},
signal::Signal,
size, size,
}; };
@ -37,7 +38,7 @@ ui_main!(
.with_align((Alignment::Center, Alignment::Begin)) .with_align((Alignment::Center, Alignment::Begin))
.with_direction(Direction::Horizontal) .with_direction(Direction::Horizontal)
.with_gap(5.) .with_gap(5.)
.with_background((0.1, 0.1, 0.1)) .with_background_frame(FrameRect::color((0.1, 0.1, 0.1)))
.with_wrap(true) .with_wrap(true)
.with_children(|ui| { .with_children(|ui| {
Text::new(format!("Number of images: {counter}")) Text::new(format!("Number of images: {counter}"))

View file

@ -3,18 +3,13 @@
use derive_setters::Setters; use derive_setters::Setters;
use glam::{Vec2, vec2}; use glam::{Vec2, vec2};
use crate::{ use crate::{
draw::{ImageHandle, RoundedCorners, UiDrawCommand},
element::{ElementList, MeasureContext, ProcessContext, UiElement}, element::{ElementList, MeasureContext, ProcessContext, UiElement},
layout::{Alignment, Alignment2d, Direction, LayoutInfo, Size, Size2d}, layout::{Alignment, Alignment2d, Direction, LayoutInfo, Size, Size2d},
frame::{Frame, FrameRect},
measure::{Hints, Response}, measure::{Hints, Response},
rect::{Corners, FillColor, Sides}, rect::{Sides, FillColor},
}; };
// pub struct Border {
// pub color: Vec4,
// pub width: f32,
// }
//XXX: add Order/Direction::Forward/Reverse or sth? //XXX: add Order/Direction::Forward/Reverse or sth?
//TODO: clip children flag //TODO: clip children flag
//TODO: borders //TODO: borders
@ -54,26 +49,8 @@ pub struct Container {
#[setters(into)] #[setters(into)]
pub align: Alignment2d, pub align: Alignment2d,
/// Background color of the container\ #[setters(skip)]
/// pub background_frame: Box<dyn Frame>,
/// If the container has a background texture, it will be multiplied by this color
#[setters(into)]
pub background: FillColor,
/// Background texture of the container
///
/// Can be used in conjunction with the background color\
/// In this case, the texture will be shaded by the color
///
/// Please note that if the background color is NOT set (or set to transparent), the texture will NOT be visible\
/// This is because the texture is multiplied by the color, and if the color is transparent, the texture will be too\
//TODO: fix this flaw, if background_image is called for the first time, bg wasnt explicitly set and background is transparent, set it to white
#[setters(into)]
pub background_image: Option<ImageHandle>,
/// Corner radius of the background rectangle
#[setters(into)]
pub corner_radius: Corners<f32>,
/// Set this to `true` to allow the elements wrap automatically /// Set this to `true` to allow the elements wrap automatically
/// ///
@ -93,6 +70,17 @@ impl Container {
self.children.0.extend(ElementList::from_callback(ui).0); self.children.0.extend(ElementList::from_callback(ui).0);
self self
} }
pub fn with_background_frame(mut self, frame: impl Frame + 'static) -> Self {
self.background_frame = Box::new(frame);
self
}
#[deprecated(note = "use with_background_frame instead")]
pub fn with_background(mut self, color: impl Into<FillColor>) -> Self {
self.background_frame = Box::new(FrameRect::color(color.into()));
self
}
} }
impl Default for Container { impl Default for Container {
@ -103,11 +91,9 @@ impl Default for Container {
gap: 0., gap: 0.,
padding: Sides::all(0.), padding: Sides::all(0.),
align: Alignment2d::default(), align: Alignment2d::default(),
background: FillColor::transparent(), background_frame: Box::<FrameRect>::default(),
background_image: None,
children: ElementList(Vec::new()),
wrap: false, wrap: false,
corner_radius: Corners::all(0.), children: ElementList(Vec::new()),
} }
} }
} }
@ -328,18 +314,20 @@ impl UiElement for Container {
let mut position = ctx.layout.position; let mut position = ctx.layout.position;
//background //background
if !self.background.is_transparent() { // if !self.background.is_transparent() {
let corner_colors = self.background.corners(); // let corner_colors = self.background.corners();
ctx.draw.add(UiDrawCommand::Rectangle { // ctx.draw.add(UiDrawCommand::Rectangle {
position, // position,
size: ctx.measure.size, // size: ctx.measure.size,
color: corner_colors, // color: corner_colors,
texture: self.background_image, // texture: self.background_image,
rounded_corners: (self.corner_radius.max_f32() > 0.).then_some({ // rounded_corners: (self.corner_radius.max_f32() > 0.).then_some({
RoundedCorners::from_radius(self.corner_radius) // RoundedCorners::from_radius(self.corner_radius)
}), // }),
}); // });
} // }
self.background_frame.draw(ctx.draw, ctx.layout.position, ctx.measure.size);
//padding //padding
position += vec2(self.padding.left, self.padding.top); position += vec2(self.padding.left, self.padding.top);

View file

@ -1,5 +1,5 @@
use glam::Vec2; use glam::Vec2;
use crate::draw::UiDrawCommandList; use crate::{draw::{UiDrawCommand, UiDrawCommandList}, rect::FillColor};
pub mod point; pub mod point;
mod rect; mod rect;
@ -10,3 +10,28 @@ pub use rect::FrameRect;
pub trait Frame { pub trait Frame {
fn draw(&self, draw: &mut UiDrawCommandList, position: Vec2, parent_size: Vec2); fn draw(&self, draw: &mut UiDrawCommandList, position: Vec2, parent_size: Vec2);
} }
impl Frame for FillColor {
fn draw(&self, draw: &mut UiDrawCommandList, position: Vec2, parent_size: Vec2) {
draw.add(UiDrawCommand::Rectangle {
position,
size: parent_size,
color: self.corners(),
texture: None,
rounded_corners: None,
})
}
}
// impl<T: Into<FillColor> + Clone> Frame for T {
// fn draw(&self, draw: &mut UiDrawCommandList, position: Vec2, parent_size: Vec2) {
// let color: FillColor = self.clone().into();
// draw.add(UiDrawCommand::Rectangle {
// position,
// size: parent_size,
// color: color.corners(),
// texture: None,
// rounded_corners: None,
// })
// }
// }

View file

@ -43,14 +43,14 @@ impl FramePoint {
/// Center of the frame axis /// Center of the frame axis
pub const CENTER: Self = Self { pub const CENTER: Self = Self {
absolute: 0.5, absolute: 0.0,
relative: 0.0, relative: 0.5,
}; };
/// End of the frame axis /// End of the frame axis
pub const END: Self = Self { pub const END: Self = Self {
absolute: 1.0, absolute: 0.0,
relative: 0.0, relative: 1.0,
}; };
/// Create a new absolutely positioned `FramePoint` /// Create a new absolutely positioned `FramePoint`

View file

@ -40,25 +40,27 @@ pub struct FrameRect {
impl From<FillColor> for FrameRect { impl From<FillColor> for FrameRect {
fn from(color: FillColor) -> Self { fn from(color: FillColor) -> Self {
Self::from_color(color) Self::color(color)
} }
} }
impl From<ImageHandle> for FrameRect { impl From<ImageHandle> for FrameRect {
fn from(image: ImageHandle) -> Self { fn from(image: ImageHandle) -> Self {
Self::from_image(image) Self::image(image)
} }
} }
impl FrameRect { impl FrameRect {
pub fn from_color(color: impl Into<FillColor>) -> Self { /// Create a new [`FrameRect`] with the given color
pub fn color(color: impl Into<FillColor>) -> Self {
Self { Self {
color: color.into(), color: color.into(),
..Self::default() ..Self::default()
} }
} }
pub fn from_image(image: ImageHandle) -> Self { /// Create a new [`FrameRect`] with the given image
pub fn image(image: ImageHandle) -> Self {
Self { Self {
color: color::WHITE.into(), color: color::WHITE.into(),
image: Some(image), image: Some(image),
@ -66,7 +68,8 @@ impl FrameRect {
} }
} }
pub fn from_color_image(color: impl Into<FillColor>, image: ImageHandle) -> Self { /// Create a new [`FrameRect`] with the given color and image
pub fn color_image(color: impl Into<FillColor>, image: ImageHandle) -> Self {
Self { Self {
color: color.into(), color: color.into(),
image: Some(image), image: Some(image),
@ -74,10 +77,11 @@ impl FrameRect {
} }
} }
pub fn with_corner_radius(radius: impl Into<Corners<f32>>) -> Self { /// Set the corner radius of the [`FrameRect`]
pub fn with_corner_radius(self, radius: impl Into<Corners<f32>>) -> Self {
Self { Self {
corner_radius: radius.into(), corner_radius: radius.into(),
..Self::default() ..self
} }
} }
@ -96,7 +100,7 @@ impl FrameRect {
impl Default for FrameRect { impl Default for FrameRect {
fn default() -> Self { fn default() -> Self {
Self { Self {
color: FillColor::default(), color: FillColor::transparent(),
image: None, image: None,
top_left: FramePoint2d::TOP_LEFT, top_left: FramePoint2d::TOP_LEFT,
bottom_right: FramePoint2d::BOTTOM_RIGHT, bottom_right: FramePoint2d::BOTTOM_RIGHT,