Push language selector handler down into `StatusBar`

Marshall Bowers created

Change summary

crates/ui2/src/components/status_bar.rs | 25 ++++++++++++++++++++-----
crates/ui2/src/components/workspace.rs  | 18 +-----------------
2 files changed, 21 insertions(+), 22 deletions(-)

Detailed changes

crates/ui2/src/components/status_bar.rs 🔗

@@ -1,8 +1,9 @@
 use std::marker::PhantomData;
 use std::sync::atomic::Ordering;
+use std::sync::Arc;
 
 use crate::prelude::*;
-use crate::{get_workspace_state, Button, ClickHandler, Icon, IconButton, IconColor, ToolDivider};
+use crate::{get_workspace_state, Button, Icon, IconButton, IconColor, ToolDivider};
 
 #[derive(Default, PartialEq)]
 pub enum Tool {
@@ -35,17 +36,15 @@ pub struct StatusBar<S: 'static + Send + Sync + Clone> {
     left_tools: Option<ToolGroup>,
     right_tools: Option<ToolGroup>,
     bottom_tools: Option<ToolGroup>,
-    on_select_language: ClickHandler<S>,
 }
 
 impl<S: 'static + Send + Sync + Clone> StatusBar<S> {
-    pub fn new(on_select_language: ClickHandler<S>) -> Self {
+    pub fn new() -> Self {
         Self {
             state_type: PhantomData,
             left_tools: None,
             right_tools: None,
             bottom_tools: None,
-            on_select_language,
         }
     }
 
@@ -148,7 +147,23 @@ impl<S: 'static + Send + Sync + Clone> StatusBar<S> {
                     .items_center()
                     .gap_1()
                     .child(Button::new("116:25"))
-                    .child(Button::new("Rust").on_click(self.on_select_language.clone())),
+                    .child(Button::new("Rust").on_click(Arc::new(|_, cx| {
+                        let is_showing_language_selector = workspace_state
+                            .show_language_selector
+                            .load(Ordering::SeqCst);
+
+                        workspace_state
+                            .show_language_selector
+                            .compare_exchange(
+                                is_showing_language_selector,
+                                !is_showing_language_selector,
+                                Ordering::SeqCst,
+                                Ordering::SeqCst,
+                            )
+                            .unwrap();
+
+                        cx.notify();
+                    }))),
             )
             .child(ToolDivider::new())
             .child(

crates/ui2/src/components/workspace.rs 🔗

@@ -218,23 +218,7 @@ impl<S: 'static + Send + Sync + Clone> WorkspaceElement<S> {
                         .filter(|_| workspace_state.show_chat_panel.load(Ordering::SeqCst)),
                     ),
             )
-            .child(StatusBar::new(Arc::new(move |_, cx| {
-                let is_showing_language_selector = workspace_state
-                    .show_language_selector
-                    .load(Ordering::SeqCst);
-
-                workspace_state
-                    .show_language_selector
-                    .compare_exchange(
-                        is_showing_language_selector,
-                        !is_showing_language_selector,
-                        Ordering::SeqCst,
-                        Ordering::SeqCst,
-                    )
-                    .unwrap();
-
-                cx.notify();
-            })))
+            .child(StatusBar::new())
             .children(
                 Some(
                     div()