fyodor/ui/
fullscreen_popup.rs

1use std::io;
2
3use crossterm::event::{read, Event, KeyCode, KeyEvent, KeyEventKind};
4
5use crate::{
6    canvas::{CanvasLike, CanvasLikeExt},
7    drawable::Drawable,
8    layout::{
9        align::Align,
10        sized::{KnownHeight, KnownWidth},
11        Pos,
12    },
13    renderer::Renderer,
14};
15
16use super::{popup::Popup, Window};
17
18pub struct FullScreenPopup(pub Popup);
19
20impl FullScreenPopup {
21    pub fn new(popup: Popup) -> Self {
22        Self(popup)
23    }
24}
25
26impl Window for FullScreenPopup {
27    type Output<'a> = KeyCode;
28
29    fn run(&mut self, renderer: &mut Renderer) -> io::Result<Self::Output<'_>> {
30        loop {
31            renderer
32                .get_render_space()
33                .show((Align::Center, Align::Center), self);
34            renderer.render()?;
35
36            let event = read()?;
37            if let Event::Key(KeyEvent { code, kind, .. }) = event {
38                if kind != KeyEventKind::Release {
39                    break Ok(code);
40                }
41            }
42
43            renderer.on_event(&event)?;
44        }
45    }
46}
47
48impl Drawable for FullScreenPopup {
49    type X = Align;
50    type Y = Align;
51
52    fn draw(&self, pos: impl Into<Pos<Align, Align>>, canvas: &mut impl CanvasLike) {
53        <&Popup as Drawable>::draw(&&self.0, pos, canvas);
54    }
55}
56
57impl KnownWidth for FullScreenPopup {
58    fn w(&self) -> i32 {
59        self.0.w()
60    }
61}
62
63impl KnownHeight for FullScreenPopup {
64    fn h(&self) -> i32 {
65        self.0.h()
66    }
67}