use crate::{
color::{BasicColor, Color, Color2},
coord::Coord,
error::ServicesOff,
event::{Event, Key, KeyEvent},
screen::Screen,
string::TermString,
style::Style,
terminal::Terminal,
};
#[derive(Debug, Clone)]
pub struct InfoDialog {
pub title: TermString,
pub message: TermString,
pub style: Style,
pub title_colors: Color2,
pub selected_colors: Color2,
pub title_y: Coord,
pub bg: Color,
}
impl InfoDialog {
pub fn new(title: TermString, message: TermString) -> Self {
Self {
title,
message,
style: Style::default()
.align(1, 2)
.colors(Color2::default())
.top_margin(4)
.bottom_margin(2),
title_colors: Color2::default(),
selected_colors: !Color2::default(),
title_y: 1,
bg: BasicColor::Black.into(),
}
}
pub async fn run(&self, term: &mut Terminal) -> Result<(), ServicesOff> {
self.render(term.lock_now().await?.screen());
loop {
let mut session = term.listen().await?;
match session.event() {
Some(Event::Key(KeyEvent {
main_key: Key::Enter,
ctrl: false,
alt: false,
shift: false,
}))
| Some(Event::Key(KeyEvent {
main_key: Key::Esc,
ctrl: false,
alt: false,
shift: false,
})) if session.screen().valid_size() => break Ok(()),
Some(Event::Resize(evt)) => {
if evt.size.is_some() {
self.render(session.screen());
}
},
_ => (),
}
}
}
fn render(&self, screen: &mut Screen) {
screen.clear(self.bg);
self.render_title(screen);
let pos = self.render_message(screen);
self.render_ok(screen, pos);
}
fn render_title(&self, screen: &mut Screen) {
let style = Style::default()
.align(1, 2)
.colors(self.title_colors)
.top_margin(self.title_y);
screen.styled_text(&self.title, style);
}
fn render_message(&self, screen: &mut Screen) -> Coord {
screen.styled_text(&self.message, self.style)
}
fn render_ok(&self, screen: &mut Screen, pos: Coord) {
let ok_string = tstring!["> OK <"];
let style = Style::default()
.align(1, 2)
.colors(self.selected_colors)
.top_margin(pos + 2);
screen.styled_text(&ok_string, style);
}
}