fyodor/ui/
fullscreen_popup.rs1use 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}