diff --git a/crates/ui2/src/components/status_bar.rs b/crates/ui2/src/components/status_bar.rs index 335c73d5ac..73fc048b46 100644 --- a/crates/ui2/src/components/status_bar.rs +++ b/crates/ui2/src/components/status_bar.rs @@ -166,7 +166,24 @@ impl StatusBar { .flex() .items_center() .gap_1() - .child(IconButton::new(Icon::Terminal)) + .child(IconButton::new(Icon::Terminal).on_click(|_, cx| { + let workspace_state = get_workspace_state(); + + let is_showing_terminal = + workspace_state.show_terminal.load(Ordering::SeqCst); + + workspace_state + .show_terminal + .compare_exchange( + is_showing_terminal, + !is_showing_terminal, + Ordering::SeqCst, + Ordering::SeqCst, + ) + .unwrap(); + + cx.notify(); + })) .child(IconButton::new(Icon::MessageBubbles).on_click(|_, cx| { let workspace_state = get_workspace_state(); diff --git a/crates/ui2/src/components/workspace.rs b/crates/ui2/src/components/workspace.rs index a0afa5d493..dced9107e8 100644 --- a/crates/ui2/src/components/workspace.rs +++ b/crates/ui2/src/components/workspace.rs @@ -16,6 +16,7 @@ use crate::{ pub struct WorkspaceState { pub show_project_panel: Arc, pub show_chat_panel: Arc, + pub show_terminal: Arc, pub show_language_selector: Arc, } @@ -27,6 +28,7 @@ pub fn get_workspace_state() -> &'static WorkspaceState { let state = WORKSPACE_STATE.get_or_init(|| WorkspaceState { show_project_panel: Arc::new(AtomicBool::new(true)), show_chat_panel: Arc::new(AtomicBool::new(true)), + show_terminal: Arc::new(AtomicBool::new(true)), show_language_selector: Arc::new(AtomicBool::new(false)), }); @@ -168,14 +170,17 @@ impl WorkspaceElement { .h_px() .child(root_group), ) - .child( - Panel::new( - self.bottom_panel_scroll_state.clone(), - |_, _| vec![Terminal::new().into_any()], - Box::new(()), + .children( + Some( + Panel::new( + self.bottom_panel_scroll_state.clone(), + |_, _| vec![Terminal::new().into_any()], + Box::new(()), + ) + .allowed_sides(PanelAllowedSides::BottomOnly) + .side(PanelSide::Bottom), ) - .allowed_sides(PanelAllowedSides::BottomOnly) - .side(PanelSide::Bottom), + .filter(|_| workspace_state.show_terminal.load(Ordering::SeqCst)), ), ) .children(