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
64
65
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_core::Cursive;
/// use cursive_core::views::{Button, EnableableView, Checkbox, LinearLayout};
/// use cursive_core::traits::Nameable;
///
/// let mut siv = Cursive::new();
///
/// 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,
}
new_default!(EnableableView<V: Default>);
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));
}
}