use std::sync::Arc;
use crate::{CommandId, WhenExpr};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum MenuRole {
App,
File,
Edit,
View,
Window,
Help,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum SystemMenuType {
Services,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum MenuItemToggleKind {
Checkbox,
Radio,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct MenuItemToggle {
pub kind: MenuItemToggleKind,
pub checked: bool,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct MenuBar {
pub menus: Vec<Menu>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Menu {
pub title: Arc<str>,
pub role: Option<MenuRole>,
pub mnemonic: Option<char>,
pub items: Vec<MenuItem>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum MenuItem {
Command {
command: CommandId,
when: Option<WhenExpr>,
toggle: Option<MenuItemToggle>,
},
Label {
title: Arc<str>,
},
Separator,
Submenu {
title: Arc<str>,
when: Option<WhenExpr>,
items: Vec<MenuItem>,
},
SystemMenu {
title: Arc<str>,
menu_type: SystemMenuType,
},
}
impl MenuBar {
pub fn empty() -> Self {
Self { menus: Vec::new() }
}
}