use super::menu::MenuBarMenu;
use crate::gui::effect::{PresetEffect, PresetEffectOptions};
use crate::gui::icon::WindowIcon;
use crate::gui::window::config::WindowConfig;
use std::path::PathBuf;
#[derive(Debug, Clone)]
pub enum MenuBarIcon {
WindowIcon(WindowIcon),
Rgba { data: Vec<u8>, width: u32, height: u32 },
Path(PathBuf),
}
impl Default for MenuBarIcon {
fn default() -> Self {
MenuBarIcon::Rgba { data: [128, 128, 128, 255].repeat(16 * 16), width: 16, height: 16 }
}
}
#[derive(Debug, Clone, Default)]
#[allow(clippy::large_enum_variant)]
pub enum MenuBarClickAction {
ShowMenu(MenuBarMenu),
ToggleWindow { config: WindowConfig, effect: Option<(PresetEffect, PresetEffectOptions)> },
#[default]
None,
}
#[derive(Debug, Clone)]
pub struct MenuBarItem {
pub id: String,
pub name: String,
pub icon: MenuBarIcon,
pub tooltip: Option<String>,
pub click_action: MenuBarClickAction,
}
impl MenuBarItem {
pub fn builder(name: impl Into<String>) -> MenuBarItemBuilder {
MenuBarItemBuilder::new(name)
}
}
pub struct MenuBarItemBuilder {
name: String,
id: Option<String>,
icon: Option<MenuBarIcon>,
tooltip: Option<String>,
click_action: MenuBarClickAction,
}
impl MenuBarItemBuilder {
pub fn new(name: impl Into<String>) -> Self {
Self {
name: name.into(),
id: None,
icon: None,
tooltip: None,
click_action: MenuBarClickAction::None,
}
}
pub fn id(mut self, id: impl Into<String>) -> Self {
self.id = Some(id.into());
self
}
pub fn icon(mut self, icon: MenuBarIcon) -> Self {
self.icon = Some(icon);
self
}
pub fn icon_path(mut self, path: impl Into<PathBuf>) -> Self {
self.icon = Some(MenuBarIcon::Path(path.into()));
self
}
pub fn icon_rgba(mut self, data: Vec<u8>, width: u32, height: u32) -> Self {
self.icon = Some(MenuBarIcon::Rgba { data, width, height });
self
}
pub fn tooltip(mut self, tooltip: impl Into<String>) -> Self {
self.tooltip = Some(tooltip.into());
self
}
pub fn menu(mut self, menu: MenuBarMenu) -> Self {
self.click_action = MenuBarClickAction::ShowMenu(menu);
self
}
pub fn toggle_window(
mut self,
config: WindowConfig,
effect: Option<(PresetEffect, PresetEffectOptions)>,
) -> Self {
self.click_action = MenuBarClickAction::ToggleWindow { config, effect };
self
}
pub fn build(self) -> MenuBarItem {
let id = self.id.unwrap_or_else(|| {
use std::time::{SystemTime, UNIX_EPOCH};
let duration = SystemTime::now().duration_since(UNIX_EPOCH).unwrap_or_default();
format!("menu_bar_{}_{}", self.name, duration.as_nanos())
});
MenuBarItem {
id,
name: self.name,
icon: self.icon.unwrap_or_default(),
tooltip: self.tooltip,
click_action: self.click_action,
}
}
}