makepad_widgets/
nav_control.rs1use 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