Use frame stack instead of explicit pos and size parameters

This commit is contained in:
Joscha 2022-07-13 11:34:31 +02:00
parent 44470b973d
commit 9aed0a3cee
9 changed files with 22 additions and 15 deletions

2
Cargo.lock generated
View file

@ -1246,7 +1246,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=e4e1454e8064269350ff7f10b2dcbb388d26c57d#e4e1454e8064269350ff7f10b2dcbb388d26c57d" source = "git+https://github.com/Garmelon/toss.git?rev=14aedaf25212cd50924566821ad37645a4cacf28#14aedaf25212cd50924566821ad37645a4cacf28"
dependencies = [ dependencies = [
"crossterm", "crossterm",
"unicode-linebreak", "unicode-linebreak",

View file

@ -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 = "e4e1454e8064269350ff7f10b2dcbb388d26c57d" rev = "14aedaf25212cd50924566821ad37645a4cacf28"

View file

@ -262,7 +262,9 @@ impl EuphRoom {
let mut list = self.nick_list.list(); let mut list = self.nick_list.list();
Self::render_rows(&mut list, joined); Self::render_rows(&mut list, joined);
Box::new(list).render(frame, pos, size).await; frame.push(pos, size);
Box::new(list).render(frame).await;
frame.pop();
} }
fn render_hsplit(frame: &mut Frame, hsplit: i32) { fn render_hsplit(frame: &mut Frame, hsplit: i32) {

View file

@ -152,7 +152,7 @@ impl Rooms {
let rooms = self.stabilize_rooms().await; let rooms = self.stabilize_rooms().await;
let mut list = self.list.list().focus(true); let mut list = self.list.list().focus(true);
self.render_rows(&mut list, rooms).await; self.render_rows(&mut list, rooms).await;
Box::new(list).render(frame, Pos::ZERO, frame.size()).await; Box::new(list).render(frame).await;
} }
pub async fn handle_key_event( pub async fn handle_key_event(

View file

@ -10,5 +10,5 @@ use toss::frame::{Frame, Pos, Size};
pub trait Widget { pub trait Widget {
fn size(&self, frame: &mut Frame, max_width: Option<u16>, max_height: Option<u16>) -> Size; fn size(&self, frame: &mut Frame, max_width: Option<u16>, max_height: Option<u16>) -> Size;
async fn render(self: Box<Self>, frame: &mut Frame, pos: Pos, size: Size); async fn render(self: Box<Self>, frame: &mut Frame);
} }

View file

@ -24,13 +24,14 @@ impl Widget for Background {
self.inner.size(frame, max_width, max_height) self.inner.size(frame, max_width, max_height)
} }
async fn render(self: Box<Self>, frame: &mut Frame, pos: Pos, size: Size) { async fn render(self: Box<Self>, frame: &mut Frame) {
let size = frame.size();
for dy in 0..size.height { for dy in 0..size.height {
for dx in 0..size.width { for dx in 0..size.width {
frame.write(pos + Pos::new(dx.into(), dy.into()), (" ", self.style)); frame.write(Pos::new(dx.into(), dy.into()), (" ", self.style));
} }
} }
self.inner.render(frame, pos, size).await; self.inner.render(frame).await;
} }
} }

View file

@ -11,5 +11,5 @@ impl Widget for Empty {
Size::ZERO Size::ZERO
} }
async fn render(self: Box<Self>, _frame: &mut Frame, _pos: Pos, _size: Size) {} async fn render(self: Box<Self>, _frame: &mut Frame) {}
} }

View file

@ -289,7 +289,9 @@ impl<Id: Clone + Eq + Send> Widget for List<Id> {
Size::new(width, height as u16) Size::new(width, height as u16)
} }
async fn render(self: Box<Self>, frame: &mut Frame, pos: Pos, size: Size) { async fn render(self: Box<Self>, frame: &mut Frame) {
let size = frame.size();
// Guard acquisition and dropping must be inside its own block or the // Guard acquisition and dropping must be inside its own block or the
// compiler complains that "future created by async block is not // compiler complains that "future created by async block is not
// `Send`", pointing to the function body. // `Send`", pointing to the function body.
@ -310,9 +312,9 @@ impl<Id: Clone + Eq + Send> Widget for List<Id> {
break; break;
} }
let pos = pos + Pos::new(0, dy); frame.push(Pos::new(0, dy), row_size);
match row { match row {
Row::Unselectable { normal } => normal.render(frame, pos, row_size).await, Row::Unselectable { normal } => normal.render(frame).await,
Row::Selectable { Row::Selectable {
id, id,
normal, normal,
@ -325,9 +327,10 @@ impl<Id: Clone + Eq + Send> Widget for List<Id> {
false false
}; };
let widget = if focusing { selected } else { normal }; let widget = if focusing { selected } else { normal };
widget.render(frame, pos, row_size).await; widget.render(frame).await;
} }
} }
frame.pop();
} }
} }
} }

View file

@ -47,13 +47,14 @@ impl Widget for Text {
Size::new(min_width as u16, min_height as u16) Size::new(min_width as u16, min_height as u16)
} }
async fn render(self: Box<Self>, frame: &mut Frame, pos: Pos, size: Size) { async fn render(self: Box<Self>, frame: &mut Frame) {
let size = frame.size();
for (i, line) in self for (i, line) in self
.wrapped(frame, Some(size.width)) .wrapped(frame, Some(size.width))
.into_iter() .into_iter()
.enumerate() .enumerate()
{ {
frame.write(pos + Pos::new(0, i as i32), line); frame.write(Pos::new(0, i as i32), line);
} }
} }
} }