use {
crate::{
action::Action,
app_context::AppContext,
components::component_traits::{Component, HandleFocus},
event::Event,
},
ratatui::{
layout::{Alignment, Rect},
text::{Line, Span},
widgets::{block::Block, Borders, Paragraph, Wrap},
},
std::sync::Arc,
tokio::sync::mpsc::UnboundedSender,
};
pub struct StatusBar {
app_context: Arc<AppContext>,
name: String,
command_tx: Option<UnboundedSender<Action>>,
focused: bool,
terminal_area: Rect,
last_key: Event,
}
impl StatusBar {
pub fn new(app_context: Arc<AppContext>) -> Self {
let command_tx = None;
let name = "".to_string();
let terminal_area = Rect::default();
let last_key = Event::Unknown;
let focused = false;
StatusBar {
app_context,
command_tx,
name,
terminal_area,
last_key,
focused,
}
}
pub fn with_name(mut self, name: impl AsRef<str>) -> Self {
self.name = name.as_ref().to_string();
self
}
}
impl HandleFocus for StatusBar {
fn focus(&mut self) {
self.focused = true;
}
fn unfocus(&mut self) {
self.focused = false;
}
}
impl Component for StatusBar {
fn register_action_handler(&mut self, tx: UnboundedSender<Action>) -> std::io::Result<()> {
self.command_tx = Some(tx);
Ok(())
}
fn update(&mut self, action: Action) {
match action {
Action::UpdateArea(area) => {
self.terminal_area = area;
}
Action::Key(key, modifiers) => self.last_key = Event::Key(key, modifiers.into()),
_ => {}
}
}
fn draw(&mut self, frame: &mut ratatui::Frame<'_>, area: Rect) -> std::io::Result<()> {
let selected_chat = self
.app_context
.tg_context()
.name_of_open_chat_id()
.unwrap_or_default();
let text = vec![Line::from(vec![
Span::styled(
"Press ",
self.app_context.style_status_bar_message_quit_text(),
),
Span::styled("q ", self.app_context.style_status_bar_message_quit_key()),
Span::styled("or ", self.app_context.style_status_bar_message_quit_text()),
Span::styled(
"ctrl+c ",
self.app_context.style_status_bar_message_quit_key(),
),
Span::styled(
"to quit",
self.app_context.style_status_bar_message_quit_text(),
),
Span::raw(" "),
Span::styled(
"Open chat: ",
self.app_context.style_status_bar_open_chat_text(),
),
Span::styled(
selected_chat,
self.app_context.style_status_bar_open_chat_name(),
),
Span::raw(" "),
Span::styled(
"Key pressed: ",
self.app_context.style_status_bar_press_key_text(),
),
Span::styled(
self.last_key.to_string(),
self.app_context.style_status_bar_press_key_key(),
),
Span::raw(" "),
Span::styled("Size: ", self.app_context.style_status_bar_size_info_text()),
Span::styled(
self.terminal_area.width.to_string(),
self.app_context.style_status_bar_size_info_numbers(),
),
Span::styled(" x ", self.app_context.style_status_bar_size_info_text()),
Span::styled(
self.terminal_area.height.to_string(),
self.app_context.style_status_bar_size_info_numbers(),
),
])];
let paragraph = Paragraph::new(text)
.block(Block::new().title(self.name.as_str()).borders(Borders::ALL))
.style(self.app_context.style_status_bar())
.alignment(Alignment::Center)
.wrap(Wrap { trim: true });
frame.render_widget(paragraph, area);
Ok(())
}
}