repl: Make output buffer be readonly, never dirty (#17121)

This commit is contained in:
Kyle Kelley 2024-08-29 18:22:28 -07:00 committed by GitHub
parent 6646b15f29
commit 02cd5128c7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 37 additions and 11 deletions

View file

@ -844,7 +844,13 @@ impl Item for Editor {
.unwrap_or_default(), .unwrap_or_default(),
) )
.map(|path| path.to_string_lossy().to_string()) .map(|path| path.to_string_lossy().to_string())
.unwrap_or_else(|| "untitled".to_string()) .unwrap_or_else(|| {
if multibuffer.is_singleton() {
multibuffer.title(cx).to_string()
} else {
"untitled".to_string()
}
})
}); });
let settings = ThemeSettings::get_global(cx); let settings = ThemeSettings::get_global(cx);

View file

@ -1591,12 +1591,13 @@ impl Buffer {
/// Checks if the buffer has unsaved changes. /// Checks if the buffer has unsaved changes.
pub fn is_dirty(&self) -> bool { pub fn is_dirty(&self) -> bool {
self.has_conflict self.capability != Capability::ReadOnly
&& (self.has_conflict
|| self.has_unsaved_edits() || self.has_unsaved_edits()
|| self || self
.file .file
.as_ref() .as_ref()
.map_or(false, |file| file.is_deleted() || !file.is_created()) .map_or(false, |file| file.is_deleted() || !file.is_created()))
} }
/// Checks if the buffer and its file have both changed since the buffer /// Checks if the buffer and its file have both changed since the buffer

View file

@ -35,7 +35,7 @@
use std::time::Duration; use std::time::Duration;
use editor::Editor; use editor::{Editor, MultiBuffer};
use gpui::{ use gpui::{
percentage, Animation, AnimationExt, AnyElement, ClipboardItem, Model, Render, Transformation, percentage, Animation, AnimationExt, AnyElement, ClipboardItem, Model, Render, Transformation,
View, WeakView, View, WeakView,
@ -176,7 +176,18 @@ impl Output {
if let Some(buffer_content) = buffer_content.as_ref() { if let Some(buffer_content) = buffer_content.as_ref() {
let buffer = buffer_content.clone(); let buffer = buffer_content.clone();
let editor = Box::new(cx.new_view(|cx| { let editor = Box::new(cx.new_view(|cx| {
Editor::for_buffer(buffer.clone(), None, cx) let multibuffer = cx.new_model(|cx| {
let mut multi_buffer =
MultiBuffer::singleton(buffer.clone(), cx);
multi_buffer.set_title("REPL Output".to_string(), cx);
multi_buffer
});
let editor =
Editor::for_multibuffer(multibuffer, None, false, cx);
editor
})); }));
workspace workspace
.update(cx, |workspace, cx| { .update(cx, |workspace, cx| {
@ -195,6 +206,7 @@ impl Output {
fn render( fn render(
&self, &self,
workspace: WeakView<Workspace>, workspace: WeakView<Workspace>,
cx: &mut ViewContext<ExecutionView>, cx: &mut ViewContext<ExecutionView>,
) -> impl IntoElement { ) -> impl IntoElement {

View file

@ -58,7 +58,10 @@ impl OutputContent for MarkdownView {
fn buffer_content(&mut self, cx: &mut WindowContext) -> Option<Model<Buffer>> { fn buffer_content(&mut self, cx: &mut WindowContext) -> Option<Model<Buffer>> {
let buffer = cx.new_model(|cx| { let buffer = cx.new_model(|cx| {
// todo!(): Bring in the language registry so we can set the language to markdown // todo!(): Bring in the language registry so we can set the language to markdown
Buffer::local(self.raw_text.clone(), cx).with_language(language::PLAIN_TEXT.clone(), cx) let mut buffer = Buffer::local(self.raw_text.clone(), cx)
.with_language(language::PLAIN_TEXT.clone(), cx);
buffer.set_capability(language::Capability::ReadOnly, cx);
buffer
}); });
Some(buffer) Some(buffer)
} }

View file

@ -328,8 +328,12 @@ impl OutputContent for TerminalOutput {
} }
let buffer = cx.new_model(|cx| { let buffer = cx.new_model(|cx| {
Buffer::local(self.full_text(), cx).with_language(language::PLAIN_TEXT.clone(), cx) let mut buffer =
Buffer::local(self.full_text(), cx).with_language(language::PLAIN_TEXT.clone(), cx);
buffer.set_capability(language::Capability::ReadOnly, cx);
buffer
}); });
self.full_buffer = Some(buffer.clone()); self.full_buffer = Some(buffer.clone());
Some(buffer) Some(buffer)
} }