mirror of https://github.com/fdehau/tui-rs
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
145 lines
3.6 KiB
Rust
145 lines
3.6 KiB
Rust
use bitflags::bitflags;
|
|
|
|
#[derive(Debug, Clone, Copy, PartialEq)]
|
|
pub enum Color {
|
|
Reset,
|
|
Black,
|
|
Red,
|
|
Green,
|
|
Yellow,
|
|
Blue,
|
|
Magenta,
|
|
Cyan,
|
|
Gray,
|
|
DarkGray,
|
|
LightRed,
|
|
LightGreen,
|
|
LightYellow,
|
|
LightBlue,
|
|
LightMagenta,
|
|
LightCyan,
|
|
White,
|
|
Rgb(u8, u8, u8),
|
|
Indexed(u8),
|
|
}
|
|
|
|
impl Color {
|
|
/// Returns a short code associated with the color, used for debug purpose
|
|
/// only
|
|
pub(crate) fn code(self) -> &'static str {
|
|
match self {
|
|
Color::Reset => "X",
|
|
Color::Black => "b",
|
|
Color::Red => "r",
|
|
Color::Green => "c",
|
|
Color::Yellow => "y",
|
|
Color::Blue => "b",
|
|
Color::Magenta => "m",
|
|
Color::Cyan => "c",
|
|
Color::Gray => "w",
|
|
Color::DarkGray => "B",
|
|
Color::LightRed => "R",
|
|
Color::LightGreen => "G",
|
|
Color::LightYellow => "Y",
|
|
Color::LightBlue => "B",
|
|
Color::LightMagenta => "M",
|
|
Color::LightCyan => "C",
|
|
Color::White => "W",
|
|
Color::Indexed(_) => "i",
|
|
Color::Rgb(_, _, _) => "o",
|
|
}
|
|
}
|
|
}
|
|
|
|
bitflags! {
|
|
pub struct Modifier: u16 {
|
|
const BOLD = 0b0000_0000_0001;
|
|
const DIM = 0b0000_0000_0010;
|
|
const ITALIC = 0b0000_0000_0100;
|
|
const UNDERLINED = 0b0000_0000_1000;
|
|
const SLOW_BLINK = 0b0000_0001_0000;
|
|
const RAPID_BLINK = 0b0000_0010_0000;
|
|
const REVERSED = 0b0000_0100_0000;
|
|
const HIDDEN = 0b0000_1000_0000;
|
|
const CROSSED_OUT = 0b0001_0000_0000;
|
|
}
|
|
}
|
|
|
|
impl Modifier {
|
|
/// Returns a short code associated with the color, used for debug purpose
|
|
/// only
|
|
pub(crate) fn code(self) -> String {
|
|
use std::fmt::Write;
|
|
|
|
let mut result = String::new();
|
|
|
|
if self.contains(Modifier::BOLD) {
|
|
write!(result, "BO").unwrap();
|
|
}
|
|
if self.contains(Modifier::DIM) {
|
|
write!(result, "DI").unwrap();
|
|
}
|
|
if self.contains(Modifier::ITALIC) {
|
|
write!(result, "IT").unwrap();
|
|
}
|
|
if self.contains(Modifier::UNDERLINED) {
|
|
write!(result, "UN").unwrap();
|
|
}
|
|
if self.contains(Modifier::SLOW_BLINK) {
|
|
write!(result, "SL").unwrap();
|
|
}
|
|
if self.contains(Modifier::RAPID_BLINK) {
|
|
write!(result, "RA").unwrap();
|
|
}
|
|
if self.contains(Modifier::REVERSED) {
|
|
write!(result, "RE").unwrap();
|
|
}
|
|
if self.contains(Modifier::HIDDEN) {
|
|
write!(result, "HI").unwrap();
|
|
}
|
|
if self.contains(Modifier::CROSSED_OUT) {
|
|
write!(result, "CR").unwrap();
|
|
}
|
|
|
|
result
|
|
}
|
|
}
|
|
|
|
#[derive(Debug, Clone, Copy, PartialEq)]
|
|
pub struct Style {
|
|
pub fg: Color,
|
|
pub bg: Color,
|
|
pub modifier: Modifier,
|
|
}
|
|
|
|
impl Default for Style {
|
|
fn default() -> Style {
|
|
Style {
|
|
fg: Color::Reset,
|
|
bg: Color::Reset,
|
|
modifier: Modifier::empty(),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl Style {
|
|
pub fn reset(&mut self) {
|
|
self.fg = Color::Reset;
|
|
self.bg = Color::Reset;
|
|
self.modifier = Modifier::empty();
|
|
}
|
|
|
|
pub fn fg(mut self, color: Color) -> Style {
|
|
self.fg = color;
|
|
self
|
|
}
|
|
pub fn bg(mut self, color: Color) -> Style {
|
|
self.bg = color;
|
|
self
|
|
}
|
|
pub fn modifier(mut self, modifier: Modifier) -> Style {
|
|
self.modifier = modifier;
|
|
self
|
|
}
|
|
}
|