open new buffer (#11203)
Release Notes: - Allow creating new untitled buffers in remote projects TODO: - Add a Test - Fix version number check
This commit is contained in:
parent
28bcc95468
commit
3752ed294d
19 changed files with 276 additions and 111 deletions
|
@ -665,6 +665,7 @@ impl Project {
|
|||
client.add_model_request_handler(Self::handle_open_buffer_for_symbol);
|
||||
client.add_model_request_handler(Self::handle_open_buffer_by_id);
|
||||
client.add_model_request_handler(Self::handle_open_buffer_by_path);
|
||||
client.add_model_request_handler(Self::handle_open_new_buffer);
|
||||
client.add_model_request_handler(Self::handle_save_buffer);
|
||||
client.add_model_message_handler(Self::handle_update_diff_base);
|
||||
client.add_model_request_handler(Self::handle_lsp_command::<lsp_ext_command::ExpandMacro>);
|
||||
|
@ -1955,21 +1956,41 @@ impl Project {
|
|||
!self.is_local()
|
||||
}
|
||||
|
||||
pub fn create_buffer(
|
||||
pub fn create_buffer(&mut self, cx: &mut ModelContext<Self>) -> Task<Result<Model<Buffer>>> {
|
||||
if self.is_remote() {
|
||||
let create = self.client.request(proto::OpenNewBuffer {
|
||||
project_id: self.remote_id().unwrap(),
|
||||
});
|
||||
cx.spawn(|this, mut cx| async move {
|
||||
let response = create.await?;
|
||||
let buffer_id = BufferId::new(response.buffer_id)?;
|
||||
|
||||
this.update(&mut cx, |this, cx| {
|
||||
this.wait_for_remote_buffer(buffer_id, cx)
|
||||
})?
|
||||
.await
|
||||
})
|
||||
} else {
|
||||
Task::ready(Ok(self.create_local_buffer("", None, cx)))
|
||||
}
|
||||
}
|
||||
|
||||
pub fn create_local_buffer(
|
||||
&mut self,
|
||||
text: &str,
|
||||
language: Option<Arc<Language>>,
|
||||
cx: &mut ModelContext<Self>,
|
||||
) -> Result<Model<Buffer>> {
|
||||
) -> Model<Buffer> {
|
||||
if self.is_remote() {
|
||||
return Err(anyhow!("creating buffers as a guest is not supported yet"));
|
||||
panic!("called create_local_buffer on a remote project")
|
||||
}
|
||||
let buffer = cx.new_model(|cx| {
|
||||
Buffer::local(text, cx)
|
||||
.with_language(language.unwrap_or_else(|| language::PLAIN_TEXT.clone()), cx)
|
||||
});
|
||||
self.register_buffer(&buffer, cx)?;
|
||||
Ok(buffer)
|
||||
self.register_buffer(&buffer, cx)
|
||||
.expect("creating local buffers always succeeds");
|
||||
buffer
|
||||
}
|
||||
|
||||
pub fn open_path(
|
||||
|
@ -9415,6 +9436,18 @@ impl Project {
|
|||
Project::respond_to_open_buffer_request(this, buffer, peer_id, &mut cx)
|
||||
}
|
||||
|
||||
async fn handle_open_new_buffer(
|
||||
this: Model<Self>,
|
||||
envelope: TypedEnvelope<proto::OpenNewBuffer>,
|
||||
_: Arc<Client>,
|
||||
mut cx: AsyncAppContext,
|
||||
) -> Result<proto::OpenBufferResponse> {
|
||||
let buffer = this.update(&mut cx, |this, cx| this.create_local_buffer("", None, cx))?;
|
||||
let peer_id = envelope.original_sender_id()?;
|
||||
|
||||
Project::respond_to_open_buffer_request(this, buffer, peer_id, &mut cx)
|
||||
}
|
||||
|
||||
fn respond_to_open_buffer_request(
|
||||
this: Model<Self>,
|
||||
buffer: Model<Buffer>,
|
||||
|
|
|
@ -2931,9 +2931,7 @@ async fn test_save_as(cx: &mut gpui::TestAppContext) {
|
|||
let languages = project.update(cx, |project, _| project.languages().clone());
|
||||
languages.add(rust_lang());
|
||||
|
||||
let buffer = project.update(cx, |project, cx| {
|
||||
project.create_buffer("", None, cx).unwrap()
|
||||
});
|
||||
let buffer = project.update(cx, |project, cx| project.create_local_buffer("", None, cx));
|
||||
buffer.update(cx, |buffer, cx| {
|
||||
buffer.edit([(0..0, "abc")], None, cx);
|
||||
assert!(buffer.is_dirty());
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue