1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
use crate::event::{Event, EventResult}; use crate::view::{View, ViewWrapper}; use crate::Printer; /// Wrapper around another view that can be enabled/disabled at will. /// /// When disabled, all child views will be disabled and will stop receiving events. /// /// # Examples /// /// ``` /// use cursive::Cursive; /// use cursive::views::{Button, EnableableView, Checkbox, LinearLayout}; /// use cursive::traits::Identifiable; /// /// let mut siv = Cursive::dummy(); /// /// siv.add_layer(LinearLayout::vertical() /// .child(EnableableView::new(Checkbox::new()).with_name("my_view")) /// .child(Button::new("Toggle", |s| { /// s.call_on_name("my_view", |v: &mut EnableableView<Checkbox>| { /// // This will disable (or re-enable) the checkbox, preventing the user from /// // interacting with it. /// v.set_enabled(!v.is_enabled()); /// }); /// })) /// ); /// ``` pub struct EnableableView<V> { view: V, enabled: bool, } impl<V> EnableableView<V> { /// Creates a new `EnableableView` around `view`. /// /// It will be enabled by default. pub fn new(view: V) -> Self { EnableableView { view, enabled: true, } } impl_enabled!(self.enabled); inner_getters!(self.view: V); } impl<V: View> ViewWrapper for EnableableView<V> { wrap_impl!(self.view: V); fn wrap_on_event(&mut self, event: Event) -> EventResult { if self.enabled { self.view.on_event(event) } else { EventResult::Ignored } } fn wrap_draw(&self, printer: &Printer<'_, '_>) { self.view.draw(&printer.enabled(self.enabled)); } }