diff --git a/crates/git_ui/src/git_panel.rs b/crates/git_ui/src/git_panel.rs index a68bb3092e2984b0556eafa323ffd032d7d8155c..b177bc1aa044f201e6b3b2646ced3ad5df338dfe 100644 --- a/crates/git_ui/src/git_panel.rs +++ b/crates/git_ui/src/git_panel.rs @@ -16,7 +16,6 @@ use project::git::RepositoryHandle; use project::{Fs, Project, ProjectPath}; use serde::{Deserialize, Serialize}; use settings::Settings as _; -use std::sync::atomic::{AtomicBool, Ordering}; use std::{collections::HashSet, ops::Range, path::PathBuf, sync::Arc, time::Duration, usize}; use theme::ThemeSettings; use ui::{ @@ -91,7 +90,7 @@ pub struct GitPanel { scrollbar_state: ScrollbarState, selected_entry: Option, show_scrollbar: bool, - rebuild_requested: Arc, + update_visible_entries_task: Task<()>, commit_editor: View, visible_entries: Vec, all_staged: Option, @@ -167,33 +166,11 @@ impl GitPanel { let scroll_handle = UniformListScrollHandle::new(); - let rebuild_requested = Arc::new(AtomicBool::new(false)); - let flag = rebuild_requested.clone(); - let handle = cx.view().downgrade(); - cx.spawn(|_, mut cx| async move { - loop { - cx.background_executor().timer(UPDATE_DEBOUNCE).await; - if flag.load(Ordering::Relaxed) { - if let Some(this) = handle.upgrade() { - this.update(&mut cx, |this, cx| { - this.update_visible_entries(cx); - let active_repository = this.active_repository.as_ref(); - this.commit_editor = - cx.new_view(|cx| commit_message_editor(active_repository, cx)); - }) - .ok(); - } - flag.store(false, Ordering::Relaxed); - } - } - }) - .detach(); - if let Some(git_state) = git_state { cx.subscribe(&git_state, move |this, git_state, event, cx| match event { project::git::Event::RepositoriesUpdated => { this.active_repository = git_state.read(cx).active_repository(); - this.schedule_update(); + this.schedule_update(cx); } }) .detach(); @@ -210,16 +187,16 @@ impl GitPanel { selected_entry: None, show_scrollbar: false, hide_scrollbar_task: None, + update_visible_entries_task: Task::ready(()), active_repository, scroll_handle, fs, - rebuild_requested, commit_editor, project, err_sender, workspace, }; - git_panel.schedule_update(); + git_panel.schedule_update(cx); git_panel.show_scrollbar = git_panel.should_show_scrollbar(cx); git_panel }); @@ -689,8 +666,20 @@ impl GitPanel { } } - fn schedule_update(&mut self) { - self.rebuild_requested.store(true, Ordering::Relaxed); + fn schedule_update(&mut self, cx: &mut ViewContext) { + let handle = cx.view().downgrade(); + self.update_visible_entries_task = cx.spawn(|_, mut cx| async move { + cx.background_executor().timer(UPDATE_DEBOUNCE).await; + if let Some(this) = handle.upgrade() { + this.update(&mut cx, |this, cx| { + this.update_visible_entries(cx); + let active_repository = this.active_repository.as_ref(); + this.commit_editor = + cx.new_view(|cx| commit_message_editor(active_repository, cx)); + }) + .ok(); + } + }); } fn update_visible_entries(&mut self, cx: &mut ViewContext) {