use std::convert::TryFrom;
use ncursesw::form::{FormRequest, FormOptions, FieldJustification, FieldOptions};
use crate::{
Screen, Window, HasHandle, NCurseswWinError, normal,
form::{
Form, Field, FieldType, Form_Hook,
callbacks::{
set_form_callback, extern_field_init, extern_field_term,
extern_form_init, extern_form_term, CallbackType
}
}
};
pub fn current_field() -> result!(Field) {
Ok(Field::_from(ncursesw::form::current_field(None)?, false))
}
pub fn field_arg() -> result!(*mut libc::c_void) {
Ok(ncursesw::form::field_arg(None)?)
}
pub fn field_back() -> normal::Attributes {
ncursesw::form::field_back(None)
}
pub fn field_count() -> result!(usize) {
Ok(usize::try_from(ncursesw::form::field_count(None)?)?)
}
pub fn field_fore() -> normal::Attributes {
ncursesw::form::field_fore(None)
}
#[deprecated(since = "0.6.0")]
pub fn field_init() -> result!(Form_Hook) {
Ok(ncursesw::form::field_init(None)?)
}
pub fn field_just() -> result!(FieldJustification) {
Ok(ncursesw::form::field_just(None)?)
}
pub fn field_opts() -> FieldOptions {
ncursesw::form::field_opts(None)
}
pub fn field_opts_off(opts: FieldOptions) -> result!(()) {
Ok(ncursesw::form::field_opts_off(None, opts)?)
}
pub fn field_opts_on(opts: FieldOptions) -> result!(()) {
Ok(ncursesw::form::field_opts_on(None, opts)?)
}
pub fn field_pad() -> result!(char) {
Ok(ncursesw::form::field_pad(None)?)
}
pub fn field_status() -> bool {
ncursesw::form::field_status(None)
}
#[deprecated(since = "0.6.0")]
pub fn field_term() -> result!(Form_Hook) {
Ok(ncursesw::form::field_term(None)?)
}
pub fn field_type() -> result!(FieldType) {
Ok(FieldType::_from(ncursesw::form::field_type(None)?, false))
}
pub fn field_userptr<T>() -> result!(Option<Box<T>>) {
Ok(unsafe { ncursesw::form::field_userptr(None)?.as_mut().map(|userptr| Box::from_raw(userptr as *mut libc::c_void as *mut T)) })
}
pub fn new_page() -> bool {
ncursesw::form::new_page(None)
}
pub fn form_fields() -> result!(Vec<Field>) {
Ok(ncursesw::form::form_fields(None)?.iter().map(|handle| Field::_from(*handle, false)).collect())
}
#[deprecated(since = "0.6.0")]
pub fn form_init() -> result!(Form_Hook) {
Ok(ncursesw::form::form_init(None)?)
}
pub fn form_opts() -> FormOptions {
ncursesw::form::form_opts(None)
}
pub fn form_opts_off(opts: FormOptions) -> result!(()) {
Ok(ncursesw::form::form_opts_off(None, opts)?)
}
pub fn form_opts_on(opts: FormOptions) -> result!(()) {
Ok(ncursesw::form::form_opts_on(None, opts)?)
}
pub fn form_page() -> result!(usize) {
Ok(usize::try_from(ncursesw::form::form_page(None)?)?)
}
pub fn form_request_by_name<S: Into<String>>(name: S) -> result!(Option<FormRequest>) {
Ok(ncursesw::form::form_request_by_name(name)?)
}
pub fn form_request_name(request: FormRequest) -> result!(String) {
Ok(ncursesw::form::form_request_name(request)?)
}
pub fn form_sub() -> result!(Window) {
Ok(Window::_from(None, ncursesw::form::form_sub(None)?, false))
}
#[deprecated(since = "0.6.0")]
pub fn form_term() -> result!(Form_Hook) {
Ok(ncursesw::form::form_term(None)?)
}
pub fn form_userptr<T>() -> result!(Option<Box<T>>) {
Ok(unsafe { ncursesw::form::form_userptr(None)?.as_mut().map(|userptr| Box::from_raw(userptr as *mut libc::c_void as *mut T)) })
}
pub fn form_win() -> result!(Window) {
Ok(Window::_from(None, ncursesw::form::form_win(None)?, false))
}
pub fn set_field_back(attr: normal::Attributes) -> result!(()) {
Ok(ncursesw::form::set_field_back(None, attr)?)
}
pub fn set_field_fore(attr: normal::Attributes) -> result!(()) {
Ok(ncursesw::form::set_field_fore(None, attr)?)
}
pub fn set_field_init<F>(func: F) -> result!(())
where F: Fn(&Form) + 'static + Send
{
set_form_callback(None, CallbackType::FieldInit, func);
Ok(ncursesw::form::set_field_init(None, Some(extern_field_init))?)
}
pub fn set_field_just(justification: FieldJustification) -> result!(()) {
Ok(ncursesw::form::set_field_just(None, justification)?)
}
pub fn set_field_opts(opts: FieldOptions) -> result!(()) {
Ok(ncursesw::form::set_field_opts(None, opts)?)
}
pub fn set_field_pad(pad: char) -> result!(()) {
Ok(ncursesw::form::set_field_pad(None, pad)?)
}
pub fn set_field_status(status: bool) -> result!(()) {
Ok(ncursesw::form::set_field_status(None, status)?)
}
pub fn set_field_term<F>(func: F) -> result!(())
where F: Fn(&Form) + 'static + Send
{
set_form_callback(None, CallbackType::FieldTerm, func);
Ok(ncursesw::form::set_field_term(None, Some(extern_field_term))?)
}
pub fn set_field_userptr<T>(userptr: Option<Box<&T>>) -> result!(()) {
Ok(ncursesw::form::set_field_userptr(None, userptr.map(|userptr| Box::into_raw(userptr) as *mut libc::c_void))?)
}
pub fn set_new_page(new_page_flag: bool) -> result!(()) {
Ok(ncursesw::form::set_new_page(None, new_page_flag)?)
}
pub fn set_form_init<F>(func: F) -> result!(())
where F: Fn(&Form) + 'static + Send
{
set_form_callback(None, CallbackType::FormInit, func);
Ok(ncursesw::form::set_form_init(None, Some(extern_form_init))?)
}
pub fn set_form_opts(opts: FormOptions) -> result!(()) {
Ok(ncursesw::form::set_form_opts(None, opts)?)
}
pub fn set_form_sub(window: Option<&Window>) -> result!(()) {
Ok(ncursesw::form::set_form_sub(None, window.map(|window| window._handle()))?)
}
pub fn set_form_term<F>(func: F) -> result!(())
where F: Fn(&Form) + 'static + Send
{
set_form_callback(None, CallbackType::FormTerm, func);
Ok(ncursesw::form::set_form_term(None, Some(extern_form_term))?)
}
pub fn set_form_userptr<T>(userptr: Option<Box<&T>>) -> result!(()) {
Ok(ncursesw::form::set_form_userptr(None, userptr.map(|userptr| Box::into_raw(userptr) as *mut libc::c_void))?)
}
pub fn set_form_win(window: Option<&Window>) -> result!(()) {
Ok(ncursesw::form::set_form_win(None, window.map(|window| window._handle()))?)
}
pub fn field_back_sp(screen: &Screen) -> normal::Attributes {
normal::Attributes::new_sp(screen._handle(), ncursesw::form::field_back(None).into())
}
pub fn field_fore_sp(screen: &Screen) -> normal::Attributes {
normal::Attributes::new_sp(screen._handle(), ncursesw::form::field_fore(None).into())
}
pub fn form_sub_sp(screen: &Screen) -> result!(Window) {
Ok(Window::_from(Some(screen._handle()), ncursesw::form::form_sub(None)?, false))
}
pub fn form_win_sp(screen: &Screen) -> result!(Window) {
Ok(Window::_from(Some(screen._handle()), ncursesw::form::form_win(None)?, false))
}