diff --git a/core/src/buffer.rs b/core/src/buffer.rs index 11cdadff..a8ddba3f 100644 --- a/core/src/buffer.rs +++ b/core/src/buffer.rs @@ -511,6 +511,7 @@ fn apply_delta( ) { self.rev += 1; self.dirty = true; + ui_state.dirty = true; let (iv, newlen) = delta.summary(); let old_logical_end_line = self.rope.line_of_offset(iv.end) + 1; let old_logical_end_offset = self.rope.offset_of_line(old_logical_end_line); diff --git a/core/src/editor.rs b/core/src/editor.rs index 9c445560..13335cc3 100644 --- a/core/src/editor.rs +++ b/core/src/editor.rs @@ -923,6 +923,7 @@ pub fn open_file( let editor = self.editors.get_mut(&self.active).unwrap(); editor.buffer_id = Some(buffer_id.clone()); editor.selection = Selection::caret(offset); + ui_state.get_editor_mut(&self.active).buffer_id = buffer_id.clone(); ctx.submit_command(Command::new( LAPCE_UI_COMMAND, LapceUICommand::ForceScrollTo(view_offset.x, view_offset.y), @@ -1246,6 +1247,7 @@ pub fn fill_text_layouts( let buffer_ui = Arc::make_mut(Arc::make_mut(&mut data.buffers).get_mut(buffer_id)?); let buffer = self.buffers.get_mut(buffer_id)?; + buffer_ui.dirty = buffer.dirty; let line_height = env.get(LapceTheme::EDITOR_LINE_HEIGHT); let start_line = (offset.y / line_height) as usize; let size = ctx.size(); @@ -1616,6 +1618,34 @@ pub fn apply_edits_and_save( } } } + let editor = self.editors.get_mut(&self.active)?; + let buffer_id = editor.buffer_id.clone()?; + let buffer = self.buffers.get_mut(&buffer_id)?; + let state = LAPCE_APP_STATE.get_tab_state(&self.window_id, &self.tab_id); + let window_id = self.window_id; + let tab_id = self.tab_id; + println!("send save"); + state.proxy.lock().as_ref().unwrap().save( + buffer.rev, + buffer.id, + Box::new(move |result| { + println!("got save result {:?}", result); + if let Ok(r) = result { + let state = LAPCE_APP_STATE.get_tab_state(&window_id, &tab_id); + let mut editor_split = state.editor_split.lock(); + let buffer = editor_split.buffers.get_mut(&buffer_id).unwrap(); + buffer.dirty = false; + for (view_id, editor) in editor_split.editors.iter() { + if editor.buffer_id.as_ref() == Some(&buffer_id) { + LAPCE_APP_STATE.submit_ui_command( + LapceUICommand::FillTextLayouts, + view_id.clone(), + ); + } + } + } + }), + ); None } @@ -1629,7 +1659,6 @@ pub fn apply_edits( let editor = self.editors.get_mut(&self.active)?; let buffer_id = editor.buffer_id.clone()?; let buffer = self.buffers.get_mut(&buffer_id)?; - let buffer_ui_state = ui_state.get_buffer_mut(&buffer_id); if buffer.rev != rev { return None; } @@ -1643,6 +1672,8 @@ pub fn apply_edits( (selection, edit.new_text.clone()) }) .collect(); + + let buffer_ui_state = ui_state.get_buffer_mut(&buffer_id); buffer.edit_multiple( ctx, buffer_ui_state, @@ -2344,6 +2375,9 @@ pub fn run_command( let editor = self.editors.get_mut(&self.active)?; let buffer_id = editor.buffer_id.clone()?; let buffer = self.buffers.get_mut(&buffer_id)?; + if !buffer.dirty { + return None; + } let window_id = self.window_id; let tab_id = self.tab_id; let rev = buffer.rev; @@ -2359,6 +2393,7 @@ pub fn run_command( .get_document_formatting( buffer.id, Box::new(move |result| { + println!("get document formating"); let result = match result { Ok(r) => Ok(r), Err(e) => Err(anyhow!("{:?}", e)), @@ -2384,12 +2419,12 @@ pub fn run_command( // } // } - let buffer_ui_state = ui_state.get_buffer_mut(&buffer_id); - let buffer = self.buffers.get_mut(&buffer_id)?; - if let Err(e) = buffer.save() { - println!("buffer save error {}", e); - } - buffer_ui_state.dirty = buffer.dirty; + // let buffer_ui_state = ui_state.get_buffer_mut(&buffer_id); + // let buffer = self.buffers.get_mut(&buffer_id)?; + // if let Err(e) = buffer.save() { + // println!("buffer save error {}", e); + // } + // buffer_ui_state.dirty = buffer.dirty; // LAPCE_APP_STATE // .get_tab_state(&self.window_id, &self.tab_id) // .lsp @@ -2514,13 +2549,6 @@ fn update( ) { let editor = data.get_editor(&self.view_id); let old_editor = old_data.get_editor(&self.view_id); - let cursor = editor.cursor; - let old_cursor = old_editor.cursor; - - if cursor.0 != old_cursor.0 { - ctx.request_paint(); - return; - } if editor.buffer_id != old_editor.buffer_id { ctx.request_paint(); @@ -2870,6 +2898,7 @@ fn update( ) { self.editor.update(ctx, data, env); self.gutter.update(ctx, data, env); + self.header.update(ctx, data, env); // self.update(ctx, old_data, data, env); } diff --git a/core/src/proxy.rs b/core/src/proxy.rs index aa2dde43..cb2b990c 100644 --- a/core/src/proxy.rs +++ b/core/src/proxy.rs @@ -70,6 +70,7 @@ pub fn save(&self, rev: u64, buffer_id: BufferId, f: Box) { self.peer.send_rpc_request_async( "save", &json!({ + "rev": rev, "buffer_id": buffer_id, }), f, diff --git a/proxy/src/dispatch.rs b/proxy/src/dispatch.rs index 1b9526a8..5ec778ce 100644 --- a/proxy/src/dispatch.rs +++ b/proxy/src/dispatch.rs @@ -240,6 +240,7 @@ fn handle_request(&self, id: RequestId, rpc: Request) { self.lsp.lock().get_document_formatting(id, buffer); } Request::Save { rev, buffer_id } => { + eprintln!("receive save"); let buffers = self.buffers.lock(); let buffer = buffers.get(&buffer_id).unwrap(); self.respond(id, buffer.save(rev).map(|r| json!({}))); diff --git a/src/font.rs b/src/font.rs index 9f558178..710d6896 100644 --- a/src/font.rs +++ b/src/font.rs @@ -6,10 +6,10 @@ pub struct LapceFont { impl LapceFont { pub fn new(font_name: &str, size: f64) { - let font = - FontDescriptor::new(FontFamily::new_unchecked("Cascadia Code")) - .with_size(size); + let font = FontDescriptor::new(FontFamily::new_unchecked("Cascadia Code")) + .with_size(size); let mut text_layout = TextLayout::new("W"); + text_layout.set_font(font.clone()); } }