makepad_widgets/
nav_control.rs

1use crate::makepad_draw::*;
2
3
4live_design!{
5    link widgets;
6    use link::theme::*;
7    use makepad_draw::shader::std::*;
8        
9    pub NavControlBase = {{NavControl}} {}
10    pub NavControl = <NavControlBase> {
11        draw_focus: {
12            fn pixel(self) -> vec4 {
13                return #000f
14            }
15        }
16        draw_text: {
17            text_style: {
18                font_size: 6
19            },
20            color: (THEME_COLOR_LABEL_INNER)
21        }
22    }
23    
24}
25
26#[derive(Live, LiveHook, LiveRegister)]
27pub struct NavControl {
28    #[live] draw_list: DrawList2d,
29    #[live] draw_focus: DrawQuad,
30    #[live] draw_text: DrawText,
31    #[rust] _recent_focus: Area,
32}
33
34impl NavControl {
35    
36    pub fn send_trigger_to_scroll_stack(cx: &mut Cx, stack:Vec<Area>){
37        let mut prev_area = None;
38        for next_area in stack{
39            if let Some(prev_area) = prev_area{
40                cx.send_trigger(prev_area, Trigger{
41                    id:live_id!(scroll_focus_nav),
42                    from:next_area
43                });
44            }
45            prev_area = Some(next_area);
46        }
47    }
48    
49    pub fn handle_event(&mut self, cx: &mut Cx, event: &Event, root: DrawListId) {
50        match event {
51            Event::KeyDown(ke) => match ke.key_code {
52                KeyCode::Tab => {
53                    if ke.modifiers.shift {
54                        let mut prev_area = Area::Empty;
55                        if let Some((prev_area, scroll_stack)) = CxDraw::iterate_nav_stops(cx, root, | cx, stop | {
56                            if cx.has_key_focus(stop.area) {
57                                return Some(prev_area);
58                            }
59                            prev_area = stop.area;
60                            None
61                        }) {
62                            if !prev_area.is_empty() {
63                                Self::send_trigger_to_scroll_stack(cx, scroll_stack);
64                                cx.set_key_focus(prev_area);
65                            }
66                        }
67                    }
68                    else {
69                        let mut next_stop = false;
70                        if let Some((next_area, scroll_stack)) = CxDraw::iterate_nav_stops(cx, root, | cx, stop | {
71                            if next_stop {
72                                return Some(stop.area)
73                            }
74                            if cx.has_key_focus(stop.area) {
75                                next_stop = true;
76                            }
77                            None
78                        }) {
79                            Self::send_trigger_to_scroll_stack(cx, scroll_stack);
80                            cx.set_key_focus(next_area);
81                        }
82                    }
83                }
84                _ => ()
85            },
86            _ => ()
87        }
88    }
89    
90    pub fn draw(&mut self, cx: &mut Cx2d) {
91        if !self.draw_list.begin(cx, Walk::default()).is_redrawing() {
92            return
93        }
94        
95        self.draw_list.end(cx);
96    }
97}
98
99