Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion crates/collab/src/tests/integration_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6746,7 +6746,11 @@ async fn test_preview_tabs(cx: &mut TestAppContext) {

// Split pane to the right
pane.update(cx, |pane, cx| {
pane.split(workspace::SplitDirection::Right, cx);
pane.split(
workspace::SplitDirection::Right,
&workspace::SplitBehavior::default(),
cx,
);
});

let right_pane = workspace.read_with(cx, |workspace, _| workspace.active_pane().clone());
Expand Down
15 changes: 9 additions & 6 deletions crates/file_finder/src/file_finder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,8 @@ use util::{
rel_path::RelPath,
};
use workspace::{
ModalView, OpenOptions, OpenVisible, SplitDirection, Workspace, item::PreviewTabsSettings,
notifications::NotifyResultExt, pane,
ModalView, OpenOptions, OpenVisible, SplitDirection, Workspace,
item::PreviewTabsSettings, notifications::NotifyResultExt, pane,
};

actions!(
Expand Down Expand Up @@ -1732,16 +1732,19 @@ impl PickerDelegate for FileFinderDelegate {
menu.context(focus_handle)
.action(
"Split Left",
pane::SplitLeft.boxed_clone(),
pane::SplitLeft::default().boxed_clone(),
)
.action(
"Split Right",
pane::SplitRight.boxed_clone(),
pane::SplitRight::default().boxed_clone(),
)
.action(
"Split Up",
pane::SplitUp::default().boxed_clone(),
)
.action("Split Up", pane::SplitUp.boxed_clone())
.action(
"Split Down",
pane::SplitDown.boxed_clone(),
pane::SplitDown::default().boxed_clone(),
)
}
}))
Expand Down
139 changes: 82 additions & 57 deletions crates/terminal_view/src/terminal_panel.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,9 @@ use util::{ResultExt, TryFutureExt};
use workspace::{
ActivateNextPane, ActivatePane, ActivatePaneDown, ActivatePaneLeft, ActivatePaneRight,
ActivatePaneUp, ActivatePreviousPane, DraggedSelection, DraggedTab, ItemId, MoveItemToPane,
MoveItemToPaneInDirection, NewTerminal, Pane, PaneGroup, SplitDirection, SplitDown, SplitLeft,
SplitRight, SplitUp, SwapPaneDown, SwapPaneLeft, SwapPaneRight, SwapPaneUp, ToggleZoom,
Workspace,
MoveItemToPaneInDirection, NewTerminal, Pane, PaneGroup, SplitBehavior, SplitDirection,
SplitDown, SplitLeft, SplitRight, SplitUp, SwapPaneDown, SwapPaneLeft, SwapPaneRight,
SwapPaneUp, ToggleZoom, Workspace,
dock::{DockPosition, Panel, PanelEvent, PanelHandle},
item::SerializableItem,
move_active_item, move_item, pane,
Expand Down Expand Up @@ -193,10 +193,10 @@ impl TerminalPanel {
split_context.clone(),
|menu, split_context| menu.context(split_context),
)
.action("Split Right", SplitRight.boxed_clone())
.action("Split Left", SplitLeft.boxed_clone())
.action("Split Up", SplitUp.boxed_clone())
.action("Split Down", SplitDown.boxed_clone())
.action("Split Right", SplitRight::default().boxed_clone())
.action("Split Left", SplitLeft::default().boxed_clone())
.action("Split Up", SplitUp::default().boxed_clone())
.action("Split Down", SplitDown::default().boxed_clone())
})
.into()
}
Expand Down Expand Up @@ -384,42 +384,53 @@ impl TerminalPanel {
}
&pane::Event::Split {
direction,
clone_active_item,
ref behavior,
} => {
if clone_active_item {
let fut = self.new_pane_with_cloned_active_terminal(window, cx);
let pane = pane.clone();
cx.spawn_in(window, async move |panel, cx| {
let Some(new_pane) = fut.await else {
match behavior {
// TODO not exactly clear what we expect in terminal panes when splitting with
// Empty? Assuming not cloning for now.
SplitBehavior::Clone | SplitBehavior::Empty => {
let clone = match behavior {
SplitBehavior::Clone => true,
SplitBehavior::Empty => false,
_ => unreachable!(),
};
let fut = self.new_pane_with_active_terminal(window, cx, clone);
let pane = pane.clone();
cx.spawn_in(window, async move |panel, cx| {
let Some(new_pane) = fut.await else {
return;
};
panel
.update_in(cx, |panel, window, cx| {
panel.center.split(&pane, &new_pane, direction).log_err();
window.focus(&new_pane.focus_handle(cx));
})
.ok();
})
.detach();
}
SplitBehavior::Move => {
let Some(item) =
pane.update(cx, |pane, cx| pane.take_active_item(window, cx))
else {
return;
};
panel
.update_in(cx, |panel, window, cx| {
panel.center.split(&pane, &new_pane, direction).log_err();
window.focus(&new_pane.focus_handle(cx));
})
.ok();
})
.detach();
} else {
let Some(item) = pane.update(cx, |pane, cx| pane.take_active_item(window, cx))
else {
return;
};
let Ok(project) = self
.workspace
.update(cx, |workspace, _| workspace.project().clone())
else {
return;
};
let new_pane =
new_terminal_pane(self.workspace.clone(), project, false, window, cx);
new_pane.update(cx, |pane, cx| {
pane.add_item(item, true, true, None, window, cx);
});
self.center.split(&pane, &new_pane, direction).log_err();
window.focus(&new_pane.focus_handle(cx));
}
let Ok(project) = self
.workspace
.update(cx, |workspace, _| workspace.project().clone())
else {
return;
};
let new_pane =
new_terminal_pane(self.workspace.clone(), project, false, window, cx);
new_pane.update(cx, |pane, cx| {
pane.add_item(item, true, true, None, window, cx);
});
self.center.split(&pane, &new_pane, direction).log_err();
window.focus(&new_pane.focus_handle(cx));
}
};
}
pane::Event::Focus => {
self.active_pane = pane.clone();
Expand All @@ -432,10 +443,11 @@ impl TerminalPanel {
}
}

fn new_pane_with_cloned_active_terminal(
fn new_pane_with_active_terminal(
&mut self,
window: &mut Window,
cx: &mut Context<Self>,
clone: bool,
) -> Task<Option<Entity<Pane>>> {
let Some(workspace) = self.workspace.upgrade() else {
return Task::ready(None);
Expand All @@ -445,21 +457,34 @@ impl TerminalPanel {
let weak_workspace = self.workspace.clone();
let project = workspace.project().clone();
let active_pane = &self.active_pane;
let terminal_view = active_pane
.read(cx)
.active_item()
.and_then(|item| item.downcast::<TerminalView>());
let working_directory = terminal_view
.as_ref()
.and_then(|terminal_view| {
terminal_view
.read(cx)
.terminal()
.read(cx)
.working_directory()
})
.or_else(|| default_working_directory(workspace, cx));
let is_zoomed = active_pane.read(cx).is_zoomed();
let terminal_view = if clone {
active_pane
.read(cx)
.active_item()
.and_then(|item| item.downcast::<TerminalView>())
} else {
None
};
let working_directory = if clone {
terminal_view
.as_ref()
.and_then(|terminal_view| {
terminal_view
.read(cx)
.terminal()
.read(cx)
.working_directory()
})
.or_else(|| default_working_directory(workspace, cx))
} else {
default_working_directory(workspace, cx)
};

let is_zoomed = if clone {
active_pane.read(cx).is_zoomed()
} else {
false
};
cx.spawn_in(window, async move |panel, cx| {
let terminal = project
.update(cx, |project, cx| match terminal_view {
Expand Down Expand Up @@ -1368,7 +1393,7 @@ impl Render for TerminalPanel {
window.focus(&pane.read(cx).focus_handle(cx));
} else {
let future =
terminal_panel.new_pane_with_cloned_active_terminal(window, cx);
terminal_panel.new_pane_with_active_terminal(window, cx, true);
cx.spawn_in(window, async move |terminal_panel, cx| {
if let Some(new_pane) = future.await {
_ = terminal_panel.update_in(
Expand Down
4 changes: 2 additions & 2 deletions crates/vim/src/command.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1164,7 +1164,7 @@ fn generate_commands(_: &App) -> Vec<VimCommand> {
save_intent: Some(SaveIntent::Overwrite),
}),
VimCommand::new(("cq", "uit"), zed_actions::Quit),
VimCommand::new(("sp", "lit"), workspace::SplitHorizontal).args(|_, args| {
VimCommand::new(("sp", "lit"), workspace::SplitHorizontal::default()).args(|_, args| {
Some(
VimSplit {
vertical: false,
Expand All @@ -1173,7 +1173,7 @@ fn generate_commands(_: &App) -> Vec<VimCommand> {
.boxed_clone(),
)
}),
VimCommand::new(("vs", "plit"), workspace::SplitVertical).args(|_, args| {
VimCommand::new(("vs", "plit"), workspace::SplitVertical::default()).args(|_, args| {
Some(
VimSplit {
vertical: true,
Expand Down
Loading
Loading