use ratatui::{
layout::Rect,
style::{Color, Modifier, Style},
text::Span,
widgets::{Block, BorderType, Borders, Scrollbar, ScrollbarOrientation, ScrollbarState},
Frame,
};
use super::get_border_style;
use crate::tui::state::EntryFilter;
use crate::tui::themes::Theme;
pub fn panel_block<'a>(
title: &'a str,
is_active: bool,
filter: &EntryFilter,
theme: &Theme,
) -> Block<'a> {
Block::default()
.borders(Borders::ALL)
.title(Span::styled(title, if is_active { Style::default().fg(theme.foreground) } else { Style::default() }))
.border_type(if is_active { BorderType::Double } else { BorderType::Plain })
.border_style(if is_active { get_border_style(filter, theme) } else { Style::default() })
}
pub fn render_scrollbar(
frame: &mut Frame,
area: Rect,
total_lines: usize,
visible_lines: usize,
scroll_offset: usize,
color: Color,
) {
if total_lines <= visible_lines {
return;
}
let scrollbar = Scrollbar::new(ScrollbarOrientation::VerticalRight)
.style(Style::default().fg(color))
.begin_symbol(Some("↑"))
.end_symbol(Some("↓"));
let mut state = ScrollbarState::new(total_lines.saturating_sub(visible_lines)).position(scroll_offset);
frame.render_stateful_widget(scrollbar, area, &mut state);
}
pub fn active_style(
is_active: bool,
use_bold: bool,
) -> Style {
match (is_active, use_bold) {
(true, true) => Style::default().add_modifier(Modifier::BOLD),
(true, false) => Style::default(),
(false, true) => Style::default().add_modifier(Modifier::BOLD | Modifier::DIM),
(false, false) => Style::default().add_modifier(Modifier::DIM),
}
}