diff --git a/examples/mutation.rs b/examples/mutation.rs index e944cc0..bddeca0 100644 --- a/examples/mutation.rs +++ b/examples/mutation.rs @@ -1,19 +1,36 @@ extern crate cursive; use cursive::Cursive; -use cursive::view::{IdView,TextView,Dialog,Selector}; +use cursive::view::{IdView,TextView,Dialog,Selector,KeyEventView}; + +fn show_popup(siv: &mut Cursive) { + + siv.add_layer(Dialog::new(TextView::new("Tak!")) + .button("Change", |s,_| { + // Look for a view tagged "text". We _know_ it's there, so unwrap it. + let view = s.find::(&Selector::Id("text")).unwrap(); + let content: String = view.get_content().chars().rev().collect(); + view.set_content(&content); + }) + .dismiss_button("Ok")); + +} fn main() { let mut siv = Cursive::new(); + let content = "Press Q to quit the application.\n\nPress P to bring back the popup."; + siv.add_global_callback('q' as i32, |s,_| s.quit()); - siv.add_layer(IdView::new("text", TextView::new("Aaahh\nAaaah\nAaaah\nAaaaah\nAaaaah\nAaaaah\nAaaaah\nAaaaaah\nAaaaah"))); + // Let's wrap the view to give it a recognizable ID, so we can look for it. + // We add the P callback on the textview only (and not globally), + // so that we can't call it when the popup is already visible. + siv.add_layer(KeyEventView::new(IdView::new("text", TextView::new(content))) + .register('p' as i32, |s,_| show_popup(s))); + + show_popup(&mut siv); - siv.add_layer(Dialog::new(TextView::new("Tak!")) - .button("Change", |s,_| s.find::(&Selector::Id("text")).unwrap() - .set_content("Bleeeeh\nBleeeeeeeeeeh\nBleeeh") ) - .dismiss_button("Ok")); siv.run(); } diff --git a/src/view/text_view.rs b/src/view/text_view.rs index 61968c4..f86d28f 100644 --- a/src/view/text_view.rs +++ b/src/view/text_view.rs @@ -33,10 +33,16 @@ impl TextView { } } + /// Replace the text in this view. pub fn set_content(&mut self, content: &str) { self.content = content.to_string(); } + /// Returns the current text in this view. + pub fn get_content(&self) -> &str { + &self.content + } + /// Returns the number of lines required to display the content /// with the given width. fn get_num_lines(&self, max_width: usize) -> usize {