# Objective The current behavior of the git panel is that when you click a file it will open the multi-buffer view that shows all files with changes. If you use CMD+Click or CTRL+Click, it will open the solo-file experience where you only see the diff of the file you have selected. But, there is no way to customize this behavior. Related to: https://github.com/zed-industries/zed/pull/56152#issuecomment-4641971669 ## Solution This MR adds a setting that allows you to customize the default click behavior. The alternate behavior will always be accessible via CMD+Click or CTRL+Click. ## Self-Review Checklist: - [X] I've reviewed my own diff for quality, security, and reliability - [X] Unsafe blocks (if any) have justifying comments - [X] The content adheres to Zed's UI standards ([UX/UI](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist) and [icon](https://github.com/zed-industries/zed/blob/main/crates/icons/README.md) guidelines) - [X] Tests cover the new/changed behavior - [X] Performance impact has been considered and is acceptable --- Release Notes: - Added a setting to control default click behavior for git panel files --------- Co-authored-by: Christopher Biscardi <chris@christopherbiscardi.com>
90 lines
3.3 KiB
Rust
90 lines
3.3 KiB
Rust
use editor::{EditorSettings, ui_scrollbar_settings_from_raw};
|
|
use gpui::Pixels;
|
|
use schemars::JsonSchema;
|
|
use serde::{Deserialize, Serialize};
|
|
use settings::{
|
|
GitPanelClickBehavior, GitPanelGroupBy, GitPanelSortBy, RegisterSetting, Settings, StatusStyle,
|
|
};
|
|
use ui::{
|
|
px,
|
|
scrollbars::{ScrollbarVisibility, ShowScrollbar},
|
|
};
|
|
use workspace::dock::DockPosition;
|
|
|
|
#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)]
|
|
pub struct ScrollbarSettings {
|
|
pub show: Option<ShowScrollbar>,
|
|
}
|
|
|
|
#[derive(Debug, Clone, PartialEq, RegisterSetting)]
|
|
pub struct GitPanelSettings {
|
|
pub button: bool,
|
|
pub dock: DockPosition,
|
|
pub default_width: Pixels,
|
|
pub status_style: StatusStyle,
|
|
pub file_icons: bool,
|
|
pub folder_icons: bool,
|
|
pub scrollbar: ScrollbarSettings,
|
|
pub fallback_branch_name: String,
|
|
pub sort_by: GitPanelSortBy,
|
|
pub group_by: GitPanelGroupBy,
|
|
pub collapse_untracked_diff: bool,
|
|
pub tree_view: bool,
|
|
pub diff_stats: bool,
|
|
pub show_count_badge: bool,
|
|
pub starts_open: bool,
|
|
pub commit_title_max_length: usize,
|
|
pub entry_primary_click_action: GitPanelClickBehavior,
|
|
}
|
|
|
|
#[derive(Default)]
|
|
pub(crate) struct GitPanelScrollbarAccessor;
|
|
|
|
impl ScrollbarVisibility for GitPanelScrollbarAccessor {
|
|
fn visibility(&self, cx: &ui::App) -> ShowScrollbar {
|
|
// TODO: This PR should have defined Editor's `scrollbar.axis`
|
|
// as an Option<ScrollbarAxis>, not a ScrollbarAxes as it would allow you to
|
|
// `.unwrap_or(EditorSettings::get_global(cx).scrollbar.show)`.
|
|
//
|
|
// Once this is fixed we can extend the GitPanelSettings with a `scrollbar.axis`
|
|
// so we can show each axis based on the settings.
|
|
//
|
|
// We should fix this. PR: https://github.com/zed-industries/zed/pull/19495
|
|
GitPanelSettings::get_global(cx)
|
|
.scrollbar
|
|
.show
|
|
.unwrap_or_else(|| EditorSettings::get_global(cx).scrollbar.show)
|
|
}
|
|
}
|
|
|
|
impl Settings for GitPanelSettings {
|
|
fn from_settings(content: &settings::SettingsContent) -> Self {
|
|
let git_panel = content.git_panel.clone().unwrap();
|
|
Self {
|
|
button: git_panel.button.unwrap(),
|
|
dock: git_panel.dock.unwrap().into(),
|
|
default_width: px(git_panel.default_width.unwrap()),
|
|
status_style: git_panel.status_style.unwrap(),
|
|
file_icons: git_panel.file_icons.unwrap(),
|
|
folder_icons: git_panel.folder_icons.unwrap(),
|
|
scrollbar: ScrollbarSettings {
|
|
show: git_panel
|
|
.scrollbar
|
|
.unwrap()
|
|
.show
|
|
.map(ui_scrollbar_settings_from_raw),
|
|
},
|
|
fallback_branch_name: git_panel.fallback_branch_name.unwrap(),
|
|
sort_by: git_panel.sort_by.unwrap(),
|
|
group_by: git_panel.group_by.unwrap(),
|
|
collapse_untracked_diff: git_panel.collapse_untracked_diff.unwrap(),
|
|
tree_view: git_panel.tree_view.unwrap(),
|
|
diff_stats: git_panel.diff_stats.unwrap(),
|
|
show_count_badge: git_panel.show_count_badge.unwrap(),
|
|
starts_open: git_panel.starts_open.unwrap(),
|
|
commit_title_max_length: git_panel.commit_title_max_length.unwrap(),
|
|
entry_primary_click_action: git_panel.entry_primary_click_action.unwrap(),
|
|
}
|
|
}
|
|
}
|