split Outset into 2 phases

This commit is contained in:
🪞👃🪞 2024-09-13 02:37:21 +03:00
parent 00da7de142
commit a0fbbc6257
3 changed files with 76 additions and 22 deletions

View file

@ -37,25 +37,66 @@ impl Content for Demo<Tui> {
type Engine = Tui; type Engine = Tui;
fn content (&self) -> impl Widget<Engine = Tui> { fn content (&self) -> impl Widget<Engine = Tui> {
Layers::new(|add|{ Layers::new(|add|{
add(&FillBg(Color::Rgb(128,0,0)))?;
add(&Outset::X(1, "foo"))?; add(&FillBg(Color::Rgb(0,128,128)))?;
add(&Outset::XY(1, 1, Split::down(|add|{
add(&Layers::new(|add|{
add(&FillBg(Color::Rgb(255,0,0)))?;
add(&Outset::X(1, "."))?;
Ok(())
}))?;
add(&Layers::new(|add|{
add(&FillBg(Color::Rgb(255,128,0)))?;
add(&Outset::Y(1, "---"))?;
Ok(())
}))?;
add(&Layers::new(|add|{
add(&FillBg(Color::Rgb(128,0,0)))?;
add(&Outset::XY(0, 0, "~~~"))?;
Ok(())
}))?;
Ok(())
})))?;
Ok(()) Ok(())
}) })
//Align::Center(Outset::X(1, Layers::new(|add|{
//add(&FillBg(Color::Rgb(128,0,0)))?;
//add(&Split::down(|add|{
//add(&Outset::Y(1, Layers::new(|add|{
//add(&FillBg(Color::Rgb(0,128,0)))?;
//add(&Align::Center("12345"))?;
//add(&Align::Center("FOO"))
//})))?;
//add(&Outset::XY(1, 1, Layers::new(|add|{
//add(&Align::Center("1234567"))?;
//add(&Align::Center("BAR"))?;
//add(&FillBg(Color::Rgb(0,0,128)))
//})))
//}))
//})))
//Align::Y(Layers::new(|add|{ //Align::Y(Layers::new(|add|{
//add(&FillBg(Color::Rgb(128,0,0)))?; //add(&FillBg(Color::Rgb(128,0,0)))?;
//add(&Outset::X(1, Align::Center(Split::down(|add|{ //add(&Outset::X(1, Align::Center(Split::down(|add|{
//add(&Align::X(Layers::new(|add|{ //add(&Align::X(Outset::Y(1, Layers::new(|add|{
//add(&FillBg(Color::Rgb(0,128,0)))?; //add(&FillBg(Color::Rgb(0,128,0)))?;
//add(&Outset::Y(1, Align::Center("12345")))?; //add(&Align::Center("12345"))?;
//add(&Align::Center("FOO")) //add(&Align::Center("FOO"))
//})))?; //})))?;
//add(&Layers::new(|add|{ //add(&Outset::XY(1, 1, Layers::new(|add|{
//add(&Outset::XY(1, 1, Align::Center("1234567")))?; //add(&Align::Center("1234567"))?;
//add(&Align::Center("BAR"))?; //add(&Align::Center("BAR"))?;
//add(&FillBg(Color::Rgb(0,0,128))) //add(&FillBg(Color::Rgb(0,0,128)))
//}))?; //})))?;
//Ok(()) //Ok(())
//})))) //})))))
//})) //}))
} }
} }

View file

@ -568,12 +568,8 @@ where
Ok(Some([x, y, w, h])) Ok(Some([x, y, w, h]))
} }
fn render (&self, to: &mut Tui) -> Perhaps<[u16;4]> { fn render (&self, to: &mut Tui) -> Perhaps<[u16;4]> {
let layout = self.layout(to.area())?;
self.layout(to.area())? self.layout(to.area())?
.map(|area|(self.0)(&mut |layer| { .map(|area|(self.0)(&mut |layer|to.render_in(area, &layer).map(|_|())).map(|_|area))
to.render_in(area, &layer)?;
Ok(())
}).map(|_|area))
.transpose() .transpose()
} }
} }
@ -606,19 +602,36 @@ impl<T: Widget<Engine = Tui>> Content for Inset<u16, T> {
//} //}
//} //}
impl<T: Widget<Engine = Tui>> Content for Outset<u16, T> { impl<T: Widget<Engine = Tui>> Widget for Outset<u16, T> {
type Engine = Tui; type Engine = Tui;
fn content (&self) -> impl Widget<Engine = Tui> { fn layout (&self, to: [u16;4]) -> Perhaps<[u16;4]> {
match *self { match *self {
Self::X(x, ref inner) => Self::X(x, ref inner) => Grow::X(x + x, inner as &dyn Widget<Engine = Tui>),
Grow::X(x + x, inner as &dyn Widget<Engine = Tui>), Self::Y(y, ref inner) => Grow::Y(y + y, inner as &dyn Widget<Engine = Tui>),
Self::Y(y, ref inner) => Self::XY(x, y, ref inner) => Grow::XY(x + x, y + y, inner as &dyn Widget<Engine = Tui>),
Grow::Y(y + y, inner as &dyn Widget<Engine = Tui>), }.layout(to)
Self::XY(x, y, ref inner) => }
Grow::XY(x, y, inner as &dyn Widget<Engine = Tui>), fn render (&self, to: &mut Tui) -> Perhaps<[u16;4]> {
} match *self {
Self::X(x, ref inner) => Plus::X(x, inner as &dyn Widget<Engine = Tui>),
Self::Y(y, ref inner) => Plus::Y(y, inner as &dyn Widget<Engine = Tui>),
Self::XY(x, y, ref inner) => Plus::XY(x, y, inner as &dyn Widget<Engine = Tui>),
}.render(to)
} }
} }
//impl<T: Widget<Engine = Tui>> Content for Outset<u16, T> {
//type Engine = Tui;
//fn content (&self) -> impl Widget<Engine = Tui> {
//match *self {
//Self::X(x, ref inner) =>
//Grow::X(x + x, inner as &dyn Widget<Engine = Tui>),
//Self::Y(y, ref inner) =>
//Grow::Y(y + y, inner as &dyn Widget<Engine = Tui>),
//Self::XY(x, y, ref inner) =>
//Grow::XY(x, y, inner as &dyn Widget<Engine = Tui>),
//}
//}
//}
pub trait BorderStyle { pub trait BorderStyle {
const NW: &'static str = ""; const NW: &'static str = "";