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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
use super::*;
use crate::draw::{DrawHandle, SizeHandle};
use crate::event::{self, Event, Manager, Response};
use crate::geom::{Coord, Rect};
use crate::layout::{AxisInfo, SizeRules};
use crate::{AlignHints, CoreData, WidgetId};
impl<M: 'static> WidgetCore for Box<dyn Widget<Msg = M>> {
fn as_any(&self) -> &dyn Any {
self.as_ref().as_any()
}
fn as_any_mut(&mut self) -> &mut dyn Any {
self.as_mut().as_any_mut()
}
fn core_data(&self) -> &CoreData {
self.as_ref().core_data()
}
fn core_data_mut(&mut self) -> &mut CoreData {
self.as_mut().core_data_mut()
}
fn widget_name(&self) -> &'static str {
self.as_ref().widget_name()
}
fn as_widget(&self) -> &dyn WidgetConfig {
self.as_ref().as_widget()
}
fn as_widget_mut(&mut self) -> &mut dyn WidgetConfig {
self.as_mut().as_widget_mut()
}
}
impl<M: 'static> WidgetChildren for Box<dyn Widget<Msg = M>> {
fn len(&self) -> usize {
self.as_ref().len()
}
fn get(&self, index: usize) -> Option<&dyn WidgetConfig> {
self.as_ref().get(index)
}
fn get_mut(&mut self, index: usize) -> Option<&mut dyn WidgetConfig> {
self.as_mut().get_mut(index)
}
fn find(&self, id: WidgetId) -> Option<&dyn WidgetConfig> {
self.as_ref().find(id)
}
fn find_mut(&mut self, id: WidgetId) -> Option<&mut dyn WidgetConfig> {
self.as_mut().find_mut(id)
}
fn walk(&self, f: &mut dyn FnMut(&dyn WidgetConfig)) {
self.as_ref().walk(f);
}
fn walk_mut(&mut self, f: &mut dyn FnMut(&mut dyn WidgetConfig)) {
self.as_mut().walk_mut(f);
}
}
impl<M: 'static> WidgetConfig for Box<dyn Widget<Msg = M>> {
fn configure(&mut self, mgr: &mut Manager) {
self.as_mut().configure(mgr);
}
fn key_nav(&self) -> bool {
self.as_ref().key_nav()
}
fn cursor_icon(&self) -> event::CursorIcon {
self.as_ref().cursor_icon()
}
}
impl<M: 'static> Layout for Box<dyn Widget<Msg = M>> {
fn size_rules(&mut self, size_handle: &mut dyn SizeHandle, axis: AxisInfo) -> SizeRules {
self.as_mut().size_rules(size_handle, axis)
}
fn set_rect(&mut self, rect: Rect, align: AlignHints) {
self.as_mut().set_rect(rect, align);
}
fn find_id(&self, coord: Coord) -> Option<WidgetId> {
self.as_ref().find_id(coord)
}
fn draw(&self, draw_handle: &mut dyn DrawHandle, mgr: &event::ManagerState, disabled: bool) {
self.as_ref().draw(draw_handle, mgr, disabled);
}
}
impl<M: 'static> event::Handler for Box<dyn Widget<Msg = M>> {
type Msg = M;
fn activation_via_press(&self) -> bool {
self.as_ref().activation_via_press()
}
fn handle(&mut self, mgr: &mut Manager, event: Event) -> Response<Self::Msg> {
self.as_mut().handle(mgr, event)
}
}
impl<M: 'static> event::SendEvent for Box<dyn Widget<Msg = M>> {
fn send(&mut self, mgr: &mut Manager, id: WidgetId, event: Event) -> Response<Self::Msg> {
self.as_mut().send(mgr, id, event)
}
}
impl<M: 'static> Widget for Box<dyn Widget<Msg = M>> {}
impl<M: 'static> Clone for Box<dyn Widget<Msg = M>> {
fn clone(&self) -> Self {
#[cfg(feature = "nightly")]
unsafe {
let mut x = Box::new_uninit();
self.clone_to(x.as_mut_ptr());
x.assume_init()
}
#[cfg(not(feature = "nightly"))]
panic!("Clone for Box<dyn Widget> only supported on nightly");
}
}