menu component

This commit is contained in:
2024-10-29 20:10:45 +01:00
parent dd214f95f8
commit 943bcf874a
2 changed files with 100 additions and 3 deletions
+1 -1
View File
@@ -43,7 +43,7 @@ impl Component {
clicked: false, clicked: false,
toggle: false, toggle: false,
binds: HashMap::new(), binds: HashMap::new(),
style: ui::Style::new(), style: ui::Style::default(),
} }
} }
+99 -2
View File
@@ -18,17 +18,26 @@ pub struct Style {
pub hover_fg: Color, pub hover_fg: Color,
pub hover_outline: Color, pub hover_outline: Color,
pub hover_font: Font, pub hover_font: Font,
pub hover_cursor_fg: Color,
pub hover_cursor_bg: Color,
pub clicked_bg: Color, pub clicked_bg: Color,
pub clicked_fg: Color, pub clicked_fg: Color,
pub clicked_outline: Color, pub clicked_outline: Color,
pub clicked_font: Font, pub clicked_font: Font,
pub selected_bg: Color,
pub selected_fg: Color,
pub selected_font: Font,
pub cursor_fg: Color,
pub cursor_bg: Color,
pub is_active: bool, pub is_active: bool,
} }
impl Style { impl Default for Style {
pub fn new() -> Style { fn default() -> Style {
Style { Style {
bg: Color::None, bg: Color::None,
fg: Color::None, fg: Color::None,
@@ -39,16 +48,26 @@ impl Style {
hover_fg: Color::None, hover_fg: Color::None,
hover_outline: Color::None, hover_outline: Color::None,
hover_font: Font::None, hover_font: Font::None,
hover_cursor_fg: Color::None,
hover_cursor_bg: Color::None,
clicked_bg: Color::None, clicked_bg: Color::None,
clicked_fg: Color::None, clicked_fg: Color::None,
clicked_outline: Color::None, clicked_outline: Color::None,
clicked_font: Font::None, clicked_font: Font::None,
selected_bg: Color::None,
selected_fg: Color::None,
selected_font: Font::None,
cursor_fg: Color::None,
cursor_bg: Color::None,
is_active: false, is_active: false,
} }
} }
}
impl Style {
pub fn get(&self) -> String { pub fn get(&self) -> String {
if self.is_active { if self.is_active {
format!( format!(
@@ -84,6 +103,27 @@ impl Style {
) )
} }
pub fn get_selected(&self) -> String {
format!(
"{}{}{}",
self.fg.prioritize(&self.selected_fg).ansi(),
self.bg.prioritize(&self.selected_bg).ansi_bg(),
self.font.prioritize(&self.selected_font).ansi()
)
}
pub fn get_cursor(&self) -> String {
if self.is_active {
format!(
"{}{}",
self.cursor_fg.prioritize(&self.hover_cursor_fg).ansi(),
self.cursor_bg.prioritize(&self.hover_cursor_bg).ansi_bg(),
)
} else {
format!("{}{}", self.cursor_fg.ansi(), self.cursor_bg.ansi_bg())
}
}
pub fn write(&self, s: &str) -> String { pub fn write(&self, s: &str) -> String {
format!("{}{}\x1b[0m", self.get(), s) format!("{}{}\x1b[0m", self.get(), s)
} }
@@ -95,6 +135,14 @@ impl Style {
pub fn write_clicked(&self, s: &str) -> String { pub fn write_clicked(&self, s: &str) -> String {
format!("{}{}\x1b[0m", self.get_clicked(), s) format!("{}{}\x1b[0m", self.get_clicked(), s)
} }
pub fn write_selected(&self, s: &str) -> String {
format!("{}{}\x1b[0m", self.get_selected(), s)
}
pub fn write_cursor(&self, s: &str) -> String {
format!("{}{}\x1b[0m", self.get_cursor(), s)
}
} }
#[derive(Debug, Clone, PartialEq)] #[derive(Debug, Clone, PartialEq)]
@@ -406,3 +454,52 @@ pub fn tab() -> Component {
component.render = render; component.render = render;
component component
} }
pub fn menu() -> Component {
let mut component = Component::new();
component.style.selected_bg = Color::Magenta;
component.style.selected_fg = Color::Black;
component.style.cursor_fg = Color::Magenta;
fn render(this: &mut Component) -> String {
let mut res: Vec<String> = Vec::new();
for (i, item) in this.children.iter_mut().enumerate() {
if i == this.child {
res.push(format!(
"{}{}",
this.style.write_cursor("> "),
this.style.write_selected(&item.expr)
));
} else {
res.push(format!(" {}", &item.expr));
}
}
res.join(&this.style.write("\n"))
}
fn update(this: &mut Component, k: key::Key) -> UpdateResponse {
if k.kind == key::KeyKind::Down {
if this.children.len() > this.child + 1 {
this.child += 1;
} else {
this.child = 0;
}
} else if k.kind == key::KeyKind::Up {
if this.child > 0 {
this.child -= 1;
} else {
this.child = this.children.len() - 1;
}
} else if k.kind == key::KeyKind::Enter {
(this.on_click)(this)
}
UpdateResponse::None
}
component.render = render;
component.update = update;
component
}