mirror of
https://codeberg.org/icewind/logsmash.git
synced 2026-06-03 10:04:12 +02:00
split out input code
This commit is contained in:
parent
7f575659a5
commit
589f695497
3 changed files with 92 additions and 88 deletions
86
src/ui/input.rs
Normal file
86
src/ui/input.rs
Normal file
|
|
@ -0,0 +1,86 @@
|
|||
use crate::ui::find_hit_row;
|
||||
use crate::ui::state::{Mode, UiPage, UiState};
|
||||
use ratatui::crossterm::event;
|
||||
use ratatui::crossterm::event::{Event, KeyCode, KeyModifiers, MouseButton, MouseEventKind};
|
||||
use std::io;
|
||||
use std::time::Duration;
|
||||
|
||||
pub enum UiEvent {
|
||||
Quit,
|
||||
Back,
|
||||
Up(usize, bool),
|
||||
Down(usize, bool),
|
||||
Scroll(isize),
|
||||
Errors,
|
||||
Select,
|
||||
#[allow(dead_code)]
|
||||
SelectAt(usize),
|
||||
Enter(usize),
|
||||
Copy,
|
||||
EnterFilterMode,
|
||||
ClearFilter,
|
||||
Text(char),
|
||||
PopText(PopMode),
|
||||
}
|
||||
|
||||
pub enum PopMode {
|
||||
Character,
|
||||
Word,
|
||||
}
|
||||
|
||||
pub fn handle_events(page: UiPage, ui_state: &UiState) -> io::Result<Option<UiEvent>> {
|
||||
if event::poll(Duration::from_millis(50))? {
|
||||
match event::read()? {
|
||||
Event::Key(key) if key.kind == event::KeyEventKind::Press => {
|
||||
return Ok(match (ui_state.mode(), key.code) {
|
||||
(_, KeyCode::Char('c')) if key.modifiers == KeyModifiers::CONTROL => {
|
||||
Some(UiEvent::Quit)
|
||||
}
|
||||
(Mode::Normal, KeyCode::Esc) => Some(UiEvent::Back),
|
||||
|
||||
(Mode::Normal, KeyCode::Char('q')) => Some(UiEvent::Quit),
|
||||
(Mode::Normal, KeyCode::Char('e')) if page == UiPage::MatchList => {
|
||||
Some(UiEvent::Errors)
|
||||
}
|
||||
(_, KeyCode::Left) if page != UiPage::MatchList => Some(UiEvent::Back),
|
||||
(_, KeyCode::Down) => Some(UiEvent::Down(1, true)),
|
||||
(_, KeyCode::Up) => Some(UiEvent::Up(1, true)),
|
||||
(_, KeyCode::PageDown) => Some(UiEvent::Down(10, false)),
|
||||
(_, KeyCode::PageUp) => Some(UiEvent::Up(10, false)),
|
||||
(_, KeyCode::End) => Some(UiEvent::Down(usize::MAX, false)),
|
||||
(_, KeyCode::Home) => Some(UiEvent::Up(usize::MAX, false)),
|
||||
(_, KeyCode::Enter | KeyCode::Right) => Some(UiEvent::Select),
|
||||
(Mode::Normal, KeyCode::Char('c')) => Some(UiEvent::Copy),
|
||||
(Mode::Normal, KeyCode::F(4) | KeyCode::Char('f')) => {
|
||||
Some(UiEvent::EnterFilterMode)
|
||||
}
|
||||
|
||||
(Mode::FilterInput, KeyCode::Esc) => Some(UiEvent::ClearFilter),
|
||||
(Mode::FilterInput, KeyCode::F(4)) => Some(UiEvent::Back),
|
||||
(Mode::FilterInput, KeyCode::Backspace) => {
|
||||
Some(UiEvent::PopText(PopMode::Character))
|
||||
}
|
||||
(Mode::FilterInput, KeyCode::Char('w'))
|
||||
if key.modifiers == KeyModifiers::CONTROL =>
|
||||
{
|
||||
Some(UiEvent::PopText(PopMode::Word))
|
||||
}
|
||||
(Mode::FilterInput, KeyCode::Char(c)) => Some(UiEvent::Text(c)),
|
||||
_ => None,
|
||||
});
|
||||
}
|
||||
Event::Mouse(mouse) => {
|
||||
return Ok(match mouse.kind {
|
||||
MouseEventKind::ScrollUp => Some(UiEvent::Scroll(-1)),
|
||||
MouseEventKind::ScrollDown => Some(UiEvent::Scroll(1)),
|
||||
MouseEventKind::Down(MouseButton::Left) => {
|
||||
find_hit_row(mouse.row, ui_state).map(UiEvent::Enter)
|
||||
}
|
||||
_ => None,
|
||||
})
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
Ok(None)
|
||||
}
|
||||
|
|
@ -4,32 +4,29 @@ use crate::ui::error_list::error_list;
|
|||
use crate::ui::footer::footer;
|
||||
use crate::ui::grouped_logs::grouped_logs;
|
||||
use crate::ui::histogram::UiHistogram;
|
||||
use crate::ui::input::handle_events;
|
||||
use crate::ui::match_list::match_list;
|
||||
use crate::ui::single_log::single_log;
|
||||
use crate::ui::single_match::grouped_lines;
|
||||
use crate::ui::state::{
|
||||
ErrorState, GroupedLogsState, LogState, MatchListState, MatchState, Mode, PopMode, UiEvent,
|
||||
UiPage, UiState,
|
||||
};
|
||||
use ratatui::crossterm::event::{
|
||||
DisableMouseCapture, EnableMouseCapture, Event, KeyCode, KeyModifiers, MouseButton,
|
||||
MouseEventKind,
|
||||
ErrorState, GroupedLogsState, LogState, MatchListState, MatchState, UiState,
|
||||
};
|
||||
use ratatui::crossterm::event::{DisableMouseCapture, EnableMouseCapture};
|
||||
use ratatui::crossterm::terminal::{
|
||||
disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen,
|
||||
};
|
||||
use ratatui::crossterm::{event, ExecutableCommand};
|
||||
use ratatui::crossterm::ExecutableCommand;
|
||||
use ratatui::prelude::*;
|
||||
use ratatui::Terminal;
|
||||
use std::io;
|
||||
use std::io::stdout;
|
||||
use std::panic::{set_hook, take_hook};
|
||||
use std::time::Duration;
|
||||
|
||||
mod error_list;
|
||||
mod footer;
|
||||
mod grouped_logs;
|
||||
mod histogram;
|
||||
mod input;
|
||||
mod match_list;
|
||||
mod single_log;
|
||||
mod single_match;
|
||||
|
|
@ -81,63 +78,6 @@ pub fn restore_tui() -> io::Result<()> {
|
|||
Ok(())
|
||||
}
|
||||
|
||||
fn handle_events(page: UiPage, ui_state: &UiState) -> io::Result<Option<UiEvent>> {
|
||||
if event::poll(Duration::from_millis(50))? {
|
||||
match event::read()? {
|
||||
Event::Key(key) if key.kind == event::KeyEventKind::Press => {
|
||||
return Ok(match (ui_state.mode(), key.code) {
|
||||
(_, KeyCode::Char('c')) if key.modifiers == KeyModifiers::CONTROL => {
|
||||
Some(UiEvent::Quit)
|
||||
}
|
||||
(Mode::Normal, KeyCode::Esc) => Some(UiEvent::Back),
|
||||
|
||||
(Mode::Normal, KeyCode::Char('q')) => Some(UiEvent::Quit),
|
||||
(Mode::Normal, KeyCode::Char('e')) if page == UiPage::MatchList => {
|
||||
Some(UiEvent::Errors)
|
||||
}
|
||||
(_, KeyCode::Left) if page != UiPage::MatchList => Some(UiEvent::Back),
|
||||
(_, KeyCode::Down) => Some(UiEvent::Down(1, true)),
|
||||
(_, KeyCode::Up) => Some(UiEvent::Up(1, true)),
|
||||
(_, KeyCode::PageDown) => Some(UiEvent::Down(10, false)),
|
||||
(_, KeyCode::PageUp) => Some(UiEvent::Up(10, false)),
|
||||
(_, KeyCode::End) => Some(UiEvent::Down(usize::MAX, false)),
|
||||
(_, KeyCode::Home) => Some(UiEvent::Up(usize::MAX, false)),
|
||||
(_, KeyCode::Enter | KeyCode::Right) => Some(UiEvent::Select),
|
||||
(Mode::Normal, KeyCode::Char('c')) => Some(UiEvent::Copy),
|
||||
(Mode::Normal, KeyCode::F(4) | KeyCode::Char('f')) => {
|
||||
Some(UiEvent::EnterFilterMode)
|
||||
}
|
||||
|
||||
(Mode::FilterInput, KeyCode::Esc) => Some(UiEvent::ClearFilter),
|
||||
(Mode::FilterInput, KeyCode::F(4)) => Some(UiEvent::Back),
|
||||
(Mode::FilterInput, KeyCode::Backspace) => {
|
||||
Some(UiEvent::PopText(PopMode::Character))
|
||||
}
|
||||
(Mode::FilterInput, KeyCode::Char('w'))
|
||||
if key.modifiers == KeyModifiers::CONTROL =>
|
||||
{
|
||||
Some(UiEvent::PopText(PopMode::Word))
|
||||
}
|
||||
(Mode::FilterInput, KeyCode::Char(c)) => Some(UiEvent::Text(c)),
|
||||
_ => None,
|
||||
});
|
||||
}
|
||||
Event::Mouse(mouse) => {
|
||||
return Ok(match mouse.kind {
|
||||
MouseEventKind::ScrollUp => Some(UiEvent::Scroll(-1)),
|
||||
MouseEventKind::ScrollDown => Some(UiEvent::Scroll(1)),
|
||||
MouseEventKind::Down(MouseButton::Left) => {
|
||||
find_hit_row(mouse.row, ui_state).map(UiEvent::Enter)
|
||||
}
|
||||
_ => None,
|
||||
})
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
Ok(None)
|
||||
}
|
||||
|
||||
fn find_hit_row(row: u16, ui_state: &UiState) -> Option<usize> {
|
||||
if let Some(table_row) = row.checked_sub(ui_state.content_offset()) {
|
||||
let selected = ui_state.index_for_row(table_row as usize);
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
use crate::app::{App, Filter, LogMatch, EMPTY_FILTER};
|
||||
use crate::logline::{FullLogLine, LogLine};
|
||||
use crate::ui::footer::FooterParams;
|
||||
use crate::ui::input::{PopMode, UiEvent};
|
||||
use crate::ui::table::ScrollbarTableState;
|
||||
use crate::ui::UI_HEADER_SIZE;
|
||||
use crate::{copy_osc, parse_line_full};
|
||||
|
|
@ -481,29 +482,6 @@ impl<'a> UiState<'a> {
|
|||
}
|
||||
}
|
||||
|
||||
pub enum UiEvent {
|
||||
Quit,
|
||||
Back,
|
||||
Up(usize, bool),
|
||||
Down(usize, bool),
|
||||
Scroll(isize),
|
||||
Errors,
|
||||
Select,
|
||||
#[allow(dead_code)]
|
||||
SelectAt(usize),
|
||||
Enter(usize),
|
||||
Copy,
|
||||
EnterFilterMode,
|
||||
ClearFilter,
|
||||
Text(char),
|
||||
PopText(PopMode),
|
||||
}
|
||||
|
||||
pub enum PopMode {
|
||||
Character,
|
||||
Word,
|
||||
}
|
||||
|
||||
#[derive(PartialEq)]
|
||||
pub enum UiPage {
|
||||
MatchList,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue