diff --git a/codex-rs/tui/src/app_backtrack.rs b/codex-rs/tui/src/app_backtrack.rs index 8b3a1ed6a0..525726098b 100644 --- a/codex-rs/tui/src/app_backtrack.rs +++ b/codex-rs/tui/src/app_backtrack.rs @@ -320,7 +320,7 @@ impl App { self.backtrack.primed = true; self.backtrack.base_id = self.chat_widget.thread_id(); self.backtrack.overlay_preview_active = true; - let count = user_count(&self.transcript_cells); + let count = self.current_transcript_user_count(); if let Some(last) = count.checked_sub(1) { self.apply_backtrack_selection_internal(last); } @@ -329,7 +329,7 @@ impl App { /// Step selection to the next older user message and update overlay. fn step_backtrack_and_highlight(&mut self, tui: &mut tui::Tui) { - let count = user_count(&self.transcript_cells); + let count = self.current_transcript_user_count(); if count == 0 { return; } @@ -352,7 +352,7 @@ impl App { /// Step selection to the next newer user message and update overlay. fn step_forward_backtrack_and_highlight(&mut self, tui: &mut tui::Tui) { - let count = user_count(&self.transcript_cells); + let count = self.current_transcript_user_count(); if count == 0 { return; } @@ -373,16 +373,27 @@ impl App { /// Apply a computed backtrack selection to the overlay and internal counter. fn apply_backtrack_selection_internal(&mut self, nth_user_message: usize) { - if let Some(cell_idx) = nth_user_position(&self.transcript_cells, nth_user_message) { - self.backtrack.nth_user_message = nth_user_message; - if let Some(Overlay::Transcript(t)) = &mut self.overlay { - t.set_highlight_cell(Some(cell_idx)); - } - } else { - self.backtrack.nth_user_message = usize::MAX; - if let Some(Overlay::Transcript(t)) = &mut self.overlay { + if let Some(Overlay::Transcript(t)) = &mut self.overlay { + if t.set_highlighted_user_prompt(nth_user_message).is_some() { + self.backtrack.nth_user_message = nth_user_message; + } else { + self.backtrack.nth_user_message = usize::MAX; t.set_highlight_cell(/*cell*/ None); } + return; + } + + if nth_user_position(&self.transcript_cells, nth_user_message).is_some() { + self.backtrack.nth_user_message = nth_user_message; + } else { + self.backtrack.nth_user_message = usize::MAX; + } + } + + fn current_transcript_user_count(&self) -> usize { + match &self.overlay { + Some(Overlay::Transcript(t)) => t.user_prompt_count(), + _ => user_count(&self.transcript_cells), } } diff --git a/codex-rs/tui/src/pager_overlay.rs b/codex-rs/tui/src/pager_overlay.rs index a995cdd92f..bc53a9f042 100644 --- a/codex-rs/tui/src/pager_overlay.rs +++ b/codex-rs/tui/src/pager_overlay.rs @@ -15,7 +15,9 @@ //! recomputed. `ChatWidget` is responsible for producing a key that changes when the active cell //! mutates in place or when its transcript output is time-dependent. +use std::cell::Cell as StdCell; use std::io::Result; +use std::rc::Rc; use std::sync::Arc; use std::time::Duration; use std::time::Instant; @@ -459,17 +461,25 @@ impl Renderable for CachedRenderable { struct CellRenderable { cell: Arc, + cell_index: usize, style: Style, + selected_style: Option