diff --git a/src/lib.rs b/src/lib.rs index 5c3b2b0..2fe0706 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,7 +1,6 @@ -pub mod components; pub mod key; pub mod macros; -pub mod style; +pub mod ui; pub mod utils; use crossterm::{self, ExecutableCommand}; @@ -23,7 +22,7 @@ pub struct Component { pub clicked: bool, pub toggle: bool, pub binds: HashMap, - pub style: style::Style, + pub style: ui::Style, } impl Component { @@ -44,7 +43,7 @@ impl Component { clicked: false, toggle: false, binds: HashMap::new(), - style: style::Style::new(), + style: ui::Style::new(), } } diff --git a/src/main.rs b/src/main.rs index c25bc94..1314b50 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,4 @@ -use osui::{components::*, oml, App, Component}; +use osui::{oml, ui::*, App, Component}; fn main() { let mut app = App::new(); diff --git a/src/style.rs b/src/style.rs deleted file mode 100644 index bb5a588..0000000 --- a/src/style.rs +++ /dev/null @@ -1,186 +0,0 @@ -#[derive(Debug, Clone, PartialEq)] -pub struct Style { - pub bg: Color, - pub fg: Color, - pub outline: Color, - pub font: Font, - - pub hover_bg: Color, - pub hover_fg: Color, - pub hover_outline: Color, - pub hover_font: Font, - - pub clicked_bg: Color, - pub clicked_fg: Color, - pub clicked_outline: Color, - pub clicked_font: Font, - - pub is_active: bool, -} - -impl Style { - pub fn new() -> Style { - Style { - bg: Color::None, - fg: Color::None, - outline: Color::None, - font: Font::None, - - hover_bg: Color::None, - hover_fg: Color::None, - hover_outline: Color::None, - hover_font: Font::None, - - clicked_bg: Color::None, - clicked_fg: Color::None, - clicked_outline: Color::None, - clicked_font: Font::None, - - is_active: false, - } - } - - pub fn get(&self) -> String { - if self.is_active { - format!( - "{}{}{}", - self.fg.prioritize(&self.hover_fg).ansi(), - self.bg.prioritize(&self.hover_bg).ansi_bg(), - self.font.prioritize(&self.hover_font).ansi() - ) - } else { - format!( - "{}{}{}", - self.fg.ansi(), - self.bg.ansi_bg(), - self.font.ansi() - ) - } - } - - pub fn get_outline(&self) -> String { - if self.is_active { - self.outline.prioritize(&self.hover_outline).ansi() - } else { - self.outline.ansi() - } - } - - pub fn get_clicked(&self) -> String { - format!( - "{}{}{}", - self.fg.prioritize(&self.clicked_fg).ansi(), - self.bg.prioritize(&self.clicked_bg).ansi_bg(), - self.font.prioritize(&self.clicked_font).ansi() - ) - } - - pub fn write(&self, s: &str) -> String { - format!("{}{}\x1b[0m", self.get(), s) - } - - pub fn write_outline(&self, s: &str) -> String { - format!("{}{}\x1b[0m", self.get_outline(), s) - } - - pub fn write_clicked(&self, s: &str) -> String { - format!("{}{}\x1b[0m", self.get_clicked(), s) - } -} - -#[derive(Debug, Clone, PartialEq)] -pub enum Font { - None, - Bold, - Underline, - Italic, - Reverse, - Strike, - Mul(Vec), -} - -impl Font { - pub fn ansi(&self) -> String { - String::from(match self { - Font::None => "", - Font::Bold => "\x1b[1m", - Font::Underline => "\x1b[4m", - Font::Italic => "\x1b[3m", - Font::Reverse => "\x1b[7m", - Font::Strike => "\x1b[9m", - Font::Mul(v) => { - let mut s = String::new(); - for n in v { - s += n.ansi().as_str(); - } - return s; - } - }) - } - - pub fn prioritize<'a>(&'a self, secondary: &'a Font) -> &Font { - if secondary == &Font::None { - self - } else { - secondary - } - } -} - -#[derive(Debug, Clone, PartialEq)] -pub enum Color { - None, - Rgb(u8, u8, u8), - Black, - Red, - Green, - Yellow, - Blue, - Magenta, - Cyan, - White, -} - -impl Color { - pub fn ansi(&self) -> String { - String::from(match self { - Color::None => "", - Self::Rgb(r, g, b) => { - return format!("\x1b[38;2;{r};{g};{b}m"); - } - Color::Black => "\x1b[30m", - Color::Red => "\x1b[31m", - Color::Green => "\x1b[32m", - Color::Yellow => "\x1b[33m", - Color::Blue => "\x1b[34m", - Color::Magenta => "\x1b[35m", - Color::Cyan => "\x1b[36m", - Color::White => "\x1b[37m", - }) - } - - pub fn ansi_bg(&self) -> String { - String::from(match self { - Color::None => "", - Self::Rgb(r, g, b) => { - return format!("\x1b[48;2;{r};{g};{b}m"); - } - Color::Black => "\x1b[40m", - Color::Red => "\x1b[41m", - Color::Green => "\x1b[42m", - Color::Yellow => "\x1b[43m", - Color::Blue => "\x1b[44m", - Color::Magenta => "\x1b[45m", - Color::Cyan => "\x1b[46m", - Color::White => "\x1b[47m", - }) - } - - pub fn prioritize<'a>(&'a self, secondary: &'a Color) -> &Color { - if secondary == &Color::None { - self - } else { - secondary - } - } -} diff --git a/src/components.rs b/src/ui.rs similarity index 57% rename from src/components.rs rename to src/ui.rs index 0aa9185..d188679 100644 --- a/src/components.rs +++ b/src/ui.rs @@ -7,6 +7,193 @@ use crate::{ Component, UpdateResponse, }; +#[derive(Debug, Clone, PartialEq)] +pub struct Style { + pub bg: Color, + pub fg: Color, + pub outline: Color, + pub font: Font, + + pub hover_bg: Color, + pub hover_fg: Color, + pub hover_outline: Color, + pub hover_font: Font, + + pub clicked_bg: Color, + pub clicked_fg: Color, + pub clicked_outline: Color, + pub clicked_font: Font, + + pub is_active: bool, +} + +impl Style { + pub fn new() -> Style { + Style { + bg: Color::None, + fg: Color::None, + outline: Color::None, + font: Font::None, + + hover_bg: Color::None, + hover_fg: Color::None, + hover_outline: Color::None, + hover_font: Font::None, + + clicked_bg: Color::None, + clicked_fg: Color::None, + clicked_outline: Color::None, + clicked_font: Font::None, + + is_active: false, + } + } + + pub fn get(&self) -> String { + if self.is_active { + format!( + "{}{}{}", + self.fg.prioritize(&self.hover_fg).ansi(), + self.bg.prioritize(&self.hover_bg).ansi_bg(), + self.font.prioritize(&self.hover_font).ansi() + ) + } else { + format!( + "{}{}{}", + self.fg.ansi(), + self.bg.ansi_bg(), + self.font.ansi() + ) + } + } + + pub fn get_outline(&self) -> String { + if self.is_active { + self.outline.prioritize(&self.hover_outline).ansi() + } else { + self.outline.ansi() + } + } + + pub fn get_clicked(&self) -> String { + format!( + "{}{}{}", + self.fg.prioritize(&self.clicked_fg).ansi(), + self.bg.prioritize(&self.clicked_bg).ansi_bg(), + self.font.prioritize(&self.clicked_font).ansi() + ) + } + + pub fn write(&self, s: &str) -> String { + format!("{}{}\x1b[0m", self.get(), s) + } + + pub fn write_outline(&self, s: &str) -> String { + format!("{}{}\x1b[0m", self.get_outline(), s) + } + + pub fn write_clicked(&self, s: &str) -> String { + format!("{}{}\x1b[0m", self.get_clicked(), s) + } +} + +#[derive(Debug, Clone, PartialEq)] +pub enum Font { + None, + Bold, + Underline, + Italic, + Reverse, + Strike, + Mul(Vec), +} + +impl Font { + pub fn ansi(&self) -> String { + String::from(match self { + Font::None => "", + Font::Bold => "\x1b[1m", + Font::Underline => "\x1b[4m", + Font::Italic => "\x1b[3m", + Font::Reverse => "\x1b[7m", + Font::Strike => "\x1b[9m", + Font::Mul(v) => { + let mut s = String::new(); + for n in v { + s += n.ansi().as_str(); + } + return s; + } + }) + } + + pub fn prioritize<'a>(&'a self, secondary: &'a Font) -> &Font { + if secondary == &Font::None { + self + } else { + secondary + } + } +} + +#[derive(Debug, Clone, PartialEq)] +pub enum Color { + None, + Rgb(u8, u8, u8), + Black, + Red, + Green, + Yellow, + Blue, + Magenta, + Cyan, + White, +} + +impl Color { + pub fn ansi(&self) -> String { + String::from(match self { + Color::None => "", + Self::Rgb(r, g, b) => { + return format!("\x1b[38;2;{r};{g};{b}m"); + } + Color::Black => "\x1b[30m", + Color::Red => "\x1b[31m", + Color::Green => "\x1b[32m", + Color::Yellow => "\x1b[33m", + Color::Blue => "\x1b[34m", + Color::Magenta => "\x1b[35m", + Color::Cyan => "\x1b[36m", + Color::White => "\x1b[37m", + }) + } + + pub fn ansi_bg(&self) -> String { + String::from(match self { + Color::None => "", + Self::Rgb(r, g, b) => { + return format!("\x1b[48;2;{r};{g};{b}m"); + } + Color::Black => "\x1b[40m", + Color::Red => "\x1b[41m", + Color::Green => "\x1b[42m", + Color::Yellow => "\x1b[43m", + Color::Blue => "\x1b[44m", + Color::Magenta => "\x1b[45m", + Color::Cyan => "\x1b[46m", + Color::White => "\x1b[47m", + }) + } + + pub fn prioritize<'a>(&'a self, secondary: &'a Color) -> &Color { + if secondary == &Color::None { + self + } else { + secondary + } + } +} + pub fn div() -> Component { let mut component = Component::new(); @@ -153,7 +340,7 @@ pub fn tab() -> Component { (key::KeyKind::ShiftTab, String::from("previous")), ]); - component.style.clicked_fg = crate::style::Color::Red; + component.style.clicked_fg = crate::ui::Color::Red; fn update(this: &mut Component, k: key::Key) -> UpdateResponse { if let Some(v) = this.binds.get(&k.kind) {