diff --git a/crates/ui2/src/components/workspace.rs b/crates/ui2/src/components/workspace.rs index ef3546ac18e3340f1e4a86956b0b9b799a120083..7163d66985192fb6596fb5309e992feab670b8ea 100644 --- a/crates/ui2/src/components/workspace.rs +++ b/crates/ui2/src/components/workspace.rs @@ -1,9 +1,9 @@ use std::marker::PhantomData; use std::sync::atomic::{AtomicBool, Ordering}; -use std::sync::Arc; +use std::sync::{Arc, OnceLock}; use chrono::DateTime; -use gpui3::{relative, rems, Size}; +use gpui3::{px, relative, rems, Size}; use crate::prelude::*; use crate::{ @@ -13,6 +13,22 @@ use crate::{ TitleBar, Toast, ToastOrigin, }; +pub struct WorkspaceState { + pub show_language_selector: Arc, +} + +/// HACK: This is just a temporary way to start hooking up interactivity until +/// I can get an explainer on how we should actually be managing state. +static WORKSPACE_STATE: OnceLock = OnceLock::new(); + +fn get_workspace_state() -> &'static WorkspaceState { + let state = WORKSPACE_STATE.get_or_init(|| WorkspaceState { + show_language_selector: Arc::new(AtomicBool::new(false)), + }); + + state +} + #[derive(Element)] pub struct WorkspaceElement { state_type: PhantomData, @@ -20,7 +36,6 @@ pub struct WorkspaceElement { right_panel_scroll_state: ScrollState, tab_bar_scroll_state: ScrollState, bottom_panel_scroll_state: ScrollState, - show_language_selector: Arc, } impl WorkspaceElement { @@ -31,14 +46,13 @@ impl WorkspaceElement { right_panel_scroll_state: ScrollState::default(), tab_bar_scroll_state: ScrollState::default(), bottom_panel_scroll_state: ScrollState::default(), - show_language_selector: Arc::new(AtomicBool::new(false)), } } pub fn render(&mut self, cx: &mut ViewContext) -> impl Element { let theme = theme(cx).clone(); - let show_language_selector = self.show_language_selector.clone(); + let workspace_state = get_workspace_state(); let temp_size = rems(36.).into(); @@ -188,9 +202,12 @@ impl WorkspaceElement { ), ) .child(StatusBar::new(Arc::new(move |_, cx| { - let is_showing_language_selector = show_language_selector.load(Ordering::SeqCst); + let is_showing_language_selector = workspace_state + .show_language_selector + .load(Ordering::SeqCst); - show_language_selector + workspace_state + .show_language_selector .compare_exchange( is_showing_language_selector, !is_showing_language_selector, @@ -205,12 +222,16 @@ impl WorkspaceElement { Some( div() .absolute() - .top_0() - .left_0() + .top(px(50.)) + .left(px(640.)) .z_index(999) .child(LanguageSelector::new()), ) - .filter(|_| self.show_language_selector.load(Ordering::SeqCst)), + .filter(|_| { + workspace_state + .show_language_selector + .load(Ordering::SeqCst) + }), ) .child(Toast::new( ToastOrigin::Bottom,