don't show empty elems and mouse support
This commit is contained in:
parent
4a7817a239
commit
0457d63bd0
6 changed files with 173 additions and 41 deletions
|
|
@ -145,7 +145,12 @@ pub struct LogViewer {
|
|||
filters: Vec<Rc<Filter>>,
|
||||
|
||||
pub root_stream: Box<dyn LogStream>,
|
||||
|
||||
pub last_height: usize,
|
||||
pub last_offset: usize,
|
||||
pub last_fields_offset: usize,
|
||||
pub last_fields_height: usize,
|
||||
|
||||
pub footer_list: ListState,
|
||||
|
||||
pub input_state: InputState,
|
||||
|
|
@ -162,7 +167,12 @@ impl LogViewer {
|
|||
root_stream: stream.clone(),
|
||||
cache: HashMap::new(),
|
||||
footer_list: ListState::default(),
|
||||
|
||||
last_height: 0,
|
||||
last_offset: 0,
|
||||
last_fields_offset: 0,
|
||||
last_fields_height: 0,
|
||||
|
||||
filters: Vec::new(),
|
||||
input_state: InputState::None,
|
||||
}
|
||||
|
|
@ -326,35 +336,61 @@ impl LogViewer {
|
|||
Some((res, self.curr.selection_offset))
|
||||
}
|
||||
|
||||
pub fn click(&mut self, row: u16) {
|
||||
if row as usize >= self.last_offset {
|
||||
let row_in_list = row as usize - self.last_offset;
|
||||
if row_in_list < self.last_height {
|
||||
if self.curr.selection_offset == row_in_list {
|
||||
self.input_state = InputState::None;
|
||||
self.enter();
|
||||
} else {
|
||||
self.curr.selection_offset = row_in_list;
|
||||
self.input_state = InputState::Target(InputTarget::This);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if row as usize >= self.last_fields_offset {
|
||||
let row_in_fields = row as usize - self.last_fields_offset;
|
||||
if row_in_fields < self.last_fields_height {
|
||||
self.input_state =
|
||||
InputState::Target(InputTarget::Fields(Some(FieldMatcher::EqualTo)));
|
||||
self.footer_list.select(Some(row_in_fields));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn selected(&self) -> Option<(Rc<LogEntry>, usize)> {
|
||||
self.curr.selected()
|
||||
}
|
||||
|
||||
pub fn prev(&mut self) {
|
||||
match self.input_state {
|
||||
InputState::None => {
|
||||
InputState::Target(InputTarget::Fields(..)) => {
|
||||
self.footer_list.previous();
|
||||
self.input_state = InputState::Target(InputTarget::Fields(None));
|
||||
}
|
||||
_ => {
|
||||
if self.curr.selection_offset == 0 {
|
||||
let _ = self.curr.iter.prev();
|
||||
} else {
|
||||
self.curr.selection_offset -= 1;
|
||||
}
|
||||
self.input_state = InputState::None;
|
||||
}
|
||||
InputState::Target(InputTarget::Fields(None)) => {
|
||||
self.footer_list.previous();
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn next(&mut self) {
|
||||
match self.input_state {
|
||||
InputState::None => {
|
||||
self.curr.selection_offset += 1;
|
||||
}
|
||||
InputState::Target(InputTarget::Fields(None)) => {
|
||||
InputState::Target(InputTarget::Fields(..)) => {
|
||||
self.footer_list.next();
|
||||
self.input_state = InputState::Target(InputTarget::Fields(None));
|
||||
}
|
||||
_ => {
|
||||
self.curr.selection_offset += 1;
|
||||
self.input_state = InputState::None;
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -376,14 +412,15 @@ impl LogViewer {
|
|||
|
||||
pub fn home(&mut self) {
|
||||
match self.input_state {
|
||||
InputState::None => {
|
||||
InputState::Target(InputTarget::Fields(..)) => {
|
||||
self.footer_list.select(Some(0));
|
||||
self.input_state = InputState::Target(InputTarget::Fields(None));
|
||||
}
|
||||
_ => {
|
||||
self.curr.selection_offset = 0;
|
||||
while self.curr.iter.prev().is_some() {}
|
||||
self.input_state = InputState::None;
|
||||
}
|
||||
InputState::Target(InputTarget::Fields(None)) => {
|
||||
self.footer_list.select(Some(0));
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -409,6 +446,13 @@ impl LogViewer {
|
|||
return;
|
||||
};
|
||||
|
||||
if i.clone().next().is_none() {
|
||||
return;
|
||||
}
|
||||
if i.clone().next().is_some_and(|(i, _)| i.is_return()) {
|
||||
return;
|
||||
}
|
||||
|
||||
self.stack.push(mem::replace(
|
||||
&mut self.curr,
|
||||
LogView {
|
||||
|
|
@ -421,7 +465,8 @@ impl LogViewer {
|
|||
}
|
||||
}
|
||||
InputState::Target(InputTarget::Fields(None)) => {
|
||||
self.footer_list.next();
|
||||
self.input_state =
|
||||
InputState::Target(InputTarget::Fields(Some(FieldMatcher::EqualTo)))
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue