use std::fmt::Debug;
use iced::{
Alignment::Center,
Element, Length, Padding,
widget::{container, space, text},
};
use snora_core::{LayoutDirection, Menu, MenuAction};
use crate::direction::row_dir;
use crate::style::chrome_container_style;
use crate::menu::render_menu;
pub fn app_header<'a, Message, MenuId, MenuItemId, F>(
title: &'a str,
menus: Vec<Menu<MenuId, MenuItemId>>,
on_menu_action: &'a F,
active_menu_id: Option<&MenuId>,
end_controls: Option<Element<'a, Message>>,
direction: LayoutDirection,
) -> Element<'a, Message>
where
Message: Clone + 'a,
MenuId: Clone + Debug + PartialEq + 'a,
MenuItemId: Clone + Debug + 'a,
F: Fn(MenuAction<MenuId, MenuItemId>) -> Message + 'a,
{
let mut start_group = iced::widget::row![
text(title)
.font(iced::Font {
weight: iced::font::Weight::Bold,
..Default::default()
})
.size(16),
container(space()).width(Length::Fixed(20.0)),
]
.align_y(Center)
.spacing(12);
for menu in menus {
let is_active = active_menu_id == Some(&menu.id);
start_group = start_group.push(render_menu(menu, on_menu_action, is_active));
}
let filler = container(space()).width(Length::Fill);
let end_side: Element<'_, Message> = match end_controls {
Some(ctrls) => iced::widget::row![filler, ctrls]
.align_y(Center)
.spacing(12)
.into(),
None => filler.into(),
};
let header_row = row_dir(direction, start_group, end_side).align_y(Center);
container(header_row)
.width(Length::Fill)
.padding(Padding::from([8.0, 16.0]))
.style(chrome_container_style)
.into()
}