Add working toggle for LanguageSelector
This commit is contained in:
parent
95ef61bc45
commit
8e1638b773
1 changed files with 31 additions and 10 deletions
|
@ -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,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue