89 lines
2.3 KiB
Rust
89 lines
2.3 KiB
Rust
use ratatui::{
|
|
buffer::Buffer,
|
|
layout::{Constraint, Layout, Rect},
|
|
style::{Color, Style},
|
|
widgets::{Block, Widget},
|
|
};
|
|
|
|
/// A switch widget
|
|
///
|
|
/// This widget is used to show visual confirmation of a boolean state
|
|
pub struct Switch {
|
|
/// The state of the switch
|
|
state: bool,
|
|
/// The color of the "on" state (`Green` by default)
|
|
color_on: Color,
|
|
/// The color of the "off" state (`DarkGray` by default)
|
|
color_off: Color,
|
|
/// The color of the switch itself (`White` by default)
|
|
color_switch: Color,
|
|
}
|
|
|
|
impl Switch {
|
|
pub fn with_status(state: bool) -> Self {
|
|
Switch {
|
|
state,
|
|
color_on: Color::Green,
|
|
color_off: Color::DarkGray,
|
|
color_switch: Color::White,
|
|
}
|
|
}
|
|
|
|
pub fn with_color_on(mut self, color: Color) -> Self {
|
|
self.color_on = color;
|
|
self
|
|
}
|
|
|
|
pub fn with_color_off(mut self, color: Color) -> Self {
|
|
self.color_off = color;
|
|
self
|
|
}
|
|
|
|
pub fn with_color_switch(mut self, color: Color) -> Self {
|
|
self.color_switch = color;
|
|
self
|
|
}
|
|
|
|
pub fn get_layout(&self, area: Rect) -> (Rect, Rect) {
|
|
let main = Layout::default()
|
|
.direction(ratatui::layout::Direction::Vertical)
|
|
.constraints([Constraint::Length(2)])
|
|
.split(area);
|
|
|
|
let layout = Layout::default()
|
|
.direction(ratatui::layout::Direction::Horizontal)
|
|
.constraints([Constraint::Length(7), Constraint::Length(7)])
|
|
.split(main[0]);
|
|
|
|
(layout[0], layout[1])
|
|
}
|
|
|
|
fn get_left_color(&self) -> Color {
|
|
if self.state {
|
|
self.color_on
|
|
} else {
|
|
self.color_switch
|
|
}
|
|
}
|
|
|
|
fn get_right_color(&self) -> Color {
|
|
if self.state {
|
|
self.color_switch
|
|
} else {
|
|
self.color_off
|
|
}
|
|
}
|
|
}
|
|
|
|
impl Widget for Switch {
|
|
fn render(self, area: Rect, buf: &mut Buffer) {
|
|
let (left, right) = self.get_layout(area);
|
|
|
|
let left_block = Block::default().style(Style::default().bg(self.get_left_color()));
|
|
let right_block = Block::default().style(Style::default().bg(self.get_right_color()));
|
|
|
|
left_block.render(left, buf);
|
|
right_block.render(right, buf);
|
|
}
|
|
}
|