62 lines
1.6 KiB
Rust
62 lines
1.6 KiB
Rust
use crate::ui::styles::ManagarrStyle;
|
|
use crate::ui::utils::{borderless_block, layout_block, style_block_highlight};
|
|
use ratatui::buffer::Buffer;
|
|
use ratatui::layout::{Alignment, Constraint, Layout, Rect};
|
|
use ratatui::prelude::Text;
|
|
use ratatui::style::Stylize;
|
|
use ratatui::widgets::{Paragraph, Widget};
|
|
|
|
pub struct Checkbox<'a> {
|
|
label: &'a str,
|
|
is_checked: bool,
|
|
is_highlighted: bool,
|
|
}
|
|
|
|
impl<'a> Checkbox<'a> {
|
|
pub fn new(label: &'a str) -> Checkbox<'a> {
|
|
Checkbox {
|
|
label,
|
|
is_checked: false,
|
|
is_highlighted: false,
|
|
}
|
|
}
|
|
|
|
pub fn checked(mut self, is_checked: bool) -> Checkbox<'a> {
|
|
self.is_checked = is_checked;
|
|
self
|
|
}
|
|
|
|
pub fn highlighted(mut self, is_selected: bool) -> Checkbox<'a> {
|
|
self.is_highlighted = is_selected;
|
|
self
|
|
}
|
|
|
|
fn render_checkbox(&self, area: Rect, buf: &mut Buffer) {
|
|
let check = if self.is_checked { "✔" } else { "" };
|
|
let [label_area, checkbox_area] =
|
|
Layout::horizontal([Constraint::Percentage(48), Constraint::Percentage(48)]).areas(area);
|
|
let checkbox_box_area = Rect {
|
|
width: 5,
|
|
..checkbox_area
|
|
};
|
|
|
|
Paragraph::new(Text::from(format!("\n{}: ", self.label)))
|
|
.block(borderless_block())
|
|
.alignment(Alignment::Right)
|
|
.primary()
|
|
.render(label_area, buf);
|
|
|
|
Paragraph::new(Text::from(check))
|
|
.block(layout_block())
|
|
.alignment(Alignment::Center)
|
|
.style(style_block_highlight(self.is_highlighted).bold())
|
|
.render(checkbox_box_area, buf);
|
|
}
|
|
}
|
|
|
|
impl<'a> Widget for Checkbox<'a> {
|
|
fn render(self, area: Rect, buf: &mut Buffer) {
|
|
self.render_checkbox(area, buf);
|
|
}
|
|
}
|