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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
use crate::view::{View, ViewWrapper};
use crate::views::{NamedView, ViewRef};
pub trait Finder {
fn call_on<V, F, R>(
&mut self,
sel: &Selector<'_>,
callback: F,
) -> Option<R>
where
V: View,
F: FnOnce(&mut V) -> R,
{
let mut callback = Some(callback);
let mut result = None;
self.call_on_all(sel, |v: &mut V| {
if let Some(callback) = callback.take() {
result = Some(callback(v));
}
});
result
}
fn call_on_all<V, F>(&mut self, sel: &Selector<'_>, callback: F)
where
V: View,
F: FnMut(&mut V);
fn call_on_name<V, F, R>(&mut self, name: &str, callback: F) -> Option<R>
where
V: View,
F: FnOnce(&mut V) -> R,
{
self.call_on(&Selector::Name(name), callback)
}
#[deprecated(note = "`call_on_id` is being renamed to `call_on_name`")]
fn call_on_id<V, F, R>(&mut self, id: &str, callback: F) -> Option<R>
where
V: View,
F: FnOnce(&mut V) -> R,
{
self.call_on_name(id, callback)
}
fn find_name<V>(&mut self, name: &str) -> Option<ViewRef<V>>
where
V: View,
{
self.call_on_name(name, NamedView::<V>::get_mut)
}
#[deprecated(note = "`find_id` is being renamed to `find_name`")]
fn find_id<V>(&mut self, id: &str) -> Option<ViewRef<V>>
where
V: View,
{
self.find_name(id)
}
}
impl<T: View> Finder for T {
fn call_on_all<V, F>(&mut self, sel: &Selector<'_>, mut callback: F)
where
V: View,
F: FnMut(&mut V),
{
self.call_on_any(sel, &mut |v: &mut dyn View| {
if let Some(v) = v.downcast_mut::<V>() {
callback(v);
} else if let Some(v) = v.downcast_mut::<NamedView<V>>() {
v.with_view_mut(&mut callback);
}
});
}
}
#[non_exhaustive]
pub enum Selector<'a> {
#[deprecated(
note = "`Selector::Id` is being renamed to `Selector::Name`"
)]
Id(&'a str),
Name(&'a str),
}