1use std::cell::Cell;
21use std::ffi::{CString,c_void};
22use std::os::raw::c_char;
23use newt_sys::*;
24
25use crate::component::Component;
26use crate::intern::ComponentPtr;
27use crate::grid::r#trait;
28
29#[doc(hidden)]
30pub mod basic_window;
31#[doc(hidden)]
32pub mod button_bar;
33#[doc(hidden)]
34pub mod horizontal_grid;
35#[doc(hidden)]
36pub mod simple_window;
37#[doc(hidden)]
38pub mod vertical_grid;
39
40#[doc(inline)]
41pub use self::basic_window::BasicWindow;
42#[doc(inline)]
43pub use self::button_bar::ButtonBar;
44#[doc(inline)]
45pub use self::horizontal_grid::HorizontalGrid;
46#[doc(inline)]
47pub use self::simple_window::SimpleWindow;
48#[doc(inline)]
49pub use self::vertical_grid::VerticalGrid;
50
51#[derive(Grid)]
58pub struct Grid<'a> {
59 grid: Cell<newtGrid>,
60 added_to_parent: Cell<bool>,
61 children: Vec<&'a dyn Component>,
62 cols: i32,
63 rows: i32
64}
65
66impl<'a> Grid<'a> {
67 pub fn new(cols: i32, rows: i32) -> Grid<'a> {
71 assert!(cols > 0, "`cols` must be greater than 0");
72 assert!(rows > 0, "`rows` must be greater than 0");
73
74 Grid {
75 grid: unsafe { Cell::new(newtCreateGrid(cols, rows)) },
76 added_to_parent: Cell::new(false),
77 children: Vec::new(),
78 cols, rows
79 }
80 }
81
82 pub fn set_field(&mut self, col: i32, row: i32, val: &'a dyn Component,
86 pad_left: i32, pad_top: i32, pad_right: i32,
87 pad_bottom: i32, anchor: i32, flags: i32) {
88
89 if col >= self.cols || row >= self.rows {
90 panic!("Attempting to set a field at an invalid position ({}, {})", col, row);
91 }
92
93 let r#type = val.grid_element_type();
94 let co = val.co();
95 self.children.push(val);
96
97 unsafe {
98 newtGridSetField(self.grid_ptr(), col, row, r#type,
99 co as *mut c_void, pad_left, pad_top, pad_right,
100 pad_bottom, anchor, flags);
101 }
102 }
103}
104
105pub fn wrapped_window(grid: &dyn r#trait::Grid, title: &str) {
109 let c_str = CString::new(title).unwrap();
110 unsafe {
111 newtGridWrappedWindow(grid.grid_ptr(), c_str.as_ptr() as *mut c_char);
112 }
113}
114
115pub fn wrapped_window_at(grid: &dyn r#trait::Grid, title: &str,
119 left: i32, top: i32) {
120 let c_str = CString::new(title).unwrap();
121 unsafe {
122 newtGridWrappedWindowAt(grid.grid_ptr(), c_str.as_ptr() as *mut c_char,
123 left, top);
124 }
125}