use std::{fmt, hash::{Hash, Hasher}};
use ncursesw::menu;
use crate::{NCurseswWinError, gen::NCurseswWindow, menu::{Menu, MenuRequest}};
pub struct PostedMenu<'a> {
menu: &'a Menu,
posted: bool
}
impl<'a> PostedMenu<'a> {
pub(in crate::menu) fn new(menu: &'a Menu, refresh: bool) -> result!(Self) {
menu::post_menu(menu._handle())?;
if refresh {
menu.menu_win()?.refresh()?;
}
Ok(Self { menu, posted: true })
}
pub fn menu_driver(&self, request: MenuRequest) -> result!(Option<MenuRequest>) {
Ok(menu::menu_driver(self.menu._handle(), request)?)
}
pub fn repost(&mut self) -> result!(()) {
menu::post_menu(self.menu._handle())?;
self.posted = true;
Ok(())
}
pub fn unpost(&mut self) -> result!(()) {
menu::unpost_menu(self.menu._handle())?;
self.posted = false;
Ok(())
}
pub fn posted(&self) -> bool {
self.posted
}
pub fn refresh(&self) -> result!(()) {
self.menu.menu_win()?.refresh()
}
pub fn pos_menu_cursor(&self) -> result!(()) {
Ok(menu::pos_menu_cursor(self.menu._handle())?)
}
}
impl<'a> Drop for PostedMenu<'a> {
fn drop(&mut self) {
if self.posted {
if let Err(source) = menu::unpost_menu(self.menu._handle()) {
panic!("{} @ {:?}", source, self)
}
}
}
}
unsafe impl<'a> Send for PostedMenu<'a> { } unsafe impl<'a> Sync for PostedMenu<'a> { }
impl<'a> Hash for PostedMenu<'a> {
fn hash<H: Hasher>(&self, state: &mut H) {
self.menu.hash(state);
}
}
impl <'a>AsRef<PostedMenu<'a>> for PostedMenu<'a> {
fn as_ref(&self) -> &Self {
self
}
}
impl <'a>AsMut<PostedMenu<'a>> for PostedMenu<'a> {
fn as_mut(&mut self) -> &mut Self {
self
}
}
impl<'a> fmt::Debug for PostedMenu<'a> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "PostedMenu {{ menu: {:?}, posted: {} }}", self.menu, self.posted)
}
}