#[cfg(not(feature = "layout"))] mod layout_extern;
#[cfg(feature = "cassowary")]
#[macro_use] mod layout_cw;
mod class;
mod data;
#[cfg(not(feature = "layout"))]
pub use self::layout_extern::{Layout, ChildLayout, GridPos};
#[cfg(feature = "cassowary")]
pub use self::layout_cw::{Layout};
pub use self::data::*;
pub use self::class::Class;
use crate::toolkit::TkData;
pub trait Core {
fn number(&self) -> u32;
fn set_number(&mut self, number: u32);
fn tkd(&self) -> TkData;
fn set_tkd(&mut self, tkd: TkData);
fn rect(&self) -> &Rect;
fn rect_mut(&mut self) -> &mut Rect;
}
#[derive(Clone, Default, Debug)]
pub struct CoreData {
number: u32,
tkd: TkData,
rect: Rect,
}
impl Core for CoreData {
#[inline]
fn number(&self) -> u32 {
self.number
}
#[inline]
fn set_number(&mut self, number: u32) {
if self.number != 0 {
panic!("widget number has been set twice");
}
self.number = number;
}
#[inline]
fn tkd(&self) -> TkData {
self.tkd.clone()
}
#[inline]
fn set_tkd(&mut self, tkd: TkData) {
if !self.tkd.is_null() && !tkd.is_null() {
panic!("widget's toolkit data has been set twice");
}
self.tkd = tkd;
}
#[inline]
fn rect(&self) -> &Rect {
&self.rect
}
#[inline]
fn rect_mut(&mut self) -> &mut Rect {
&mut self.rect
}
}
pub trait Widget: Layout {
fn class(&self) -> Class;
fn label(&self) -> Option<&str>;
fn is_editable(&self) -> bool {
false
}
fn len(&self) -> usize;
fn get(&self, index: usize) -> Option<&Widget>;
fn get_mut(&mut self, index: usize) -> Option<&mut Widget>;
fn enumerate(&mut self, mut n: u32) -> u32 {
for i in 0..self.len() {
self.get_mut(i).map(|w| n = w.enumerate(n));
}
self.set_number(n);
n + 1
}
}
pub struct ChildIter<'a, W: 'a + Widget + ?Sized> {
w: &'a W,
i: ::std::ops::Range<usize>,
}
impl<'a, W: 'a + Widget + ?Sized> ChildIter<'a, W> {
pub fn new(widget: &'a W) -> Self {
ChildIter { w: widget, i: (0..widget.len()).into_iter() }
}
}
impl<'a, W: 'a + Widget + ?Sized> Iterator for ChildIter<'a, W> {
type Item = &'a Widget;
fn next(&mut self) -> Option<Self::Item> {
self.i.next().and_then(|i| self.w.get(i))
}
}