wip
This commit is contained in:
@@ -3,6 +3,7 @@ mod point;
|
||||
mod text;
|
||||
|
||||
pub use anchor::*;
|
||||
use futures_core::future::LocalBoxFuture;
|
||||
pub use point::*;
|
||||
pub use text::*;
|
||||
|
||||
@@ -14,7 +15,7 @@ use crate::{
|
||||
worktree::FileHandle,
|
||||
};
|
||||
use anyhow::{anyhow, Result};
|
||||
use gpui::{AppContext, Entity, ModelContext, Task};
|
||||
use gpui::{AppContext, Entity, ModelContext};
|
||||
use lazy_static::lazy_static;
|
||||
use rand::prelude::*;
|
||||
use std::{
|
||||
@@ -243,23 +244,25 @@ impl Buffer {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn save(&mut self, ctx: &mut ModelContext<Self>) -> Option<Task<Result<()>>> {
|
||||
pub fn save(&mut self, ctx: &mut ModelContext<Self>) -> LocalBoxFuture<'static, Result<()>> {
|
||||
if let Some(file) = &self.file {
|
||||
let snapshot = self.snapshot();
|
||||
|
||||
let result = file.save(snapshot, ctx.app());
|
||||
|
||||
// TODO - don't do this until the save has finished
|
||||
self.did_save(ctx);
|
||||
|
||||
Some(result)
|
||||
let version = self.version.clone();
|
||||
let save_task = file.save(snapshot, ctx.app());
|
||||
let task = ctx.spawn(save_task, |me, save_result, ctx| {
|
||||
if save_result.is_ok() {
|
||||
me.did_save(version, ctx);
|
||||
}
|
||||
save_result
|
||||
});
|
||||
Box::pin(task)
|
||||
} else {
|
||||
None
|
||||
Box::pin(async { Ok(()) })
|
||||
}
|
||||
}
|
||||
|
||||
fn did_save(&mut self, ctx: &mut ModelContext<Buffer>) {
|
||||
self.persisted_version = self.fragments.summary().max_version;
|
||||
fn did_save(&mut self, version: time::Global, ctx: &mut ModelContext<Buffer>) {
|
||||
self.persisted_version = version;
|
||||
ctx.emit(Event::Saved);
|
||||
}
|
||||
|
||||
@@ -429,7 +432,7 @@ impl Buffer {
|
||||
ctx.notify();
|
||||
let changes = self.edits_since(old_version).collect::<Vec<_>>();
|
||||
if !changes.is_empty() {
|
||||
ctx.emit(Event::Edited(changes))
|
||||
self.did_edit(changes, ctx);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -447,6 +450,10 @@ impl Buffer {
|
||||
Ok(ops)
|
||||
}
|
||||
|
||||
fn did_edit(&self, changes: Vec<Edit>, ctx: &mut ModelContext<Self>) {
|
||||
ctx.emit(Event::Edited(changes))
|
||||
}
|
||||
|
||||
pub fn simulate_typing<T: Rng>(&mut self, rng: &mut T) {
|
||||
let end = rng.gen_range(0..self.len() + 1);
|
||||
let start = rng.gen_range(0..end + 1);
|
||||
|
||||
@@ -5,12 +5,13 @@ use super::{
|
||||
use crate::{
|
||||
settings::Settings,
|
||||
watch,
|
||||
workspace::{self, ItemEventEffect},
|
||||
workspace::{self, WorkspaceEvent},
|
||||
};
|
||||
use anyhow::Result;
|
||||
use futures_core::future::LocalBoxFuture;
|
||||
use gpui::{
|
||||
fonts::Properties as FontProperties, keymap::Binding, text_layout, App, AppContext, Element,
|
||||
ElementBox, Entity, FontCache, ModelHandle, Task, View, ViewContext, WeakViewHandle,
|
||||
ElementBox, Entity, FontCache, ModelHandle, View, ViewContext, WeakViewHandle,
|
||||
};
|
||||
use gpui::{geometry::vector::Vector2F, TextLayoutCache};
|
||||
use parking_lot::Mutex;
|
||||
@@ -1152,11 +1153,11 @@ impl workspace::Item for Buffer {
|
||||
}
|
||||
|
||||
impl workspace::ItemView for BufferView {
|
||||
fn event_effect(event: &Self::Event) -> ItemEventEffect {
|
||||
fn to_workspace_event(event: &Self::Event) -> Option<WorkspaceEvent> {
|
||||
match event {
|
||||
Event::Activate => ItemEventEffect::Activate,
|
||||
Event::Edited => ItemEventEffect::ChangeTab,
|
||||
_ => ItemEventEffect::None,
|
||||
Event::Activate => Some(WorkspaceEvent::Activate),
|
||||
Event::Saved => Some(WorkspaceEvent::TabStateChanged),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1184,7 +1185,7 @@ impl workspace::ItemView for BufferView {
|
||||
Some(clone)
|
||||
}
|
||||
|
||||
fn save(&self, ctx: &mut ViewContext<Self>) -> Option<Task<Result<()>>> {
|
||||
fn save(&self, ctx: &mut ViewContext<Self>) -> LocalBoxFuture<'static, Result<()>> {
|
||||
self.buffer.update(ctx, |buffer, ctx| buffer.save(ctx))
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user