Add Border widget
This commit is contained in:
parent
613c57c1aa
commit
c2e2ee52e8
4 changed files with 52 additions and 2 deletions
2
Cargo.lock
generated
2
Cargo.lock
generated
|
|
@ -1241,7 +1241,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "toss"
|
name = "toss"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/Garmelon/toss.git?rev=14aedaf25212cd50924566821ad37645a4cacf28#14aedaf25212cd50924566821ad37645a4cacf28"
|
source = "git+https://github.com/Garmelon/toss.git?rev=53b2728c827c9f93a743d5860c1b31cb1399875b#53b2728c827c9f93a743d5860c1b31cb1399875b"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"crossterm",
|
"crossterm",
|
||||||
"unicode-linebreak",
|
"unicode-linebreak",
|
||||||
|
|
|
||||||
|
|
@ -30,4 +30,4 @@ features = ["rustls-tls-native-roots"]
|
||||||
|
|
||||||
[dependencies.toss]
|
[dependencies.toss]
|
||||||
git = "https://github.com/Garmelon/toss.git"
|
git = "https://github.com/Garmelon/toss.git"
|
||||||
rev = "14aedaf25212cd50924566821ad37645a4cacf28"
|
rev = "53b2728c827c9f93a743d5860c1b31cb1399875b"
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
pub mod background;
|
pub mod background;
|
||||||
|
pub mod border;
|
||||||
pub mod empty;
|
pub mod empty;
|
||||||
pub mod join;
|
pub mod join;
|
||||||
pub mod list;
|
pub mod list;
|
||||||
|
|
|
||||||
49
src/ui/widgets/border.rs
Normal file
49
src/ui/widgets/border.rs
Normal file
|
|
@ -0,0 +1,49 @@
|
||||||
|
use async_trait::async_trait;
|
||||||
|
use toss::frame::{Frame, Pos, Size};
|
||||||
|
|
||||||
|
use super::{BoxedWidget, Widget};
|
||||||
|
|
||||||
|
pub struct Border(BoxedWidget);
|
||||||
|
|
||||||
|
impl Border {
|
||||||
|
pub fn new<W: Into<BoxedWidget>>(inner: W) -> Self {
|
||||||
|
Self(inner.into())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[async_trait]
|
||||||
|
impl Widget for Border {
|
||||||
|
fn size(&self, frame: &mut Frame, max_width: Option<u16>, max_height: Option<u16>) -> Size {
|
||||||
|
let max_width = max_width.map(|w| w.saturating_sub(2));
|
||||||
|
let max_height = max_height.map(|h| h.saturating_sub(2));
|
||||||
|
let size = self.0.size(frame, max_width, max_height);
|
||||||
|
size + Size::new(2, 2)
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn render(self: Box<Self>, frame: &mut Frame) {
|
||||||
|
let mut size = frame.size();
|
||||||
|
size.width = size.width.max(2);
|
||||||
|
size.height = size.height.max(2);
|
||||||
|
|
||||||
|
let right = size.width as i32 - 1;
|
||||||
|
let bottom = size.height as i32 - 1;
|
||||||
|
frame.write(Pos::new(0, 0), "┌");
|
||||||
|
frame.write(Pos::new(right, 0), "┐");
|
||||||
|
frame.write(Pos::new(0, bottom), "└");
|
||||||
|
frame.write(Pos::new(right, bottom), "┘");
|
||||||
|
|
||||||
|
for y in 1..bottom {
|
||||||
|
frame.write(Pos::new(0, y), "│");
|
||||||
|
frame.write(Pos::new(right, y), "│");
|
||||||
|
}
|
||||||
|
|
||||||
|
for x in 1..right {
|
||||||
|
frame.write(Pos::new(x, 0), "─");
|
||||||
|
frame.write(Pos::new(x, bottom), "─");
|
||||||
|
}
|
||||||
|
|
||||||
|
frame.push(Pos::new(1, 1), size - Size::new(2, 2));
|
||||||
|
self.0.render(frame).await;
|
||||||
|
frame.pop();
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue