don't re-render ui needlessly

This commit is contained in:
Robin Appelman 2024-07-29 19:37:45 +02:00
commit 8dafab4c15
3 changed files with 45 additions and 32 deletions

View file

@ -12,7 +12,7 @@ impl TimeGraph {
let histogram = Histogram::new_with_bounds( let histogram = Histogram::new_with_bounds(
1, 1,
end.unix_timestamp() as u64 - start.unix_timestamp() as u64 + 1, end.unix_timestamp() as u64 - start.unix_timestamp() as u64 + 1,
4, 3,
) )
.unwrap(); .unwrap();
TimeGraph { TimeGraph {

View file

@ -33,11 +33,15 @@ pub fn run_ui(app: App) -> Result<(), UiError> {
let mut terminal = Terminal::new(CrosstermBackend::new(stdout()))?; let mut terminal = Terminal::new(CrosstermBackend::new(stdout()))?;
let mut ui_state = UiState::new(&app); let mut ui_state = UiState::new(&app);
let mut update = true;
while !matches!(ui_state, UiState::Quit) { while !matches!(ui_state, UiState::Quit) {
if update {
terminal.draw(|frame| ui(frame, &app, &mut ui_state))?; terminal.draw(|frame| ui(frame, &app, &mut ui_state))?;
}
update = false;
if let Some(event) = handle_events(ui_state.page())? { if let Some(event) = handle_events(ui_state.page())? {
ui_state = ui_state.process(event, &app); (update, ui_state) = ui_state.process(event, &app);
} }
} }

View file

@ -111,11 +111,11 @@ impl<'a> UiState<'a> {
} }
} }
pub fn process(self, event: UiEvent, app: &'a App) -> UiState { pub fn process(self, event: UiEvent, app: &'a App) -> (bool, UiState) {
match (self, event) { match (self, event) {
(UiState::Quit, _) => UiState::Quit, (UiState::Quit, _) => (true, UiState::Quit),
(_, UiEvent::Quit) => UiState::Quit, (_, UiEvent::Quit) => (true, UiState::Quit),
(UiState::MatchList(_), UiEvent::Back) => UiState::Quit, (UiState::MatchList(_), UiEvent::Back) => (true, UiState::Quit),
(mut state, UiEvent::Down(step)) => { (mut state, UiEvent::Down(step)) => {
let count = state.row_count(app); let count = state.row_count(app);
if let Some(table_state) = state.table_state() { if let Some(table_state) = state.table_state() {
@ -124,7 +124,7 @@ impl<'a> UiState<'a> {
*scroll_state = scroll_state.position(pos); *scroll_state = scroll_state.position(pos);
} }
} }
state (true, state)
} }
(mut state, UiEvent::Up(step)) => { (mut state, UiEvent::Up(step)) => {
let count = state.row_count(app); let count = state.row_count(app);
@ -134,7 +134,7 @@ impl<'a> UiState<'a> {
*scroll_state = scroll_state.position(pos); *scroll_state = scroll_state.position(pos);
} }
} }
state (true, state)
} }
(UiState::MatchList(state), UiEvent::Select) => { (UiState::MatchList(state), UiEvent::Select) => {
let selected = state.selected(); let selected = state.selected();
@ -148,12 +148,15 @@ impl<'a> UiState<'a> {
} else { } else {
&app.matches[selected - 1] &app.matches[selected - 1]
}; };
(
true,
UiState::Match(MatchState { UiState::Match(MatchState {
result, result,
table_state, table_state,
scroll_state: ScrollbarState::new(result.count()), scroll_state: ScrollbarState::new(result.count()),
previous: Box::new(state.into()), previous: Box::new(state.into()),
}) }),
)
} }
(UiState::Match(state), UiEvent::Select) => { (UiState::Match(state), UiEvent::Select) => {
let selected = state.selected(); let selected = state.selected();
@ -161,12 +164,15 @@ impl<'a> UiState<'a> {
table_state.select(Some(0)); table_state.select(Some(0));
let lines = state.result.grouped[selected].lines.as_slice(); let lines = state.result.grouped[selected].lines.as_slice();
(
true,
UiState::Logs(LogsState { UiState::Logs(LogsState {
lines, lines,
table_state, table_state,
scroll_state: ScrollbarState::new(lines.len()), scroll_state: ScrollbarState::new(lines.len()),
previous: Box::new(state.into()), previous: Box::new(state.into()),
}) }),
)
} }
(UiState::Logs(state), UiEvent::Select) => { (UiState::Logs(state), UiEvent::Select) => {
let selected = state.selected(); let selected = state.selected();
@ -182,13 +188,16 @@ impl<'a> UiState<'a> {
} else { } else {
0 0
}; };
(
true,
UiState::Log(LogState { UiState::Log(LogState {
log, log,
full_line, full_line,
trace_len, trace_len,
table_state, table_state,
previous: Box::new(state.into()), previous: Box::new(state.into()),
}) }),
)
} }
(UiState::Logs(state), UiEvent::Copy) => { (UiState::Logs(state), UiEvent::Copy) => {
let selected = state.selected(); let selected = state.selected();
@ -198,20 +207,20 @@ impl<'a> UiState<'a> {
let line = &app.lines[state.lines[selected]]; let line = &app.lines[state.lines[selected]];
let raw = app.get_line(line.index).unwrap_or_default(); let raw = app.get_line(line.index).unwrap_or_default();
copy_osc(raw); copy_osc(raw);
UiState::Logs(state) (false, UiState::Logs(state))
} }
(UiState::Log(state), UiEvent::Copy) => { (UiState::Log(state), UiEvent::Copy) => {
let raw = app.get_line(state.log.index).unwrap_or_default(); let raw = app.get_line(state.log.index).unwrap_or_default();
copy_osc(raw); copy_osc(raw);
UiState::Log(state) (false, UiState::Log(state))
} }
( (
UiState::Match(MatchState { previous, .. }) UiState::Match(MatchState { previous, .. })
| UiState::Logs(LogsState { previous, .. }) | UiState::Logs(LogsState { previous, .. })
| UiState::Log(LogState { previous, .. }), | UiState::Log(LogState { previous, .. }),
UiEvent::Back, UiEvent::Back,
) => *previous, ) => (true, *previous),
(state, _) => state, (state, _) => (false, state),
} }
} }
} }