@@ -4030,6 +4030,13 @@ impl ThreadView {
.w_full()
.text_ui(cx)
.child(self.render_message_context_menu(entry_ix, message_body, cx))
+ .when_some(
+ self.entry_view_state
+ .read(cx)
+ .entry(entry_ix)
+ .and_then(|entry| entry.focus_handle(cx)),
+ |this, handle| this.track_focus(&handle),
+ )
.into_any()
}
}
@@ -227,7 +227,10 @@ impl EntryViewState {
} else {
self.set_entry(
index,
- Entry::AssistantMessage(AssistantMessageEntry::default()),
+ Entry::AssistantMessage(AssistantMessageEntry {
+ scroll_handles_by_chunk_index: HashMap::default(),
+ focus_handle: cx.focus_handle(),
+ }),
);
let Some(Entry::AssistantMessage(entry)) = self.entries.get_mut(index) else {
unreachable!()
@@ -291,9 +294,10 @@ pub enum ViewEvent {
},
}
-#[derive(Default, Debug)]
+#[derive(Debug)]
pub struct AssistantMessageEntry {
scroll_handles_by_chunk_index: HashMap<usize, ScrollHandle>,
+ focus_handle: FocusHandle,
}
impl AssistantMessageEntry {
@@ -326,7 +330,8 @@ impl Entry {
pub fn focus_handle(&self, cx: &App) -> Option<FocusHandle> {
match self {
Self::UserMessage(editor) => Some(editor.read(cx).focus_handle(cx)),
- Self::AssistantMessage(_) | Self::ToolCall(_) => None,
+ Self::AssistantMessage(message) => Some(message.focus_handle.clone()),
+ Self::ToolCall(_) => None,
}
}