tab_switcher: Add support for tab switcher in assistant panel (#15475)
Additionally, I've generalized the implementation of tab switcher so that - instead of explicitly listing panels it supports (at the time of writing it was just the terminal panel and nothing else), it now relies on Panel::pane trait method. As long as that's implemented, you get a tab switcher support for free. Release Notes: - Added support for tab switcher in Assistant panel.
This commit is contained in:
parent
0540291204
commit
530feecdaa
6 changed files with 35 additions and 32 deletions
1
Cargo.lock
generated
1
Cargo.lock
generated
|
@ -10760,7 +10760,6 @@ dependencies = [
|
|||
"project",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"terminal_view",
|
||||
"theme",
|
||||
"ui",
|
||||
"util",
|
||||
|
|
|
@ -686,13 +686,11 @@ impl AssistantPanel {
|
|||
.focus_handle(cx)
|
||||
.contains_focused(cx)
|
||||
{
|
||||
if let Some(terminal_view) = terminal_panel
|
||||
.read(cx)
|
||||
.pane()
|
||||
.read(cx)
|
||||
.active_item()
|
||||
.and_then(|t| t.downcast::<TerminalView>())
|
||||
{
|
||||
if let Some(terminal_view) = terminal_panel.read(cx).pane().and_then(|pane| {
|
||||
pane.read(cx)
|
||||
.active_item()
|
||||
.and_then(|t| t.downcast::<TerminalView>())
|
||||
}) {
|
||||
return Some(InlineAssistTarget::Terminal(terminal_view));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,7 +9,7 @@ use gpui::{AppContext, Task, WeakView};
|
|||
use language::{CodeLabel, LspAdapterDelegate};
|
||||
use terminal_view::{terminal_panel::TerminalPanel, TerminalView};
|
||||
use ui::prelude::*;
|
||||
use workspace::Workspace;
|
||||
use workspace::{dock::Panel, Workspace};
|
||||
|
||||
use super::create_label_for_command;
|
||||
|
||||
|
@ -65,13 +65,11 @@ impl SlashCommand for TermSlashCommand {
|
|||
let Some(terminal_panel) = workspace.read(cx).panel::<TerminalPanel>(cx) else {
|
||||
return Task::ready(Err(anyhow::anyhow!("no terminal panel open")));
|
||||
};
|
||||
let Some(active_terminal) = terminal_panel
|
||||
.read(cx)
|
||||
.pane()
|
||||
.read(cx)
|
||||
.active_item()
|
||||
.and_then(|t| t.downcast::<TerminalView>())
|
||||
else {
|
||||
let Some(active_terminal) = terminal_panel.read(cx).pane().and_then(|pane| {
|
||||
pane.read(cx)
|
||||
.active_item()
|
||||
.and_then(|t| t.downcast::<TerminalView>())
|
||||
}) else {
|
||||
return Task::ready(Err(anyhow::anyhow!("no active terminal")));
|
||||
};
|
||||
|
||||
|
|
|
@ -18,7 +18,6 @@ gpui.workspace = true
|
|||
menu.workspace = true
|
||||
picker.workspace = true
|
||||
serde.workspace = true
|
||||
terminal_view.workspace = true
|
||||
ui.workspace = true
|
||||
util.workspace = true
|
||||
workspace.workspace = true
|
||||
|
|
|
@ -57,16 +57,25 @@ impl TabSwitcher {
|
|||
}
|
||||
|
||||
fn open(action: &Toggle, workspace: &mut Workspace, cx: &mut ViewContext<Workspace>) {
|
||||
let terminal = workspace.panel::<terminal_view::terminal_panel::TerminalPanel>(cx);
|
||||
let terminal_pane = terminal.and_then(|terminal| {
|
||||
terminal
|
||||
.focus_handle(cx)
|
||||
.contains_focused(cx)
|
||||
.then(|| terminal.read(cx).pane())
|
||||
});
|
||||
let weak_pane = terminal_pane
|
||||
.unwrap_or_else(|| workspace.active_pane())
|
||||
.downgrade();
|
||||
let mut weak_pane = workspace.active_pane().downgrade();
|
||||
for dock in [
|
||||
workspace.left_dock(),
|
||||
workspace.bottom_dock(),
|
||||
workspace.right_dock(),
|
||||
] {
|
||||
dock.update(cx, |this, cx| {
|
||||
let Some(panel) = this
|
||||
.active_panel()
|
||||
.filter(|panel| panel.focus_handle(cx).contains_focused(cx))
|
||||
else {
|
||||
return;
|
||||
};
|
||||
if let Some(pane) = panel.pane(cx) {
|
||||
weak_pane = pane.downgrade();
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
workspace.toggle_modal(cx, |cx| {
|
||||
let delegate = TabSwitcherDelegate::new(action, cx.view().downgrade(), weak_pane, cx);
|
||||
TabSwitcher::new(delegate, cx)
|
||||
|
|
|
@ -171,7 +171,7 @@ impl TerminalPanel {
|
|||
|
||||
fn apply_tab_bar_buttons(&self, cx: &mut ViewContext<Self>) {
|
||||
let additional_buttons = self.additional_tab_bar_buttons.clone();
|
||||
self.pane().update(cx, |pane, cx| {
|
||||
self.pane.update(cx, |pane, cx| {
|
||||
pane.set_render_tab_bar_buttons(cx, move |pane, cx| {
|
||||
h_flex()
|
||||
.gap_2()
|
||||
|
@ -683,10 +683,6 @@ impl TerminalPanel {
|
|||
Some(())
|
||||
}
|
||||
|
||||
pub fn pane(&self) -> &View<Pane> {
|
||||
&self.pane
|
||||
}
|
||||
|
||||
fn has_no_terminals(&self, cx: &WindowContext) -> bool {
|
||||
self.pane.read(cx).items_len() == 0 && self.pending_terminals_to_add == 0
|
||||
}
|
||||
|
@ -849,6 +845,10 @@ impl Panel for TerminalPanel {
|
|||
fn toggle_action(&self) -> Box<dyn gpui::Action> {
|
||||
Box::new(ToggleFocus)
|
||||
}
|
||||
|
||||
fn pane(&self) -> Option<View<Pane>> {
|
||||
Some(self.pane.clone())
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize)]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue