aboutsummaryrefslogtreecommitdiffstats
path: root/src/bin/ttyplay/display.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/bin/ttyplay/display.rs')
-rw-r--r--src/bin/ttyplay/display.rs161
1 files changed, 105 insertions, 56 deletions
diff --git a/src/bin/ttyplay/display.rs b/src/bin/ttyplay/display.rs
index 3ae84e9..c1871cd 100644
--- a/src/bin/ttyplay/display.rs
+++ b/src/bin/ttyplay/display.rs
@@ -1,26 +1,34 @@
use textmode::Textmode as _;
pub struct Display {
+ screen: vt100::Screen,
current_frame: usize,
total_frames: usize,
done_loading: bool,
paused: bool,
show_ui: bool,
show_help: bool,
+ active_search: Option<String>,
}
impl Display {
pub fn new() -> Self {
Self {
+ screen: vt100::Parser::default().screen().clone(),
current_frame: 0,
total_frames: 0,
done_loading: false,
paused: false,
show_ui: true,
show_help: false,
+ active_search: None,
}
}
+ pub fn screen(&mut self, screen: vt100::Screen) {
+ self.screen = screen;
+ }
+
pub fn current_frame(&mut self, idx: usize) {
self.current_frame = idx;
}
@@ -45,75 +53,116 @@ impl Display {
self.show_help = !self.show_help;
}
+ pub fn active_search(&mut self, s: String) {
+ self.active_search = Some(s);
+ }
+
+ pub fn clear_search(&mut self) {
+ self.active_search = None;
+ }
+
pub async fn render(
&self,
- screen: &vt100::Screen,
output: &mut textmode::Output,
) -> anyhow::Result<()> {
- output.clear();
- output.move_to(0, 0);
- output.write(&screen.contents_formatted());
- if self.paused && self.show_ui {
- let pos = output.screen().cursor_position();
+ let pos = output.screen().cursor_position();
- output.move_to(0, 0);
- output.reset_attributes();
- output.set_fgcolor(textmode::color::BLACK);
- if self.done_loading {
- output.set_bgcolor(textmode::color::CYAN);
- } else {
- output.set_bgcolor(textmode::color::RED);
- }
- output.write_str(&format!(
- " {}/{} ",
- self.current_frame + 1,
- self.total_frames
- ));
+ self.render_screen(output);
- let size = output.screen().size();
- output.move_to(0, size.1 - 1);
- output.reset_attributes();
- output.set_fgcolor(textmode::color::BLACK);
- output.set_bgcolor(textmode::color::RED);
- output.write_str("\u{23f8}");
+ if self.paused && self.show_ui {
+ self.render_frame_count(output);
+ self.render_pause_symbol(output);
if self.show_help {
- output.reset_attributes();
- output.set_fgcolor(textmode::color::BLACK);
- output.set_bgcolor(textmode::color::CYAN);
-
- output.move_to(size.0 - 12, size.1 - 23);
- output.write_str(" keys ");
- output.move_to(size.0 - 11, size.1 - 23);
- output.write_str(" q: quit ");
- output.move_to(size.0 - 10, size.1 - 23);
- output.write_str(" space: pause/unpause ");
- output.move_to(size.0 - 9, size.1 - 23);
- output.write_str(" tab: hide/show ui ");
- output.move_to(size.0 - 8, size.1 - 23);
- output.write_str(" h/p: previous frame ");
- output.move_to(size.0 - 7, size.1 - 23);
- output.write_str(" l/n: next frame ");
- output.move_to(size.0 - 6, size.1 - 23);
- output.write_str(" g/0: first frame ");
- output.move_to(size.0 - 5, size.1 - 23);
- output.write_str(" G/$: last frame ");
- output.move_to(size.0 - 4, size.1 - 23);
- output.write_str(" +: increase speed ");
- output.move_to(size.0 - 3, size.1 - 23);
- output.write_str(" -: decrease speed ");
- output.move_to(size.0 - 2, size.1 - 23);
- output.write_str(" =: normal speed ");
- output.move_to(size.0 - 1, size.1 - 23);
- output.write_str(" ?: hide/show help ");
+ self.render_help(output);
}
-
- output.reset_attributes();
- output.move_to(pos.0, pos.1);
}
+ self.render_search(output);
+
+ output.reset_attributes();
+ output.move_to(pos.0, pos.1);
output.refresh().await?;
Ok(())
}
+
+ fn render_screen(&self, output: &mut textmode::Output) {
+ output.clear();
+ output.move_to(0, 0);
+ output.write(&self.screen.contents_formatted());
+ }
+
+ fn render_frame_count(&self, output: &mut textmode::Output) {
+ output.move_to(0, 0);
+ output.reset_attributes();
+ output.set_fgcolor(textmode::color::BLACK);
+ if self.done_loading {
+ output.set_bgcolor(textmode::color::CYAN);
+ } else {
+ output.set_bgcolor(textmode::color::RED);
+ }
+ output.write_str(&format!(
+ " {}/{} ",
+ self.current_frame + 1,
+ self.total_frames
+ ));
+ }
+
+ #[allow(clippy::unused_self)]
+ fn render_pause_symbol(&self, output: &mut textmode::Output) {
+ let size = output.screen().size();
+ output.move_to(0, size.1 - 1);
+ output.reset_attributes();
+ output.set_fgcolor(textmode::color::BLACK);
+ output.set_bgcolor(textmode::color::RED);
+ output.write_str("\u{23f8}");
+ }
+
+ #[allow(clippy::unused_self)]
+ fn render_help(&self, output: &mut textmode::Output) {
+ let size = output.screen().size();
+ output.reset_attributes();
+ output.set_fgcolor(textmode::color::BLACK);
+ output.set_bgcolor(textmode::color::CYAN);
+
+ output.move_to(size.0 - 13, size.1 - 23);
+ output.write_str(" keys ");
+ output.move_to(size.0 - 12, size.1 - 23);
+ output.write_str(" q: quit ");
+ output.move_to(size.0 - 11, size.1 - 23);
+ output.write_str(" space: pause/unpause ");
+ output.move_to(size.0 - 10, size.1 - 23);
+ output.write_str(" tab: hide/show ui ");
+ output.move_to(size.0 - 9, size.1 - 23);
+ output.write_str(" h/p: previous frame ");
+ output.move_to(size.0 - 8, size.1 - 23);
+ output.write_str(" l/n: next frame ");
+ output.move_to(size.0 - 7, size.1 - 23);
+ output.write_str(" g/0: first frame ");
+ output.move_to(size.0 - 6, size.1 - 23);
+ output.write_str(" G/$: last frame ");
+ output.move_to(size.0 - 5, size.1 - 23);
+ output.write_str(" +: increase speed ");
+ output.move_to(size.0 - 4, size.1 - 23);
+ output.write_str(" -: decrease speed ");
+ output.move_to(size.0 - 3, size.1 - 23);
+ output.write_str(" =: normal speed ");
+ output.move_to(size.0 - 2, size.1 - 23);
+ output.write_str(" ?: hide/show help ");
+ }
+
+ fn render_search(&self, output: &mut textmode::Output) {
+ if let Some(search) = &self.active_search {
+ let size = output.screen().size();
+ output.reset_attributes();
+ output.set_fgcolor(textmode::color::BLACK);
+ output.set_bgcolor(textmode::color::CYAN);
+
+ output.move_to(size.0 - 1, 0);
+ output.write_str("/");
+ output.write_str(search);
+ output.write_str(&" ".repeat(size.1 as usize - search.len() - 1));
+ }
+ }
}