Allow scrolling while finding

This commit is contained in:
Joshua Barretto 2025-10-31 19:33:10 +00:00
parent 4cff90da73
commit 2737c44d41

View file

@ -48,16 +48,21 @@ impl Doc {
} }
impl Element for Doc { impl Element for Doc {
fn handle(&mut self, state: &mut State, event: Event) -> Result<Resp, Event> { fn handle(&mut self, state: &mut State, mut event: Event) -> Result<Resp, Event> {
let cursor_id = self.cursors[&self.buffer]; let cursor_id = self.cursors[&self.buffer];
if let Some(finder) = &mut self.finder { if let Some(finder) = &mut self.finder {
let resp = finder.handle(state, &mut self.input, self.buffer, cursor_id, event)?; let resp = finder.handle(state, &mut self.input, self.buffer, cursor_id, event);
event = match resp {
Ok(resp) => {
if resp.is_end() { if resp.is_end() {
self.finder = None; self.finder = None;
} }
return Ok(Resp::handled(resp.event)); return Ok(Resp::handled(resp.event));
} }
Err(event) => event,
}
}
let Some(buffer) = state.buffers.get_mut(self.buffer) else { let Some(buffer) = state.buffers.get_mut(self.buffer) else {
return Err(event); return Err(event);
@ -248,6 +253,7 @@ impl Finder {
}; };
this.update(state, input, buffer_id, cursor_id); this.update(state, input, buffer_id, cursor_id);
this.refocus_selected(&mut state.buffers[buffer_id], input, cursor_id);
this this
} }
@ -288,7 +294,9 @@ impl Finder {
.find(|i| self.results[*i] >= self.old_cursor.pos) .find(|i| self.results[*i] >= self.old_cursor.pos)
.unwrap_or(0); .unwrap_or(0);
} }
}
fn refocus_selected(&mut self, buffer: &mut Buffer, input: &mut Input, cursor_id: CursorId) {
if let Some(result) = self.results.get(self.selected) { if let Some(result) = self.results.get(self.selected) {
buffer.cursors[cursor_id].select(*result..*result + self.needle.len()); buffer.cursors[cursor_id].select(*result..*result + self.needle.len());
input.refocus(buffer, cursor_id); input.refocus(buffer, cursor_id);
@ -323,6 +331,7 @@ impl Finder {
Dir::Down => self.selected = (self.selected + 1) % self.results.len().max(1), Dir::Down => self.selected = (self.selected + 1) % self.results.len().max(1),
_ => {} _ => {}
} }
self.refocus_selected(buffer, input, cursor_id);
Ok(Resp::handled(None)) Ok(Resp::handled(None))
} }
_ => self _ => self