From 9aed0a3cee731a42c4f847ab05fe403450d458d8 Mon Sep 17 00:00:00 2001 From: Joscha Date: Wed, 13 Jul 2022 11:34:31 +0200 Subject: [PATCH] Use frame stack instead of explicit pos and size parameters --- Cargo.lock | 2 +- Cargo.toml | 2 +- src/ui/room.rs | 4 +++- src/ui/rooms.rs | 2 +- src/ui/widgets.rs | 2 +- src/ui/widgets/background.rs | 7 ++++--- src/ui/widgets/empty.rs | 2 +- src/ui/widgets/list.rs | 11 +++++++---- src/ui/widgets/text.rs | 5 +++-- 9 files changed, 22 insertions(+), 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 60f308e..fe10969 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1246,7 +1246,7 @@ dependencies = [ [[package]] name = "toss" 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 = [ "crossterm", "unicode-linebreak", diff --git a/Cargo.toml b/Cargo.toml index afcd508..c2fdf49 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,4 +30,4 @@ features = ["rustls-tls-native-roots"] [dependencies.toss] git = "https://github.com/Garmelon/toss.git" -rev = "e4e1454e8064269350ff7f10b2dcbb388d26c57d" +rev = "14aedaf25212cd50924566821ad37645a4cacf28" diff --git a/src/ui/room.rs b/src/ui/room.rs index af2bb8b..b345ae8 100644 --- a/src/ui/room.rs +++ b/src/ui/room.rs @@ -262,7 +262,9 @@ impl EuphRoom { let mut list = self.nick_list.list(); 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) { diff --git a/src/ui/rooms.rs b/src/ui/rooms.rs index 8cc5b26..331e0b9 100644 --- a/src/ui/rooms.rs +++ b/src/ui/rooms.rs @@ -152,7 +152,7 @@ impl Rooms { let rooms = self.stabilize_rooms().await; let mut list = self.list.list().focus(true); 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( diff --git a/src/ui/widgets.rs b/src/ui/widgets.rs index 7b406f2..0b08e13 100644 --- a/src/ui/widgets.rs +++ b/src/ui/widgets.rs @@ -10,5 +10,5 @@ use toss::frame::{Frame, Pos, Size}; pub trait Widget { fn size(&self, frame: &mut Frame, max_width: Option, max_height: Option) -> Size; - async fn render(self: Box, frame: &mut Frame, pos: Pos, size: Size); + async fn render(self: Box, frame: &mut Frame); } diff --git a/src/ui/widgets/background.rs b/src/ui/widgets/background.rs index 5f59b53..dad8fd6 100644 --- a/src/ui/widgets/background.rs +++ b/src/ui/widgets/background.rs @@ -24,13 +24,14 @@ impl Widget for Background { self.inner.size(frame, max_width, max_height) } - async fn render(self: Box, frame: &mut Frame, pos: Pos, size: Size) { + async fn render(self: Box, frame: &mut Frame) { + let size = frame.size(); for dy in 0..size.height { 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; } } diff --git a/src/ui/widgets/empty.rs b/src/ui/widgets/empty.rs index 2ef28d9..9aaf97e 100644 --- a/src/ui/widgets/empty.rs +++ b/src/ui/widgets/empty.rs @@ -11,5 +11,5 @@ impl Widget for Empty { Size::ZERO } - async fn render(self: Box, _frame: &mut Frame, _pos: Pos, _size: Size) {} + async fn render(self: Box, _frame: &mut Frame) {} } diff --git a/src/ui/widgets/list.rs b/src/ui/widgets/list.rs index 44d10d7..ab32a7a 100644 --- a/src/ui/widgets/list.rs +++ b/src/ui/widgets/list.rs @@ -289,7 +289,9 @@ impl Widget for List { Size::new(width, height as u16) } - async fn render(self: Box, frame: &mut Frame, pos: Pos, size: Size) { + async fn render(self: Box, frame: &mut Frame) { + let size = frame.size(); + // Guard acquisition and dropping must be inside its own block or the // compiler complains that "future created by async block is not // `Send`", pointing to the function body. @@ -310,9 +312,9 @@ impl Widget for List { break; } - let pos = pos + Pos::new(0, dy); + frame.push(Pos::new(0, dy), row_size); match row { - Row::Unselectable { normal } => normal.render(frame, pos, row_size).await, + Row::Unselectable { normal } => normal.render(frame).await, Row::Selectable { id, normal, @@ -325,9 +327,10 @@ impl Widget for List { false }; let widget = if focusing { selected } else { normal }; - widget.render(frame, pos, row_size).await; + widget.render(frame).await; } } + frame.pop(); } } } diff --git a/src/ui/widgets/text.rs b/src/ui/widgets/text.rs index 33bf50a..275102b 100644 --- a/src/ui/widgets/text.rs +++ b/src/ui/widgets/text.rs @@ -47,13 +47,14 @@ impl Widget for Text { Size::new(min_width as u16, min_height as u16) } - async fn render(self: Box, frame: &mut Frame, pos: Pos, size: Size) { + async fn render(self: Box, frame: &mut Frame) { + let size = frame.size(); for (i, line) in self .wrapped(frame, Some(size.width)) .into_iter() .enumerate() { - frame.write(pos + Pos::new(0, i as i32), line); + frame.write(Pos::new(0, i as i32), line); } } }