use rustty::{Size, Pos, HasSize, HasPosition};
use rustty::CellAccessor;
use std::boxed::Box;
use std::collections::HashMap;
use core::{
Layout,
Alignable,
HorizontalAlign,
VerticalAlign,
Widget,
Frame,
Button,
Painter,
ButtonResult
};
pub struct HorizontalLayout {
frame: Frame,
inner_margin: usize,
origin: Pos,
widgets: Vec<Box<Button>>
}
impl HorizontalLayout {
pub fn from_vec(widgets: Vec<Box<Button>>, inner_margin: usize) -> HorizontalLayout {
let first_origin = widgets.first().unwrap().frame().origin();
let total_width = widgets.iter().fold(0, |acc, item| acc + item.frame().size().0);
let width = total_width + inner_margin * (widgets.len() - 1);
HorizontalLayout {
frame: Frame::new(width, 1),
inner_margin: inner_margin,
origin: first_origin,
widgets: widgets
}
}
}
impl Widget for HorizontalLayout {
fn draw(&mut self, parent: &mut CellAccessor) {
self.frame.draw_into(parent);
}
fn pack(&mut self, parent: &HasSize, halign: HorizontalAlign, valign: VerticalAlign,
margin: (usize, usize)) {
self.frame.align(parent, halign, valign, margin);
}
fn draw_box(&mut self) {
self.frame.draw_box();
}
fn resize(&mut self, new_size: Size) {
self.frame.resize(new_size);
}
fn frame(&self) -> &Frame {
&self.frame
}
fn frame_mut(&mut self) -> &mut Frame {
&mut self.frame
}
}
impl Layout for HorizontalLayout {
fn align_elems(&mut self) {
let (x, y) = self.origin;
let mut current_x = x;
for widget in self.widgets.iter_mut() {
widget.frame_mut().set_origin((current_x, y));
current_x += widget.frame_mut().size().0 + self.inner_margin;
}
for w in self.widgets.iter() {
w.frame().draw_into(&mut self.frame);
}
}
fn forward_keys(&mut self, map: &mut HashMap<char, ButtonResult>) {
for w in self.widgets.iter() {
map.insert(w.accel(), w.result());
}
}
}