diff --git a/examples/select.rs b/examples/select.rs index acc9c02..1e1d717 100644 --- a/examples/select.rs +++ b/examples/select.rs @@ -19,18 +19,19 @@ fn main() { for line in reader.lines() { select.add_item_str(&line.unwrap()); } + select.set_on_select(show_next_window); let mut siv = Cursive::new(); // Let's add a BoxView to keep the list at a reasonable size - it can scroll anyway. - siv.add_layer(Dialog::new(BoxView::new((20,10), select.on_select(|s,city| show_next_window(s,city)))) + siv.add_layer(Dialog::new(BoxView::new((20,10), select)) .title("Where are you from?")); siv.run(); } // Let's put the callback in a separate function to keep it clean, but it's not required. -fn show_next_window(siv: &mut Cursive, city: &str) { +fn show_next_window(siv: &mut Cursive, city: &String) { siv.pop_layer(); siv.add_layer(Dialog::new(TextView::new(&format!("{} is a great city!", city))) .button("Quit", |s| s.quit())); diff --git a/src/view/dialog.rs b/src/view/dialog.rs index 1600a2d..03d016e 100644 --- a/src/view/dialog.rs +++ b/src/view/dialog.rs @@ -108,14 +108,22 @@ impl View for Dialog { // Current horizontal position of the next button we'll draw. // Sum of the sizes + len-1 for margins - let width = self.buttons.iter().map(|button| button.size.x).fold(0, |a,b| a+b) + self.buttons.len() - 1; + let width = if self.buttons.is_empty() { + 0 + } else { + self.buttons.iter() + .map(|button| button.size.x) + .fold(0, |a,b| a+b) + + self.buttons.len() - 1 + }; let overhead = self.padding + self.borders; - let mut offset = overhead.left + self.align.h.get_offset(width, printer.size.x - overhead.horizontal()); + let mut offset = overhead.left + + self.align.h.get_offset(width, printer.size.x - + overhead.horizontal()); let y = printer.size.y - self.padding.bottom - self.borders.bottom - 1; for (i,button) in self.buttons.iter_mut().enumerate() { let size = button.size; - // let offset = printer.size - self.borders.bot_right() - self.padding.bot_right() - size - Vec2::new(x, 0); // Add some special effect to the focused button button.draw(&printer.sub_printer(Vec2::new(offset, y), size, self.focus == Focus::Button(i))); // Keep 1 blank between two buttons @@ -130,7 +138,10 @@ impl View for Dialog { - self.borders.combined() - self.padding.combined(); - self.content.draw(&printer.sub_printer(self.borders.top_left() + self.padding.top_left(), inner_size, self.focus == Focus::Content)); + self.content.draw(&printer.sub_printer(self.borders.top_left() + + self.padding.top_left(), + inner_size, + self.focus == Focus::Content)); printer.print_box(Vec2::new(0,0), printer.size); @@ -140,18 +151,22 @@ impl View for Dialog { printer.print((x-2,0), "┤ "); printer.print((x+len,0), " ├"); - printer.with_color(ColorPair::TitlePrimary, |p| p.print((x,0), &self.title)); + printer.with_color(ColorPair::TitlePrimary, + |p| p.print((x,0), &self.title)); } } fn get_min_size(&self, req: SizeRequest) -> Vec2 { // Padding and borders are not available for kids. - let content_req = req.reduced(self.padding.combined() + self.borders.combined()); + let content_req = req.reduced(self.padding.combined() + + self.borders.combined()); let content_size = self.content.get_min_size(content_req); let mut buttons_size = Vec2::new(0,0); - if !self.buttons.is_empty() { buttons_size.x += self.buttons.len() - 1; } + if !self.buttons.is_empty() { + buttons_size.x += self.buttons.len() - 1; + } for button in self.buttons.iter() { let s = button.view.get_min_size(req); buttons_size.x += s.x; diff --git a/src/view/select_view.rs b/src/view/select_view.rs index c67d345..7c413cf 100644 --- a/src/view/select_view.rs +++ b/src/view/select_view.rs @@ -47,11 +47,17 @@ impl SelectView { } } - /// Sets a function to be called when an item is selected (when ENTER is pressed). - pub fn on_select(mut self, cb: F) -> Self - where F: Fn(&mut Cursive,&T) + 'static + pub fn set_on_select(&mut self, cb: F) + where F: Fn(&mut Cursive, &T) + 'static { self.select_cb = Some(Rc::new(Box::new(cb))); + } + + /// Sets a function to be called when an item is selected (when ENTER is pressed). + pub fn on_select(mut self, cb: F) -> Self + where F: Fn(&mut Cursive, &T) + 'static + { + self.set_on_select(cb); self } diff --git a/src/view/shadow_view.rs b/src/view/shadow_view.rs index fcba49f..35b099a 100644 --- a/src/view/shadow_view.rs +++ b/src/view/shadow_view.rs @@ -40,8 +40,9 @@ impl ViewWrapper for ShadowView { } }); - self.view.draw(&printer.sub_printer(Vec2::new(1,1), printer.size - (2,2), true)); - + self.view.draw(&printer.sub_printer(Vec2::new(1,1), + printer.size - (2,2), + true)); let h = printer.size.y-1; let w = printer.size.x-1;