use std::{collections::hash_map::DefaultHasher, hash::Hasher};
use super::MenuId;
#[derive(Debug, Clone)]
pub struct Menu<I: MenuId> {
pub title: String,
pub items: Vec<MenuItem<I>>,
}
impl<I: MenuId> Menu<I> {
pub fn new<T: Into<String>>(title: T, items: Vec<MenuItem<I>>) -> Self {
Self {
title: title.into(),
items,
}
}
}
#[derive(Debug, Clone)]
pub struct CustomMenuItem<I: MenuId> {
pub id: I,
pub name: String,
}
impl<I: MenuId> CustomMenuItem<I> {
pub fn new<T: Into<String>>(id: I, title: T) -> Self {
let title = title.into();
Self { id, name: title }
}
#[doc(hidden)]
pub fn id_value(&self) -> u32 {
let mut s = DefaultHasher::new();
self.id.hash(&mut s);
s.finish() as u32
}
}
#[derive(Debug, Clone)]
#[non_exhaustive]
pub enum SystemTrayMenuItem<I: MenuId> {
Custom(CustomMenuItem<I>),
Separator,
}
#[derive(Debug, Clone)]
#[non_exhaustive]
pub enum MenuItem<I: MenuId> {
Custom(CustomMenuItem<I>),
About(String),
Hide,
Services,
HideOthers,
ShowAll,
CloseWindow,
Quit,
Copy,
Cut,
Undo,
Redo,
SelectAll,
Paste,
EnterFullScreen,
Minimize,
Zoom,
Separator,
}