use crate::{
graphics::{Character, SpecialChar, Surface, TextFormat},
system::{Handle, MenuTheme, RuntimeManager},
utils::Caption,
utils::ExtractHotKeyMethod
};
use super::Menu;
use super::{menu_item::MenuItem, MenuItemWrapper};
pub struct SubMenu {
pub(super) enabled: bool,
pub(super) caption: Caption,
pub(super) submenu_handle: Handle<Menu>,
pub(super) menu_handle: Handle<Menu>,
pub(super) handle: Handle<SubMenu>,
}
impl SubMenu {
pub fn new(name:&str, menu: Menu) -> Self {
let handle = RuntimeManager::get().get_menus().add(menu);
SubMenu {
enabled: true,
caption: Caption::new(name, ExtractHotKeyMethod::Key),
submenu_handle: handle,
handle: Handle::None,
menu_handle: Handle::None,
}
}
#[inline(always)]
pub fn set_caption(&mut self, text: &str) {
self.caption.set_text(text, ExtractHotKeyMethod::Key);
}
#[inline(always)]
pub fn caption(&self) -> &str {
self.caption.text()
}
#[inline(always)]
pub fn is_enabled(&self) -> bool {
self.enabled
}
#[inline(always)]
pub fn set_enabled(&mut self, value: bool) {
self.enabled = value;
}
pub(super) fn paint(&self, surface: &mut Surface, format: &mut TextFormat, width: u16, current_item: bool, color: &MenuTheme) {
super::utils::update_format_with_caption(&self.caption, format, self.enabled, current_item, color);
if current_item && self.enabled {
surface.fill_horizontal_line_with_size(1, format.y, width as u32, Character::with_attributes(' ', color.text.hovered));
}
format.x = 2;
surface.write_text(self.caption.text(), format);
surface.write_char(
width as i32,
format.y,
Character::with_attributes(SpecialChar::TriangleRight, format.char_attr),
);
}
}
impl MenuItem for SubMenu {
fn into_menuitem(self) -> MenuItemWrapper {
MenuItemWrapper::SubMenu(self)
}
fn update_handles(&mut self, parent: Handle<crate::prelude::Menu>, me: Handle<()>) {
self.menu_handle = parent;
self.handle = me.cast();
if let Some(menu) = RuntimeManager::get().get_menu(self.submenu_handle) {
menu.parent_handle = parent;
}
}
}