diff --git a/crates/git_ui/src/git_panel.rs b/crates/git_ui/src/git_panel.rs index b816976557c5542192b7c7275fe2669977babccc..d558d21d2e8287338b4171d8057d3fdfdee69232 100644 --- a/crates/git_ui/src/git_panel.rs +++ b/crates/git_ui/src/git_panel.rs @@ -90,6 +90,8 @@ actions!( FocusChanges, /// Toggles automatic co-author suggestions. ToggleFillCoAuthors, + /// Toggles sorting entries by path vs status. + ToggleSortByPath, ] ); @@ -118,6 +120,7 @@ struct GitMenuState { has_staged_changes: bool, has_unstaged_changes: bool, has_new_changes: bool, + sort_by_path: bool, } fn git_panel_context_menu( @@ -159,6 +162,16 @@ fn git_panel_context_menu( "Trash Untracked Files", TrashUntrackedFiles.boxed_clone(), ) + .separator() + .entry( + if state.sort_by_path { + "Sort by Status" + } else { + "Sort by Path" + }, + Some(Box::new(ToggleSortByPath)), + move |window, cx| window.dispatch_action(Box::new(ToggleSortByPath), cx), + ) }) } @@ -2547,6 +2560,24 @@ impl GitPanel { cx.notify(); } + fn toggle_sort_by_path( + &mut self, + _: &ToggleSortByPath, + _: &mut Window, + cx: &mut Context, + ) { + let current_setting = GitPanelSettings::get_global(cx).sort_by_path; + if let Some(workspace) = self.workspace.upgrade() { + let workspace = workspace.read(cx); + let fs = workspace.app_state().fs.clone(); + cx.update_global::(|store, _cx| { + store.update_settings_file::(fs, move |settings, _cx| { + settings.sort_by_path = Some(!current_setting); + }); + }); + } + } + fn fill_co_authors(&mut self, message: &mut String, cx: &mut Context) { const CO_AUTHOR_PREFIX: &str = "Co-authored-by: "; @@ -3081,6 +3112,7 @@ impl GitPanel { has_staged_changes, has_unstaged_changes, has_new_changes, + sort_by_path: GitPanelSettings::get_global(cx).sort_by_path, }, window, cx, @@ -4133,6 +4165,7 @@ impl GitPanel { has_staged_changes: self.has_staged_changes(), has_unstaged_changes: self.has_unstaged_changes(), has_new_changes: self.new_count > 0, + sort_by_path: GitPanelSettings::get_global(cx).sort_by_path, }, window, cx, @@ -4546,6 +4579,7 @@ impl Render for GitPanel { .when(has_write_access && has_co_authors, |git_panel| { git_panel.on_action(cx.listener(Self::toggle_fill_co_authors)) }) + .on_action(cx.listener(Self::toggle_sort_by_path)) .on_hover(cx.listener(move |this, hovered, window, cx| { if *hovered { this.horizontal_scrollbar.show(cx);