better structure
This commit is contained in:
+3
-4
@@ -1,7 +1,6 @@
|
|||||||
pub mod components;
|
|
||||||
pub mod key;
|
pub mod key;
|
||||||
pub mod macros;
|
pub mod macros;
|
||||||
pub mod style;
|
pub mod ui;
|
||||||
pub mod utils;
|
pub mod utils;
|
||||||
|
|
||||||
use crossterm::{self, ExecutableCommand};
|
use crossterm::{self, ExecutableCommand};
|
||||||
@@ -23,7 +22,7 @@ pub struct Component {
|
|||||||
pub clicked: bool,
|
pub clicked: bool,
|
||||||
pub toggle: bool,
|
pub toggle: bool,
|
||||||
pub binds: HashMap<key::KeyKind, String>,
|
pub binds: HashMap<key::KeyKind, String>,
|
||||||
pub style: style::Style,
|
pub style: ui::Style,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Component {
|
impl Component {
|
||||||
@@ -44,7 +43,7 @@ impl Component {
|
|||||||
clicked: false,
|
clicked: false,
|
||||||
toggle: false,
|
toggle: false,
|
||||||
binds: HashMap::new(),
|
binds: HashMap::new(),
|
||||||
style: style::Style::new(),
|
style: ui::Style::new(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
use osui::{components::*, oml, App, Component};
|
use osui::{oml, ui::*, App, Component};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let mut app = App::new();
|
let mut app = App::new();
|
||||||
|
|||||||
-186
@@ -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<Font>),
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -7,6 +7,193 @@ use crate::{
|
|||||||
Component, UpdateResponse,
|
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<Font>),
|
||||||
|
}
|
||||||
|
|
||||||
|
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 {
|
pub fn div() -> Component {
|
||||||
let mut component = Component::new();
|
let mut component = Component::new();
|
||||||
|
|
||||||
@@ -153,7 +340,7 @@ pub fn tab() -> Component {
|
|||||||
(key::KeyKind::ShiftTab, String::from("previous")),
|
(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 {
|
fn update(this: &mut Component, k: key::Key) -> UpdateResponse {
|
||||||
if let Some(v) = this.binds.get(&k.kind) {
|
if let Some(v) = this.binds.get(&k.kind) {
|
||||||
Reference in New Issue
Block a user