tui: share text element rebasing helper

This commit is contained in:
Charles Cunningham
2026-03-02 16:14:52 -08:00
parent d7e52bc3b2
commit 0409dfeea4
2 changed files with 41 additions and 26 deletions
+31 -16
View File
@@ -785,6 +785,21 @@ pub(crate) fn create_initial_user_message(
}
}
fn append_text_with_rebased_elements(
target_text: &mut String,
target_text_elements: &mut Vec<TextElement>,
text: &str,
text_elements: impl IntoIterator<Item = TextElement>,
) {
let offset = target_text.len();
target_text.push_str(text);
target_text_elements.extend(text_elements.into_iter().map(|mut element| {
element.byte_range.start += offset;
element.byte_range.end += offset;
element
}));
}
// When merging multiple queued drafts (e.g., after interrupt), each draft starts numbering
// its attachments at [Image #1]. Reassign placeholder labels based on the attachment list so
// the combined local_image_paths order matches the labels, even if placeholders were moved
@@ -1954,7 +1969,6 @@ impl ChatWidget {
remote_image_urls: Vec::new(),
mention_bindings: Vec::new(),
};
let mut combined_offset = 0usize;
let total_remote_images = to_merge
.iter()
.map(|message| message.remote_image_urls.len())
@@ -1964,22 +1978,23 @@ impl ChatWidget {
for (idx, message) in to_merge.into_iter().enumerate() {
if idx > 0 {
combined.text.push('\n');
combined_offset += 1;
}
let message = remap_placeholders_for_message(message, &mut next_image_label);
let base = combined_offset;
combined.text.push_str(&message.text);
combined_offset += message.text.len();
combined
.text_elements
.extend(message.text_elements.into_iter().map(|mut elem| {
elem.byte_range.start += base;
elem.byte_range.end += base;
elem
}));
combined.local_images.extend(message.local_images);
combined.remote_image_urls.extend(message.remote_image_urls);
combined.mention_bindings.extend(message.mention_bindings);
let UserMessage {
text,
text_elements,
local_images,
remote_image_urls,
mention_bindings,
} = remap_placeholders_for_message(message, &mut next_image_label);
append_text_with_rebased_elements(
&mut combined.text,
&mut combined.text_elements,
&text,
text_elements,
);
combined.local_images.extend(local_images);
combined.remote_image_urls.extend(remote_image_urls);
combined.mention_bindings.extend(mention_bindings);
}
Some(combined)
+10 -10
View File
@@ -100,17 +100,17 @@ impl ChatWidget {
UserInput::Text {
text,
text_elements: current_text_elements,
} => {
let offset = message.len();
for element in current_text_elements {
text_elements.push(TextElement::new(
(offset + element.byte_range.start..offset + element.byte_range.end)
.into(),
} => append_text_with_rebased_elements(
&mut message,
&mut text_elements,
text,
current_text_elements.iter().map(|element| {
TextElement::new(
element.byte_range,
element.placeholder(text).map(str::to_string),
));
}
message.push_str(text);
}
)
}),
),
UserInput::Image { image_url } => remote_image_urls.push(image_url.clone()),
UserInput::LocalImage { path } => local_images.push(path.clone()),
UserInput::Skill { .. } | UserInput::Mention { .. } => {}