use ncursesw::panels;
use ncursesw::panels::PANEL;
use ncursesw::{NCurseswError, Origin};
use crate::window::Window;
pub type PanelUserPtr = panels::PANEL_USERPTR;
pub struct Panel {
handle: PANEL,
free_on_drop: bool
}
unsafe impl Send for Panel { } unsafe impl Sync for Panel { }
impl Panel {
pub fn new_panel(window: &Window) -> result!(Self) {
match panels::new_panel(window.handle()) {
Err(e) => Err(e),
Ok(handle) => Ok(Self::from(handle, true))
}
}
pub(crate) fn from(handle: PANEL, free_on_drop: bool) -> Self {
Self { handle, free_on_drop }
}
}
impl Drop for Panel {
fn drop(&mut self) {
if self.free_on_drop {
if let Err(e) = panels::del_panel(self.handle) {
panic!(e.to_string())
}
}
}
}
impl Panel {
pub fn bottom_panel(&self) -> result!(()) {
panels::bottom_panel(self.handle)
}
pub fn top_panel(&self) -> result!(()) {
panels::top_panel(self.handle)
}
pub fn show_panel(&self) -> result!(()) {
panels::show_panel(self.handle)
}
pub fn hide_panel(&self) -> result!(()) {
panels::hide_panel(self.handle)
}
pub fn panel_window(&self) -> result!(Window) {
match panels::panel_window(self.handle) {
Err(e) => Err(e),
Ok(handle) => Ok(Window::from(handle, false))
}
}
pub fn replace_panel(&self, window: &Window) -> result!(()) {
panels::replace_panel(self.handle, window.handle())
}
pub fn move_panel(&self, origin: Origin) -> result!(()) {
panels::move_panel(self.handle, origin)
}
pub fn panel_hidden(&self) -> result!(bool) {
panels::panel_hidden(self.handle)
}
pub fn panel_above(&self) -> result!(Self) {
match panels::panel_above(Some(self.handle)) {
Err(e) => Err(e),
Ok(handle) => Ok(Panel::from(handle, false))
}
}
pub fn panel_below(&self) -> result!(Self) {
match panels::panel_below(Some(self.handle)) {
Err(e) => Err(e),
Ok(handle) => Ok(Panel::from(handle, false))
}
}
pub fn set_panel_userptr(&self, ptr: Option<PanelUserPtr>) -> result!(()) {
panels::set_panel_userptr(self.handle, ptr)
}
pub fn panel_userptr(&self) -> Option<PanelUserPtr> {
panels::panel_userptr(self.handle)
}
}
pub fn panel_above(panel: Option<&Panel>) -> result!(Panel) {
match panels::panel_above(match panel {
None => None,
Some(panel) => Some(panel.handle)
}) {
Err(e) => Err(e),
Ok(handle) => Ok(Panel::from(handle, false))
}
}
pub fn panel_below(panel: Option<&Panel>) -> result!(Panel) {
match panels::panel_below(match panel {
None => None,
Some(panel) => Some(panel.handle)
}) {
Err(e) => Err(e),
Ok(handle) => Ok(Panel::from(handle, false))
}
}