use std::rc::Rc;
use teksilo_core::WindowPlacement;
use teksilo_core::widget::{EventContext, Widget};
use teksilo_i18n::tr;
use crate::{MenuItem, MenuList};
pub(crate) fn build_window_menu(
ctx: &mut EventContext,
close_action: Option<Rc<dyn Fn(&mut EventContext)>>,
) -> Option<Box<dyn Widget>> {
let window = ctx.window()?;
let placement = window.placement();
let is_maximized = placement.map(|p| p.is_maximized());
let restore_placement = placement.clone();
let maximize_placement = placement.clone();
let minimize_placement = placement.clone();
let menu = MenuList::new()
.item_when(
MenuItem::new(tr!(window_menu_restore())).on_activate_fn(move |_ctx| {
restore_placement.set(WindowPlacement::Floating);
}),
is_maximized.clone(),
)
.item_when(
MenuItem::new(tr!(window_menu_maximize())).on_activate_fn(move |_ctx| {
maximize_placement.set(WindowPlacement::Maximized);
}),
is_maximized.not(),
)
.item(
MenuItem::new(tr!(window_menu_minimize())).on_activate_fn(move |_ctx| {
minimize_placement.set(WindowPlacement::Minimized);
}),
)
.separator()
.item(MenuItem::new(tr!(window_menu_close())).on_activate_fn(
move |ctx| match &close_action {
Some(action) => action(ctx),
None => ctx.close_window(),
},
));
Some(Box::new(menu))
}