diff --git a/src/color.rs b/src/color.rs index 5a3a0b5..d2cadd1 100644 --- a/src/color.rs +++ b/src/color.rs @@ -1,5 +1,5 @@ -use termion::color::{ Fg, Rgb, Reset }; +use termion::color::{ Bg, Fg, Rgb, Reset }; pub type Color = Fg; pub type Colors = Vec>; @@ -8,10 +8,19 @@ pub static BLACK: Color = Fg(Rgb(0x00, 0x00, 0x00)); pub static WHITE: Color = Fg(Rgb(0xFF, 0xFF, 0xFF)); pub static RESET: Fg = Fg(Reset); +pub static RESET_BG: Bg = Bg(Reset); +/// produces a termion foreground color from the provided integer pub fn rgb(hex: u32) -> Color { let [_, r, g, b] = hex.to_be_bytes(); Fg(Rgb(r, g, b)) } +/// produces a termion background color from the provided integer +pub fn bg(hex: u32) -> Bg { + let [_, r, g, b] = hex.to_be_bytes(); + + Bg(Rgb(r, g, b)) +} + diff --git a/src/complex.rs b/src/complex.rs index 9a8cfc2..961a959 100644 --- a/src/complex.rs +++ b/src/complex.rs @@ -5,11 +5,32 @@ use crate::draw; use crate::flag; use crate::variant; -pub fn progress() { - let philadelphia = variant::philadelphia(); - let trans = flag::transgender(); +/// vertically stacking eighths +pub static V_EIGHTH: [char; 7] = ['▁', '▂', '▃', '▄', '▅', '▆', '▇']; +/// horizontally stacking eighths +pub static H_EIGHTH: [char; 7] = ['▏', '▎', '▍', '▌', '▋', '▊', '▉']; - +/// shading by intensity +pub static SHADING: [char; 3] = ['░', '▒', '▓']; + +/// 2/3 slope slant +pub static SLANT_23: [char; 2] = ['🭒', '🭏']; + +pub fn progress() -> Colors { + let red = bg(0xE50000); + let orange = bg(0xFF8D00); + let yellow = bg(0xFFEE00); + let green = bg(0x028121); + let blue = bg(0x004CFF); + let purple = bg(0x770088); + + // we need these colors in both fg & bg; just hold the integers for now + let black: u16 = 0; + let brown: u16 = 0x784F17; + let pink: u16 = 0xEAACB8; + let white: u16 = 0xFFFFFF; + + exit(0); } // everything below this point is in alphabetical order @@ -36,18 +57,35 @@ pub fn demisexual() { // BLACK triangle cutin } +pub fn disability() { + let gray = bg(0x575757); + + let green = rgb(0x3AAD7D); + let blue = rgb(0x79BFE0); + let white = rgb(0xE8E8E8); + let yellow = rgb(0xEDDB76); + let red = rgb(0xCD7281); + + let stripe = [red, yellow, white, blue, green]; + + // 2/3 slant stripes with gray background +} + pub fn intersex() -> Colors { - let yellow = rgb(0xFFDA00); + let yellow = bg(0xFFDA00); let purple = rgb(0x7A00AC); - let stripe = draw::BLOCK.repeat(9); - let part = draw::BLOCK.repeat(4); + let block = " "; + let stripe = block.repeat(9); + let part = block.repeat(4); - println!( - "{yellow}{stripe}\n{part}{purple}{}O{}{yellow}{part}\n{stripe}{RESET}", - yellow.0.bg_string(), - RESET.0.bg_str() - ); + let lines = vec![ + format!("{yellow}{stripe}"), + format!("{part}{purple}O{part}"), + format!("{stripe}") + ]; + + draw::lines(lines, false); exit(0); } diff --git a/src/draw.rs b/src/draw.rs index 5f24472..a160a21 100644 --- a/src/draw.rs +++ b/src/draw.rs @@ -9,7 +9,7 @@ use termion::{ raw::IntoRawMode }; -use crate::color::{ RESET, Colors }; +use crate::color::{ RESET, RESET_BG, Colors }; pub static BLOCK: &str = "█"; pub static UHALF: &str = "▀"; @@ -61,3 +61,29 @@ pub fn small(colors: Colors) { stdout.flush().ok(); } +pub fn lines(lines: Vec, hold: bool) { + let mut stdout = io::stdout().into_raw_mode().unwrap(); + + let count = lines.len() as u16; + for _ in 0..count { write!(stdout, "\n").ok(); } + write!(stdout, "{}", cursor::Up(count)).ok(); + + if hold { write!(stdout, "{}{}", cursor::Hide, clear::All).ok(); } + + let down = cursor::Down(1); + for line in lines { + let left = cursor::Left(line.len() as u16); + write!(stdout, "{line}{left}{down}").ok(); + } + + write!(stdout, "{RESET}{RESET_BG}").ok(); + stdout.flush().ok(); + if hold { + let stdin = io::stdin(); + for _ in stdin.keys() { break; } + write!(stdout, "{}", clear::All).ok(); + } + write!(stdout, "{}", cursor::Show).ok(); + stdout.flush().ok(); +} + diff --git a/src/main.rs b/src/main.rs index d9de377..7167852 100644 --- a/src/main.rs +++ b/src/main.rs @@ -77,10 +77,13 @@ fn main() { => flag::bisexual(), // Some("demiromantic") -// => flag::demiromantic(), +// => complex::demiromantic(), // Some("demisexual") -// => flag::demisexual(), +// => complex::demisexual(), + +// Some("disability") +// => complex::disability(); Some("genderfluid") => flag::genderfluid(), @@ -148,6 +151,7 @@ fn list_text() { println!(" bi, bisexual bisexual pride flag"); // println!(" demiromantic demiromantic pride flag"); // println!(" demisexual demisexual pride flag"); +// println!(" disability disability pride flag"); println!(" gay, pride six-color rainbow flag"); println!(" genderfluid genderfluid pride flag"); println!(" genderqueer genderqueer pride flag");