use std::{fmt, hash::{Hash, Hasher}};
use ncursesw::form;
use crate::{NCurseswWinError, WideChar, gen::NCurseswWindow, form::Form};
pub use ncursesw::form::FormRequest;
pub struct PostedForm<'a> {
form: &'a Form,
posted: bool
}
impl<'a> PostedForm<'a> {
pub(in crate::form) fn new(form: &'a Form, refresh: bool) -> result!(Self) {
form::post_form(form._handle())?;
if refresh {
form.form_win()?.refresh()?;
}
Ok(Self { form, posted: true })
}
pub fn form_driver(&self, request: FormRequest) -> result!(Option<FormRequest>) {
Ok(form::form_driver(self.form._handle(), request)?)
}
pub fn form_driver_w(&self, request: FormRequest, wch: WideChar) -> result!(Option<FormRequest>) {
Ok(form::form_driver_w(self.form._handle(), request, wch)?)
}
pub fn repost(&mut self) -> result!(()) {
form::post_form(self.form._handle())?;
self.posted = true;
Ok(())
}
pub fn unpost(&mut self) -> result!(()) {
form::unpost_form(self.form._handle())?;
self.posted = false;
Ok(())
}
pub fn posted(&self) -> bool {
self.posted
}
pub fn refresh(&self) -> result!(()) {
self.form.form_win()?.refresh()
}
pub fn pos_form_cursor(&self) -> result!(()) {
Ok(form::pos_form_cursor(self.form._handle())?)
}
}
impl<'a> Drop for PostedForm<'a> {
fn drop(&mut self) {
if self.posted {
if let Err(source) = form::unpost_form(self.form._handle()) {
panic!("{} @ {:?}", source, self)
}
}
}
}
unsafe impl<'a> Send for PostedForm<'a> { } unsafe impl<'a> Sync for PostedForm<'a> { }
impl<'a> Hash for PostedForm<'a> {
fn hash<H: Hasher>(&self, state: &mut H) {
self.form.hash(state);
}
}
impl <'a>AsRef<PostedForm<'a>> for PostedForm<'a> {
fn as_ref(&self) -> &Self {
self
}
}
impl <'a>AsMut<PostedForm<'a>> for PostedForm<'a> {
fn as_mut(&mut self) -> &mut Self {
self
}
}
impl<'a> fmt::Debug for PostedForm<'a> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "PostedForm {{ form: {:?}, posted: {} }}", self.form, self.posted)
}
}