use crate::menus::{Menu, MenuItem, MenuTheme};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct MenuBar {
pub menus: Vec<Menu>,
pub opened_menu: Option<usize>,
pub theme: MenuTheme,
}
impl Default for MenuBar {
fn default() -> Self {
Self::new()
}
}
impl MenuBar {
pub fn new() -> Self {
Self {
menus: Vec::new(),
opened_menu: None,
theme: MenuTheme::default(),
}
}
pub fn from_menus<I, S>(menus: I) -> Self
where
I: IntoIterator<Item = (S, Option<char>, Vec<MenuItem>)>,
S: Into<String>,
{
let menus = menus
.into_iter()
.map(|(title, hotkey, items)| Menu::with_items(title, hotkey, items))
.collect();
Self {
menus,
opened_menu: None,
theme: MenuTheme::default(),
}
}
pub fn with_menus(menus: Vec<Menu>) -> Self {
Self {
menus,
opened_menu: None,
theme: MenuTheme::default(),
}
}
pub fn add_menu(&mut self, menu: Menu) -> &mut Self {
self.menus.push(menu);
self
}
pub fn set_theme(&mut self, theme: MenuTheme) -> &mut Self {
self.theme = theme;
self
}
pub fn theme(mut self, theme: MenuTheme) -> Self {
self.theme = theme;
self
}
pub fn get_theme(&self) -> &MenuTheme {
&self.theme
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn theme_switching_works() {
let mut menu_bar = MenuBar::new();
assert_eq!(menu_bar.get_theme(), &MenuTheme::classic());
menu_bar.set_theme(MenuTheme::dark());
assert_eq!(menu_bar.get_theme(), &MenuTheme::dark());
menu_bar.set_theme(MenuTheme::light());
assert_eq!(menu_bar.get_theme(), &MenuTheme::light());
menu_bar.set_theme(MenuTheme::terminal());
assert_eq!(menu_bar.get_theme(), &MenuTheme::terminal());
}
#[test]
fn theme_builder_pattern_works() {
let menu_bar = MenuBar::new().theme(MenuTheme::dark());
assert_eq!(menu_bar.get_theme(), &MenuTheme::dark());
}
#[test]
fn theme_switching_affects_rendering() {
use ratatui_core::{buffer::Buffer, layout::Rect, widgets::Widget};
let mut menu_bar = MenuBar::new();
let area = Rect::new(0, 0, 20, 1);
let mut buffer1 = Buffer::empty(area);
Widget::render(&menu_bar, area, &mut buffer1);
let classic_bg = buffer1[(0, 0)].bg;
menu_bar.set_theme(MenuTheme::dark());
let mut buffer2 = Buffer::empty(area);
Widget::render(&menu_bar, area, &mut buffer2);
let dark_bg = buffer2[(0, 0)].bg;
assert_ne!(classic_bg, dark_bg);
}
}