diff --git a/assets/icons/diff_split.svg b/assets/icons/diff_split.svg
index de2056466f7ef1081ee00dabb8b4d5baa8fc9217..dcafeb8df5c28bcac1f1fe8cf5783eebd8d8cd8a 100644
--- a/assets/icons/diff_split.svg
+++ b/assets/icons/diff_split.svg
@@ -1,5 +1,4 @@
diff --git a/assets/icons/diff_split_auto.svg b/assets/icons/diff_split_auto.svg
new file mode 100644
index 0000000000000000000000000000000000000000..f9dd7076be75aaf3e90286140a60deece5016114
--- /dev/null
+++ b/assets/icons/diff_split_auto.svg
@@ -0,0 +1,7 @@
+
diff --git a/assets/icons/diff_unified.svg b/assets/icons/diff_unified.svg
index b2d3895ae5466454e9cefc4e77e3c3f2a19cde8c..28735c16f682159b6b0a099176d6fc3b75cd248e 100644
--- a/assets/icons/diff_unified.svg
+++ b/assets/icons/diff_unified.svg
@@ -1,4 +1,4 @@
diff --git a/crates/icons/src/icons.rs b/crates/icons/src/icons.rs
index 6929ae4e4ca8ca0ee00c9793c948892043dd6dd6..e29b7d3593025556771d62dc0124786672c540de 100644
--- a/crates/icons/src/icons.rs
+++ b/crates/icons/src/icons.rs
@@ -95,6 +95,7 @@ pub enum IconName {
DebugStepOver,
Diff,
DiffSplit,
+ DiffSplitAuto,
DiffUnified,
Disconnected,
Download,
diff --git a/crates/search/src/buffer_search.rs b/crates/search/src/buffer_search.rs
index 93fbab59a6f1b9da0cb9faf0657fc4a1c5f679bd..2ea386b85df21a72262b70eb7016028a49c2b8c0 100644
--- a/crates/search/src/buffer_search.rs
+++ b/crates/search/src/buffer_search.rs
@@ -114,81 +114,23 @@ impl Render for BufferSearchBar {
.map(|splittable_editor| {
let editor_ref = splittable_editor.read(cx);
let diff_view_style = editor_ref.diff_view_style();
- let is_split = editor_ref.is_split();
+
+ let is_split_set = diff_view_style == DiffViewStyle::Split;
+ let is_split_active = editor_ref.is_split();
let min_columns =
EditorSettings::get_global(cx).minimum_split_diff_width as u32;
- let mut split_button = IconButton::new("diff-split", IconName::DiffSplit)
- .shape(IconButtonShape::Square)
- .tooltip(Tooltip::element(move |_, cx| {
- let message = if min_columns == 0 {
- SharedString::from("Split")
- } else {
- format!("Split when wider than {} columns", min_columns).into()
- };
-
- v_flex()
- .child(message)
- .child(
- h_flex()
- .gap_0p5()
- .text_ui_sm(cx)
- .text_color(Color::Muted.color(cx))
- .children(render_modifiers(
- &gpui::Modifiers::secondary_key(),
- PlatformStyle::platform(),
- None,
- Some(TextSize::Small.rems(cx).into()),
- false,
- ))
- .child("click to change min width"),
- )
- .into_any()
- }))
- .on_click({
- let splittable_editor = splittable_editor.downgrade();
- move |_, window, cx| {
- if window.modifiers().secondary() {
- window.dispatch_action(
- OpenSettingsAt {
- path: "minimum_split_diff_width".to_string(),
- }
- .boxed_clone(),
- cx,
- );
- } else {
- update_settings_file(
- ::global(cx),
- cx,
- |settings, _| {
- settings.editor.diff_view_style =
- Some(DiffViewStyle::Split);
- },
- );
- if diff_view_style == DiffViewStyle::Unified {
- splittable_editor
- .update(cx, |editor, cx| {
- editor.toggle_split(&ToggleSplitDiff, window, cx);
- })
- .ok();
- }
- }
- }
- });
-
- if diff_view_style == DiffViewStyle::Split {
- if !is_split {
- split_button = split_button.icon_color(Color::Disabled)
- } else {
- split_button = split_button.toggle_state(true)
- }
- }
+ let split_icon = if is_split_set && !is_split_active {
+ IconName::DiffSplitAuto
+ } else {
+ IconName::DiffSplit
+ };
h_flex()
.gap_1()
.child(
IconButton::new("diff-unified", IconName::DiffUnified)
- .shape(IconButtonShape::Square)
+ .icon_size(IconSize::Small)
.toggle_state(diff_view_style == DiffViewStyle::Unified)
.tooltip(Tooltip::text("Unified"))
.on_click({
@@ -216,7 +158,71 @@ impl Render for BufferSearchBar {
}
}),
)
- .child(split_button)
+ .child(
+ IconButton::new("diff-split", split_icon)
+ .toggle_state(diff_view_style == DiffViewStyle::Split)
+ .icon_size(IconSize::Small)
+ .tooltip(Tooltip::element(move |_, cx| {
+ let message = if is_split_set && !is_split_active {
+ format!("Split when wider than {} columns", min_columns)
+ .into()
+ } else {
+ SharedString::from("Split")
+ };
+
+ v_flex()
+ .child(message)
+ .child(
+ h_flex()
+ .gap_0p5()
+ .text_ui_sm(cx)
+ .text_color(Color::Muted.color(cx))
+ .children(render_modifiers(
+ &gpui::Modifiers::secondary_key(),
+ PlatformStyle::platform(),
+ None,
+ Some(TextSize::Small.rems(cx).into()),
+ false,
+ ))
+ .child("click to change min width"),
+ )
+ .into_any()
+ }))
+ .on_click({
+ let splittable_editor = splittable_editor.downgrade();
+ move |_, window, cx| {
+ if window.modifiers().secondary() {
+ window.dispatch_action(
+ OpenSettingsAt {
+ path: "minimum_split_diff_width".to_string(),
+ }
+ .boxed_clone(),
+ cx,
+ );
+ } else {
+ update_settings_file(
+ ::global(cx),
+ cx,
+ |settings, _| {
+ settings.editor.diff_view_style =
+ Some(DiffViewStyle::Split);
+ },
+ );
+ if diff_view_style == DiffViewStyle::Unified {
+ splittable_editor
+ .update(cx, |editor, cx| {
+ editor.toggle_split(
+ &ToggleSplitDiff,
+ window,
+ cx,
+ );
+ })
+ .ok();
+ }
+ }
+ }
+ }),
+ )
})
} else {
None
@@ -240,7 +246,7 @@ impl Render for BufferSearchBar {
let collapse_expand_icon_button = |id| {
IconButton::new(id, icon)
- .shape(IconButtonShape::Square)
+ .icon_size(IconSize::Small)
.tooltip(move |_, cx| {
Tooltip::for_action_in(
tooltip_label,