use std::cell::Cell;
use std::ffi::{CString,c_void};
use std::os::raw::c_char;
use newt_sys::*;
use crate::component::Component;
use crate::grid::r#trait;
use crate::private::ComponentPtr;
#[doc(hidden)]
pub mod basic_window;
#[doc(hidden)]
pub mod button_bar;
#[doc(hidden)]
pub mod horizontal_grid;
#[doc(hidden)]
pub mod simple_window;
#[doc(hidden)]
pub mod vertical_grid;
#[doc(inline)]
pub use self::basic_window::BasicWindow;
#[doc(inline)]
pub use self::button_bar::ButtonBar;
#[doc(inline)]
pub use self::horizontal_grid::HorizontalGrid;
#[doc(inline)]
pub use self::simple_window::SimpleWindow;
#[doc(inline)]
pub use self::vertical_grid::VerticalGrid;
#[derive(Grid)]
pub struct Grid<'a> {
co: Cell<newtGrid>,
added_to_parent: Cell<bool>,
children: Vec<&'a dyn Component>,
cols: i32,
rows: i32
}
impl<'a> Grid<'a> {
pub fn new(cols: i32, rows: i32) -> Grid<'a> {
assert!(cols > 0, "`cols` must be greater than 0");
assert!(rows > 0, "`rows` must be greater than 0");
Grid {
co: unsafe { Cell::new(newtCreateGrid(cols, rows)) },
added_to_parent: Cell::new(false),
children: Vec::new(),
cols, rows
}
}
pub fn set_field(&mut self, col: i32, row: i32, val: &'a dyn Component,
pad_left: i32, pad_top: i32, pad_right: i32,
pad_bottom: i32, anchor: i32, flags: i32) {
if col >= self.cols || row >= self.rows {
panic!("Attempting to set a field at an invalid position ({}, {})", col, row);
}
let r#type = val.grid_element_type();
let co = val.co();
self.children.push(val);
unsafe {
newtGridSetField(self.grid_ptr(), col, row, r#type,
co as *mut c_void, pad_left, pad_top, pad_right,
pad_bottom, anchor, flags);
}
}
}
pub fn wrapped_window(grid: &dyn r#trait::Grid, title: &str) {
let c_str = CString::new(title).unwrap();
unsafe {
newtGridWrappedWindow(grid.grid_ptr(), c_str.as_ptr() as *mut c_char);
}
}
pub fn wrapped_window_at(grid: &dyn r#trait::Grid, title: &str,
left: i32, top: i32) {
let c_str = CString::new(title).unwrap();
unsafe {
newtGridWrappedWindowAt(grid.grid_ptr(), c_str.as_ptr() as *mut c_char,
left, top);
}
}