Add working toggle for LanguageSelector

This commit is contained in:
Marshall Bowers 2023-10-10 18:21:44 -04:00
parent 95ef61bc45
commit 8e1638b773

View file

@ -1,9 +1,9 @@
use std::marker::PhantomData; use std::marker::PhantomData;
use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Arc; use std::sync::{Arc, OnceLock};
use chrono::DateTime; use chrono::DateTime;
use gpui3::{relative, rems, Size}; use gpui3::{px, relative, rems, Size};
use crate::prelude::*; use crate::prelude::*;
use crate::{ use crate::{
@ -13,6 +13,22 @@ use crate::{
TitleBar, Toast, ToastOrigin, TitleBar, Toast, ToastOrigin,
}; };
pub struct WorkspaceState {
pub show_language_selector: Arc<AtomicBool>,
}
/// 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<WorkspaceState> = 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)] #[derive(Element)]
pub struct WorkspaceElement<S: 'static + Send + Sync + Clone> { pub struct WorkspaceElement<S: 'static + Send + Sync + Clone> {
state_type: PhantomData<S>, state_type: PhantomData<S>,
@ -20,7 +36,6 @@ pub struct WorkspaceElement<S: 'static + Send + Sync + Clone> {
right_panel_scroll_state: ScrollState, right_panel_scroll_state: ScrollState,
tab_bar_scroll_state: ScrollState, tab_bar_scroll_state: ScrollState,
bottom_panel_scroll_state: ScrollState, bottom_panel_scroll_state: ScrollState,
show_language_selector: Arc<AtomicBool>,
} }
impl<S: 'static + Send + Sync + Clone> WorkspaceElement<S> { impl<S: 'static + Send + Sync + Clone> WorkspaceElement<S> {
@ -31,14 +46,13 @@ impl<S: 'static + Send + Sync + Clone> WorkspaceElement<S> {
right_panel_scroll_state: ScrollState::default(), right_panel_scroll_state: ScrollState::default(),
tab_bar_scroll_state: ScrollState::default(), tab_bar_scroll_state: ScrollState::default(),
bottom_panel_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<S>) -> impl Element<State = S> { pub fn render(&mut self, cx: &mut ViewContext<S>) -> impl Element<State = S> {
let theme = theme(cx).clone(); 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(); let temp_size = rems(36.).into();
@ -188,9 +202,12 @@ impl<S: 'static + Send + Sync + Clone> WorkspaceElement<S> {
), ),
) )
.child(StatusBar::new(Arc::new(move |_, cx| { .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( .compare_exchange(
is_showing_language_selector, is_showing_language_selector,
!is_showing_language_selector, !is_showing_language_selector,
@ -205,12 +222,16 @@ impl<S: 'static + Send + Sync + Clone> WorkspaceElement<S> {
Some( Some(
div() div()
.absolute() .absolute()
.top_0() .top(px(50.))
.left_0() .left(px(640.))
.z_index(999) .z_index(999)
.child(LanguageSelector::new()), .child(LanguageSelector::new()),
) )
.filter(|_| self.show_language_selector.load(Ordering::SeqCst)), .filter(|_| {
workspace_state
.show_language_selector
.load(Ordering::SeqCst)
}),
) )
.child(Toast::new( .child(Toast::new(
ToastOrigin::Bottom, ToastOrigin::Bottom,