Skip to main content

rat_ftable2/selection/
noselection.rs

1use crate::event::TableOutcome;
2use crate::table::TableState;
3use rat_event::{ConsumedEvent, HandleEvent, MouseOnly, Regular, ct_event};
4use rat_focus::HasFocus;
5use rat_ftable::selection::NoSelection;
6use rat_scrolled::ScrollAreaState;
7use rat_scrolled::event::ScrollOutcome;
8use ratatui_crossterm::crossterm::event::Event;
9use std::cmp::max;
10
11impl HandleEvent<Event, Regular, TableOutcome> for TableState<NoSelection> {
12    fn handle(&mut self, event: &Event, _keymap: Regular) -> TableOutcome {
13        let res = if self.is_focused() {
14            match event {
15                ct_event!(keycode press Up) => {
16                    if self.scroll_up(1) {
17                        TableOutcome::Changed
18                    } else {
19                        TableOutcome::Unchanged
20                    }
21                }
22                ct_event!(keycode press Down) => {
23                    if self.scroll_down(1) {
24                        TableOutcome::Changed
25                    } else {
26                        TableOutcome::Unchanged
27                    }
28                }
29                ct_event!(keycode press CONTROL-Up)
30                | ct_event!(keycode press CONTROL-Home)
31                | ct_event!(keycode press Home) => {
32                    if self.scroll_to_row(0) {
33                        TableOutcome::Changed
34                    } else {
35                        TableOutcome::Unchanged
36                    }
37                }
38                ct_event!(keycode press CONTROL-Down)
39                | ct_event!(keycode press CONTROL-End)
40                | ct_event!(keycode press End) => {
41                    if self.scroll_to_row(self.rows.saturating_sub(1)) {
42                        TableOutcome::Changed
43                    } else {
44                        TableOutcome::Unchanged
45                    }
46                }
47                ct_event!(keycode press PageUp) => {
48                    if self.scroll_up(max(1, self.page_len().saturating_sub(1))) {
49                        TableOutcome::Changed
50                    } else {
51                        TableOutcome::Unchanged
52                    }
53                }
54                ct_event!(keycode press PageDown) => {
55                    if self.scroll_down(max(1, self.page_len().saturating_sub(1))) {
56                        TableOutcome::Changed
57                    } else {
58                        TableOutcome::Unchanged
59                    }
60                }
61                ct_event!(keycode press Left) => {
62                    if self.scroll_left(1) {
63                        TableOutcome::Changed
64                    } else {
65                        TableOutcome::Unchanged
66                    }
67                }
68                ct_event!(keycode press Right) => {
69                    if self.scroll_right(1) {
70                        TableOutcome::Changed
71                    } else {
72                        TableOutcome::Unchanged
73                    }
74                }
75                ct_event!(keycode press CONTROL-Left) => {
76                    if self.scroll_to_x(0) {
77                        TableOutcome::Changed
78                    } else {
79                        TableOutcome::Unchanged
80                    }
81                }
82                ct_event!(keycode press CONTROL-Right) => {
83                    if self.scroll_to_x(self.x_max_offset()) {
84                        TableOutcome::Changed
85                    } else {
86                        TableOutcome::Unchanged
87                    }
88                }
89                _ => TableOutcome::Continue,
90            }
91        } else {
92            TableOutcome::Continue
93        };
94
95        if res == TableOutcome::Continue {
96            self.handle(event, MouseOnly)
97        } else {
98            res
99        }
100    }
101}
102
103impl HandleEvent<Event, MouseOnly, TableOutcome> for TableState<NoSelection> {
104    fn handle(&mut self, event: &Event, _keymap: MouseOnly) -> TableOutcome {
105        if self.is_obscured() {
106            return TableOutcome::Continue;
107        }
108
109        let mut r = match event {
110            ct_event!(mouse down Left for column, row) => {
111                if self.header_area.contains((*column, *row).into()) {
112                    if let Some(col) = self.column_at_clicked((*column, *row)) {
113                        TableOutcome::Header(col)
114                    } else {
115                        TableOutcome::Continue
116                    }
117                } else if self.footer_area.contains((*column, *row).into()) {
118                    if let Some(col) = self.column_at_clicked((*column, *row)) {
119                        TableOutcome::Footer(col)
120                    } else {
121                        TableOutcome::Continue
122                    }
123                } else {
124                    TableOutcome::Continue
125                }
126            }
127            _ => TableOutcome::Continue,
128        };
129
130        r = r.or_else(|| {
131            let mut sas = ScrollAreaState::new()
132                .area(self.inner)
133                .h_scroll(&mut self.hscroll)
134                .v_scroll(&mut self.vscroll);
135
136            match sas.handle(event, MouseOnly) {
137                ScrollOutcome::Up(v) => {
138                    if self.scroll_up(v) {
139                        TableOutcome::Changed
140                    } else {
141                        TableOutcome::Unchanged
142                    }
143                }
144                ScrollOutcome::Down(v) => {
145                    if self.scroll_down(v) {
146                        TableOutcome::Changed
147                    } else {
148                        TableOutcome::Unchanged
149                    }
150                }
151                ScrollOutcome::VPos(v) => {
152                    if self.set_row_offset(v) {
153                        TableOutcome::Changed
154                    } else {
155                        TableOutcome::Unchanged
156                    }
157                }
158                ScrollOutcome::Left(v) => {
159                    if self.scroll_left(v) {
160                        TableOutcome::Changed
161                    } else {
162                        TableOutcome::Unchanged
163                    }
164                }
165                ScrollOutcome::Right(v) => {
166                    if self.scroll_right(v) {
167                        TableOutcome::Changed
168                    } else {
169                        TableOutcome::Unchanged
170                    }
171                }
172                ScrollOutcome::HPos(v) => {
173                    if self.set_x_offset(v) {
174                        TableOutcome::Changed
175                    } else {
176                        TableOutcome::Unchanged
177                    }
178                }
179                ScrollOutcome::Continue => TableOutcome::Continue,
180                ScrollOutcome::Unchanged => TableOutcome::Unchanged,
181                ScrollOutcome::Changed => TableOutcome::Changed,
182            }
183        });
184
185        r
186    }
187}