use color_eyre::Result;
use crossterm::event::{self, Event, KeyCode};
use ratatui::{
layout::{Alignment, Constraint, Layout, Rect},
style::{Color, Modifier, Style, Stylize},
text::{Line, Span},
widgets::{Block, Padding, Paragraph},
DefaultTerminal, Frame,
};
use tui_checkbox::{symbols, Checkbox};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
enum ViewMode {
Interactive,
ApiShowcase,
}
struct App {
checkboxes: Vec<bool>,
selected: usize,
mode: ViewMode,
}
impl Default for App {
fn default() -> Self {
Self {
checkboxes: vec![
true, true, false, false, true, false, true, true, false, true, false, ],
selected: 0,
mode: ViewMode::Interactive,
}
}
}
fn main() -> Result<()> {
color_eyre::install()?;
let mut app = App::default();
let terminal = ratatui::init();
let result = run(terminal, &mut app);
ratatui::restore();
result
}
fn run(mut terminal: DefaultTerminal, app: &mut App) -> Result<()> {
loop {
terminal.draw(|frame| render(frame, app))?;
if let Event::Key(key) = event::read()? {
match key.code {
KeyCode::Char('q') | KeyCode::Esc => break,
KeyCode::Tab => {
app.mode = match app.mode {
ViewMode::Interactive => ViewMode::ApiShowcase,
ViewMode::ApiShowcase => ViewMode::Interactive,
};
}
KeyCode::Up | KeyCode::Char('k') => {
if app.mode == ViewMode::Interactive && app.selected > 0 {
app.selected -= 1;
}
}
KeyCode::Down | KeyCode::Char('j') => {
if app.mode == ViewMode::Interactive && app.selected < app.checkboxes.len() - 1
{
app.selected += 1;
}
}
KeyCode::Char(' ') | KeyCode::Enter => {
if app.mode == ViewMode::Interactive {
app.checkboxes[app.selected] = !app.checkboxes[app.selected];
}
}
_ => {}
}
}
}
Ok(())
}
fn render(frame: &mut Frame, app: &App) {
match app.mode {
ViewMode::Interactive => render_interactive(frame, app),
ViewMode::ApiShowcase => render_api_showcase(frame, app),
}
}
fn render_interactive(frame: &mut Frame, app: &App) {
let main_layout = Layout::vertical([
Constraint::Length(3), Constraint::Min(0), Constraint::Length(3), ])
.split(frame.area());
render_header(frame, main_layout[0], app);
let content_layout = Layout::vertical([
Constraint::Length(7), Constraint::Length(8), Constraint::Length(8), Constraint::Length(9), ])
.spacing(1)
.split(main_layout[1]);
render_basic_section(frame, content_layout[0], app);
render_styled_section(frame, content_layout[1], app);
render_emoji_section(frame, content_layout[2], app);
render_custom_section(frame, content_layout[3], app);
render_footer(frame, main_layout[2], app);
}
fn render_api_showcase(frame: &mut Frame, app: &App) {
let layout = Layout::vertical([
Constraint::Length(3), Constraint::Length(3), Constraint::Length(3), Constraint::Length(3), Constraint::Length(3), Constraint::Length(3), Constraint::Length(3), Constraint::Length(3), Constraint::Length(3), ])
.split(frame.area());
render_header(frame, layout[0], app);
render_showcase_core_api(frame, layout[1]);
render_showcase_styling_api(frame, layout[2]);
render_showcase_symbol_customization(frame, layout[3]);
render_showcase_predefined_unicode(frame, layout[4]);
render_showcase_predefined_ascii(frame, layout[5]);
render_showcase_predefined_special(frame, layout[6]);
render_showcase_advanced_usage(frame, layout[7]);
render_footer(frame, layout[8], app);
}
fn render_header(frame: &mut Frame, area: Rect, app: &App) {
let block = Block::bordered()
.title(match app.mode {
ViewMode::Interactive => " tui-checkbox Demo - Interactive Mode ",
ViewMode::ApiShowcase => " tui-checkbox Demo - API Showcase ",
})
.title_alignment(Alignment::Center)
.border_style(Style::default().fg(Color::Cyan))
.padding(Padding::horizontal(1));
let text = Paragraph::new("A customizable checkbox widget for Ratatui")
.alignment(Alignment::Center)
.style(Style::default().fg(Color::Gray));
frame.render_widget(text.block(block), area);
}
fn render_footer(frame: &mut Frame, area: Rect, app: &App) {
let block = Block::bordered()
.border_style(Style::default().fg(Color::DarkGray))
.padding(Padding::horizontal(1));
let text = match app.mode {
ViewMode::Interactive => Line::from(vec![
Span::styled("↑/↓", Style::default().fg(Color::Cyan).bold()),
Span::raw(" Navigate "),
Span::styled("Space", Style::default().fg(Color::Cyan).bold()),
Span::raw(" Toggle "),
Span::styled("Tab", Style::default().fg(Color::Cyan).bold()),
Span::raw(" API Showcase "),
Span::styled("q", Style::default().fg(Color::Cyan).bold()),
Span::raw(" Quit"),
]),
ViewMode::ApiShowcase => Line::from(vec![
Span::styled("Tab", Style::default().fg(Color::Cyan).bold()),
Span::raw(" Back to Interactive "),
Span::styled("q", Style::default().fg(Color::Cyan).bold()),
Span::raw(" Quit"),
]),
};
let paragraph = Paragraph::new(text).alignment(Alignment::Center);
frame.render_widget(paragraph.block(block), area);
}
fn render_basic_section(frame: &mut Frame, area: Rect, app: &App) {
let block = Block::bordered()
.title(" Basic Checkbox ")
.title_alignment(Alignment::Left)
.border_style(Style::default().fg(Color::Blue));
let inner = block.inner(area);
frame.render_widget(block, area);
let checkbox_area = Layout::vertical([
Constraint::Length(1),
Constraint::Length(3),
Constraint::Length(1),
])
.split(inner)[1];
let is_selected = app.selected == 0;
let checkbox = Checkbox::new("Enable notifications", app.checkboxes[0]).style(if is_selected {
Style::default().bg(Color::DarkGray)
} else {
Style::default()
});
frame.render_widget(checkbox, checkbox_area);
}
fn render_styled_section(frame: &mut Frame, area: Rect, app: &App) {
let block = Block::bordered()
.title(" Styled Checkboxes ")
.title_alignment(Alignment::Left)
.border_style(Style::default().fg(Color::Blue));
let inner = block.inner(area);
frame.render_widget(block, area);
let items_layout = Layout::vertical([
Constraint::Length(1),
Constraint::Length(1),
Constraint::Length(1),
])
.spacing(1)
.split(inner);
let is_selected = app.selected == 1;
let checkbox = Checkbox::new("Info state", app.checkboxes[1])
.checkbox_style(Style::default().fg(Color::Blue))
.label_style(Style::default().fg(Color::Blue))
.style(if is_selected {
Style::default().bg(Color::DarkGray)
} else {
Style::default()
});
frame.render_widget(checkbox, items_layout[0]);
let is_selected = app.selected == 2;
let checkbox = Checkbox::new("Warning state", app.checkboxes[2])
.checkbox_style(Style::default().fg(Color::Yellow))
.label_style(Style::default().fg(Color::Yellow))
.style(if is_selected {
Style::default().bg(Color::DarkGray)
} else {
Style::default()
});
frame.render_widget(checkbox, items_layout[1]);
let is_selected = app.selected == 3;
let checkbox = Checkbox::new("Error state", app.checkboxes[3])
.checkbox_style(Style::default().fg(Color::Red).add_modifier(Modifier::BOLD))
.label_style(Style::default().fg(Color::Red))
.style(if is_selected {
Style::default().bg(Color::DarkGray)
} else {
Style::default()
});
frame.render_widget(checkbox, items_layout[2]);
}
fn render_emoji_section(frame: &mut Frame, area: Rect, app: &App) {
let block = Block::bordered()
.title(" Emoji & Unicode Symbols ")
.title_alignment(Alignment::Left)
.border_style(Style::default().fg(Color::Blue));
let inner = block.inner(area);
frame.render_widget(block, area);
let items_layout = Layout::vertical([
Constraint::Length(1),
Constraint::Length(1),
Constraint::Length(1),
])
.spacing(1)
.split(inner);
let is_selected = app.selected == 4;
let checkbox = Checkbox::new("Check mark style", app.checkboxes[4])
.checked_symbol("✅ ")
.unchecked_symbol("⬜ ")
.style(if is_selected {
Style::default().bg(Color::DarkGray)
} else {
Style::default()
});
frame.render_widget(checkbox, items_layout[0]);
let is_selected = app.selected == 5;
let checkbox = Checkbox::new("Circle style", app.checkboxes[5])
.checked_symbol("● ")
.unchecked_symbol("○ ")
.style(if is_selected {
Style::default().bg(Color::DarkGray)
} else {
Style::default()
});
frame.render_widget(checkbox, items_layout[1]);
let is_selected = app.selected == 6;
let checkbox = Checkbox::new("Diamond style", app.checkboxes[6])
.checked_symbol("◆ ")
.unchecked_symbol("◇ ")
.style(if is_selected {
Style::default().bg(Color::DarkGray)
} else {
Style::default()
});
frame.render_widget(checkbox, items_layout[2]);
}
fn render_custom_section(frame: &mut Frame, area: Rect, app: &App) {
let block = Block::bordered()
.title(" Custom ASCII Symbols ")
.title_alignment(Alignment::Left)
.border_style(Style::default().fg(Color::Blue));
let inner = block.inner(area);
frame.render_widget(block, area);
let items_layout = Layout::vertical([
Constraint::Length(1),
Constraint::Length(1),
Constraint::Length(1),
Constraint::Length(1),
])
.spacing(1)
.split(inner);
let is_selected = app.selected == 7;
let checkbox = Checkbox::new("ASCII style", app.checkboxes[7])
.checked_symbol(symbols::CHECKED_X)
.unchecked_symbol(symbols::UNCHECKED_SPACE)
.style(if is_selected {
Style::default().bg(Color::DarkGray)
} else {
Style::default()
});
frame.render_widget(checkbox, items_layout[0]);
let is_selected = app.selected == 8;
let checkbox = Checkbox::new("Asterisk", app.checkboxes[8])
.checked_symbol(symbols::CHECKED_ASTERISK)
.unchecked_symbol(symbols::UNCHECKED_SPACE)
.style(if is_selected {
Style::default().bg(Color::DarkGray)
} else {
Style::default()
});
frame.render_widget(checkbox, items_layout[1]);
let is_selected = app.selected == 9;
let label = if app.checkboxes[9] {
"Plus sign"
} else {
"Minus sign"
};
let checkbox = Checkbox::new(label, app.checkboxes[9])
.checked_symbol(symbols::CHECKED_PLUS)
.unchecked_symbol(symbols::UNCHECKED_MINUS)
.style(if is_selected {
Style::default().bg(Color::DarkGray)
} else {
Style::default()
});
frame.render_widget(checkbox, items_layout[2]);
let is_selected = app.selected == 10;
let checkbox = Checkbox::new("X/O style", app.checkboxes[10])
.checked_symbol(symbols::CHECKED_PARENTHESIS_X)
.unchecked_symbol(symbols::UNCHECKED_PARENTHESIS_O)
.style(if is_selected {
Style::default().bg(Color::DarkGray)
} else {
Style::default()
});
frame.render_widget(checkbox, items_layout[3]);
}
fn render_showcase_core_api(frame: &mut Frame, area: Rect) {
let block = Block::bordered().title(" Core API: new(), default(), label(), checked() ");
let inner = block.inner(area);
frame.render_widget(block, area);
let layout = Layout::horizontal([
Constraint::Percentage(20),
Constraint::Percentage(20),
Constraint::Percentage(20),
Constraint::Percentage(20),
Constraint::Percentage(20),
])
.split(inner);
let checkbox = Checkbox::new("new()", true);
frame.render_widget(checkbox, layout[0]);
let checkbox = Checkbox::default().label("default()");
frame.render_widget(checkbox, layout[1]);
let checkbox = Checkbox::default().label("label()").checked(true);
frame.render_widget(checkbox, layout[2]);
let checkbox = Checkbox::new("checked()", false).checked(true);
frame.render_widget(checkbox, layout[3]);
let checkbox = Checkbox::new("unchecked()", true).checked(false);
frame.render_widget(checkbox, layout[4]);
}
fn render_showcase_styling_api(frame: &mut Frame, area: Rect) {
let block = Block::bordered().title(" Styling: style(), checkbox_style(), label_style() ");
let inner = block.inner(area);
frame.render_widget(block, area);
let layout = Layout::horizontal([
Constraint::Percentage(33),
Constraint::Percentage(34),
Constraint::Percentage(33),
])
.split(inner);
let checkbox = Checkbox::new("style()", true)
.style(Style::default().fg(Color::Yellow).bg(Color::DarkGray));
frame.render_widget(checkbox, layout[0]);
let checkbox = Checkbox::new("checkbox_style()", true).checkbox_style(
Style::default()
.fg(Color::Green)
.add_modifier(Modifier::BOLD),
);
frame.render_widget(checkbox, layout[1]);
let checkbox = Checkbox::new("label_style()", false).label_style(
Style::default()
.fg(Color::Magenta)
.add_modifier(Modifier::ITALIC),
);
frame.render_widget(checkbox, layout[2]);
}
fn render_showcase_symbol_customization(frame: &mut Frame, area: Rect) {
let block =
Block::bordered().title(" Symbol Customization: checked_symbol(), unchecked_symbol() ");
let inner = block.inner(area);
frame.render_widget(block, area);
let layout = Layout::horizontal([
Constraint::Percentage(33),
Constraint::Percentage(34),
Constraint::Percentage(33),
])
.split(inner);
let checkbox = Checkbox::new("Custom checked", true).checked_symbol("✓ ");
frame.render_widget(checkbox, layout[0]);
let checkbox = Checkbox::new("Custom unchecked", false).unchecked_symbol("✗ ");
frame.render_widget(checkbox, layout[1]);
let checkbox = Checkbox::new("Both custom", true)
.checked_symbol("✅ ")
.unchecked_symbol("⬜ ");
frame.render_widget(checkbox, layout[2]);
}
fn render_showcase_predefined_unicode(frame: &mut Frame, area: Rect) {
let block = Block::bordered().title(" Predefined Symbols: CHECKED (☑) / UNCHECKED (☐) ");
let inner = block.inner(area);
frame.render_widget(block, area);
let layout =
Layout::horizontal([Constraint::Percentage(50), Constraint::Percentage(50)]).split(inner);
let checkbox = Checkbox::new("symbols::CHECKED", true)
.checked_symbol(symbols::CHECKED)
.unchecked_symbol(symbols::UNCHECKED);
frame.render_widget(checkbox, layout[0]);
let checkbox = Checkbox::new("symbols::UNCHECKED", false)
.checked_symbol(symbols::CHECKED)
.unchecked_symbol(symbols::UNCHECKED);
frame.render_widget(checkbox, layout[1]);
}
fn render_showcase_predefined_ascii(frame: &mut Frame, area: Rect) {
let block = Block::bordered()
.title(" Predefined ASCII: CHECKED_X [X] / UNCHECKED_SPACE [ ] / CHECKED_ASTERISK [*] ");
let inner = block.inner(area);
frame.render_widget(block, area);
let layout = Layout::horizontal([
Constraint::Percentage(33),
Constraint::Percentage(34),
Constraint::Percentage(33),
])
.split(inner);
let checkbox = Checkbox::new("CHECKED_X", true)
.checked_symbol(symbols::CHECKED_X)
.unchecked_symbol(symbols::UNCHECKED_SPACE);
frame.render_widget(checkbox, layout[0]);
let checkbox = Checkbox::new("UNCHECKED_SPACE", false)
.checked_symbol(symbols::CHECKED_X)
.unchecked_symbol(symbols::UNCHECKED_SPACE);
frame.render_widget(checkbox, layout[1]);
let checkbox = Checkbox::new("CHECKED_ASTERISK", true)
.checked_symbol(symbols::CHECKED_ASTERISK)
.unchecked_symbol(symbols::UNCHECKED_SPACE);
frame.render_widget(checkbox, layout[2]);
}
fn render_showcase_predefined_special(frame: &mut Frame, area: Rect) {
let block =
Block::bordered().title(" Special Symbols: PLUS [+] / MINUS [-] / PARENTHESIS (X)/(O) ");
let inner = block.inner(area);
frame.render_widget(block, area);
let layout = Layout::horizontal([
Constraint::Percentage(33),
Constraint::Percentage(34),
Constraint::Percentage(33),
])
.split(inner);
let checkbox = Checkbox::new("CHECKED_PLUS", true)
.checked_symbol(symbols::CHECKED_PLUS)
.unchecked_symbol(symbols::UNCHECKED_MINUS);
frame.render_widget(checkbox, layout[0]);
let checkbox = Checkbox::new("UNCHECKED_MINUS", false)
.checked_symbol(symbols::CHECKED_PLUS)
.unchecked_symbol(symbols::UNCHECKED_MINUS);
frame.render_widget(checkbox, layout[1]);
let checkbox = Checkbox::new("PARENTHESIS_X", true)
.checked_symbol(symbols::CHECKED_PARENTHESIS_X)
.unchecked_symbol(symbols::UNCHECKED_PARENTHESIS_O);
frame.render_widget(checkbox, layout[2]);
}
fn render_showcase_advanced_usage(frame: &mut Frame, area: Rect) {
let block = Block::bordered().title(" Advanced: block(), Styled trait, method chaining ");
let inner = block.inner(area);
frame.render_widget(block, area);
let layout = Layout::horizontal([
Constraint::Percentage(33),
Constraint::Percentage(34),
Constraint::Percentage(33),
])
.split(inner);
let checkbox = Checkbox::new("With Block", true).block(
Block::bordered()
.title("Inner")
.border_style(Style::default().fg(Color::Cyan)),
);
frame.render_widget(checkbox, layout[0]);
let checkbox = Checkbox::new("Styled trait", false).cyan().bold();
frame.render_widget(checkbox, layout[1]);
let checkbox = Checkbox::default()
.label("Chained")
.checked(true)
.style(Color::White)
.checkbox_style(Style::default().fg(Color::Green))
.label_style(Style::default().fg(Color::Gray));
frame.render_widget(checkbox, layout[2]);
}
#[allow(dead_code)]
fn example_new() {
use tui_checkbox::Checkbox;
let _checkbox = Checkbox::new("Enable feature", true);
let _checkbox = Checkbox::new("Enable feature".blue(), false);
}
#[allow(dead_code)]
fn example_default() {
use tui_checkbox::Checkbox;
let _checkbox = Checkbox::default();
}
#[allow(dead_code)]
fn example_label() {
use tui_checkbox::Checkbox;
let _checkbox = Checkbox::default().label("My checkbox");
let _checkbox = Checkbox::default().label("My checkbox".cyan());
}
#[allow(dead_code)]
fn example_checked() {
use tui_checkbox::Checkbox;
let _checkbox = Checkbox::default().checked(true);
let _checkbox = Checkbox::default().checked(false);
}
#[allow(dead_code)]
fn example_block() {
use ratatui::widgets::Block;
use tui_checkbox::Checkbox;
let _checkbox = Checkbox::new("Option", false).block(Block::bordered().title("Settings"));
let _checkbox = Checkbox::new("Option", true).block(
Block::bordered()
.title("Configuration")
.border_style(Style::default().fg(Color::Cyan)),
);
}
#[allow(dead_code)]
fn example_style() {
use ratatui::style::{Color, Style};
use tui_checkbox::Checkbox;
let _checkbox =
Checkbox::new("Option", false).style(Style::default().fg(Color::White).bg(Color::DarkGray));
let _checkbox = Checkbox::new("Option", true).style(Color::Green);
}
#[allow(dead_code)]
fn example_checkbox_style() {
use ratatui::style::{Color, Modifier, Style};
use tui_checkbox::Checkbox;
let _checkbox = Checkbox::new("Option", true).checkbox_style(Style::default().fg(Color::Green));
let _checkbox = Checkbox::new("Option", false)
.checkbox_style(Style::default().fg(Color::Red).add_modifier(Modifier::BOLD));
}
#[allow(dead_code)]
fn example_label_style() {
use ratatui::style::{Color, Modifier, Style};
use tui_checkbox::Checkbox;
let _checkbox = Checkbox::new("Option", false).label_style(Style::default().fg(Color::Gray));
let _checkbox = Checkbox::new("Option", true).label_style(
Style::default()
.fg(Color::Blue)
.add_modifier(Modifier::ITALIC),
);
}
#[allow(dead_code)]
fn example_checked_symbol() {
use tui_checkbox::Checkbox;
let _checkbox = Checkbox::new("Option", true).checked_symbol("[X]");
let _checkbox = Checkbox::new("Option", true).checked_symbol("✅ ");
let _checkbox = Checkbox::new("Option", true).checked_symbol("● ");
}
#[allow(dead_code)]
fn example_unchecked_symbol() {
use tui_checkbox::Checkbox;
let _checkbox = Checkbox::new("Option", false).unchecked_symbol("[ ]");
let _checkbox = Checkbox::new("Option", false).unchecked_symbol("⬜ ");
let _checkbox = Checkbox::new("Option", false).unchecked_symbol("○ ");
}
#[allow(dead_code)]
fn example_symbols_checked_unchecked() {
use tui_checkbox::{symbols, Checkbox};
let _checkbox = Checkbox::new("Option", true)
.checked_symbol(symbols::CHECKED)
.unchecked_symbol(symbols::UNCHECKED);
}
#[allow(dead_code)]
fn example_symbols_x_space() {
use tui_checkbox::{symbols, Checkbox};
let _checkbox = Checkbox::new("ASCII style", false)
.checked_symbol(symbols::CHECKED_X)
.unchecked_symbol(symbols::UNCHECKED_SPACE);
}
#[allow(dead_code)]
fn example_symbols_asterisk() {
use tui_checkbox::{symbols, Checkbox};
let _checkbox = Checkbox::new("Important", true)
.checked_symbol(symbols::CHECKED_ASTERISK)
.unchecked_symbol(symbols::UNCHECKED_SPACE);
}
#[allow(dead_code)]
fn example_symbols_plus_minus() {
use tui_checkbox::{symbols, Checkbox};
let _checkbox = Checkbox::new("Toggle option", true)
.checked_symbol(symbols::CHECKED_PLUS)
.unchecked_symbol(symbols::UNCHECKED_MINUS);
}
#[allow(dead_code)]
fn example_symbols_parenthesis() {
use tui_checkbox::{symbols, Checkbox};
let _checkbox = Checkbox::new("X or O", false)
.checked_symbol(symbols::CHECKED_PARENTHESIS_X)
.unchecked_symbol(symbols::UNCHECKED_PARENTHESIS_O);
}
#[allow(dead_code)]
fn example_combined_styling() {
use ratatui::style::{Color, Modifier, Style};
use ratatui::widgets::Block;
use tui_checkbox::{symbols, Checkbox};
let _checkbox = Checkbox::new("Complete example", true)
.block(Block::bordered().title("Settings"))
.style(Style::default().bg(Color::Black))
.checkbox_style(
Style::default()
.fg(Color::Green)
.add_modifier(Modifier::BOLD),
)
.label_style(
Style::default()
.fg(Color::White)
.add_modifier(Modifier::ITALIC),
)
.checked_symbol(symbols::CHECKED_X)
.unchecked_symbol(symbols::UNCHECKED_SPACE);
}
#[allow(dead_code)]
fn example_styled_trait() {
use ratatui::style::{Color, Modifier, Style, Styled, Stylize};
use tui_checkbox::Checkbox;
let _checkbox = Checkbox::new("Stylized", true).cyan().bold();
let _checkbox = Checkbox::new("Styled", false).set_style(
Style::default()
.fg(Color::Magenta)
.add_modifier(Modifier::UNDERLINED),
);
}
#[allow(dead_code)]
fn example_render_widget() {
use ratatui::{layout::Rect, Frame};
use tui_checkbox::Checkbox;
fn render_example(frame: &mut Frame, area: Rect) {
let checkbox = Checkbox::new("Render me", true);
frame.render_widget(checkbox, area);
}
fn render_example_ref(frame: &mut Frame, area: Rect) {
let checkbox = Checkbox::new("Render me", true);
frame.render_widget(&checkbox, area);
}
}
#[allow(dead_code)]
fn example_method_chaining() {
use ratatui::style::{Color, Style};
use ratatui::widgets::Block;
use tui_checkbox::{symbols, Checkbox};
let _checkbox = Checkbox::default()
.label("Chained configuration")
.checked(true)
.style(Color::White)
.checkbox_style(Style::default().fg(Color::Green))
.label_style(Style::default().fg(Color::Gray))
.checked_symbol(symbols::CHECKED_X)
.unchecked_symbol(symbols::UNCHECKED_SPACE)
.block(Block::bordered().title("Options"));
}
#[allow(dead_code)]
fn example_dynamic_state() {
use tui_checkbox::Checkbox;
let mut is_checked = false;
is_checked = !is_checked;
let _checkbox = Checkbox::new("Dynamic state", is_checked);
let _checkbox = Checkbox::new("Toggle me", false).checked(is_checked);
}
#[allow(dead_code)]
fn example_contextual_symbols() {
use tui_checkbox::{symbols, Checkbox};
let _checkbox = Checkbox::new("Unicode", true)
.checked_symbol(symbols::CHECKED)
.unchecked_symbol(symbols::UNCHECKED);
let _checkbox = Checkbox::new("ASCII", true)
.checked_symbol(symbols::CHECKED_X)
.unchecked_symbol(symbols::UNCHECKED_SPACE);
let _checkbox = Checkbox::new("Important", true)
.checked_symbol(symbols::CHECKED_ASTERISK)
.unchecked_symbol(symbols::UNCHECKED_SPACE);
let _checkbox = Checkbox::new("Logic", true)
.checked_symbol(symbols::CHECKED_PLUS)
.unchecked_symbol(symbols::UNCHECKED_MINUS);
}
#[allow(dead_code)]
fn example_emoji_symbols() {
use tui_checkbox::Checkbox;
let _checkbox = Checkbox::new("Task complete", true)
.checked_symbol("✅ ")
.unchecked_symbol("⬜ ");
let _checkbox = Checkbox::new("Favorite", true)
.checked_symbol("⭐ ")
.unchecked_symbol("☆ ");
let _checkbox = Checkbox::new("Like", false)
.checked_symbol("❤️ ")
.unchecked_symbol("🤍 ");
let _checkbox = Checkbox::new("Approve", true)
.checked_symbol("👍 ")
.unchecked_symbol("👎 ");
}
#[allow(dead_code)]
fn example_checkbox_list() {
use ratatui::style::{Color, Style};
use tui_checkbox::Checkbox;
struct TodoItem {
label: String,
completed: bool,
}
let todos = [
TodoItem {
label: "Buy groceries".to_string(),
completed: true,
},
TodoItem {
label: "Write code".to_string(),
completed: false,
},
TodoItem {
label: "Exercise".to_string(),
completed: false,
},
];
let _checkboxes: Vec<Checkbox> = todos
.iter()
.map(|todo| {
Checkbox::new(todo.label.as_str(), todo.completed).checkbox_style(if todo.completed {
Style::default().fg(Color::Green)
} else {
Style::default().fg(Color::Gray)
})
})
.collect();
}