Adjust icon color based on whether the various components are open

Marshall Bowers created

Change summary

crates/ui2/src/components/status_bar.rs | 89 +++++++++++++++-----------
1 file changed, 52 insertions(+), 37 deletions(-)

Detailed changes

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

@@ -101,16 +101,19 @@ impl<S: 'static + Send + Sync + Clone> StatusBar<S> {
     }
 
     fn left_tools(&self, theme: &Theme) -> impl Element<State = S> {
+        let workspace_state = get_workspace_state();
+
         div()
             .flex()
             .items_center()
             .gap_1()
             .child(
                 IconButton::new(Icon::FileTree)
-                    .color(IconColor::Accent)
+                    .when(
+                        workspace_state.show_project_panel.load(Ordering::SeqCst),
+                        |this| this.color(IconColor::Accent),
+                    )
                     .on_click(|_, cx| {
-                        let workspace_state = get_workspace_state();
-
                         let is_showing_project_panel =
                             workspace_state.show_project_panel.load(Ordering::SeqCst);
 
@@ -133,6 +136,8 @@ impl<S: 'static + Send + Sync + Clone> StatusBar<S> {
     }
 
     fn right_tools(&self, theme: &Theme) -> impl Element<State = S> {
+        let workspace_state = get_workspace_state();
+
         div()
             .flex()
             .items_center()
@@ -166,42 +171,52 @@ impl<S: 'static + Send + Sync + Clone> StatusBar<S> {
                     .flex()
                     .items_center()
                     .gap_1()
-                    .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,
+                    .child(
+                        IconButton::new(Icon::Terminal)
+                            .when(
+                                workspace_state.show_terminal.load(Ordering::SeqCst),
+                                |this| this.color(IconColor::Accent),
                             )
-                            .unwrap();
-
-                        cx.notify();
-                    }))
-                    .child(IconButton::new(Icon::MessageBubbles).on_click(|_, cx| {
-                        let workspace_state = get_workspace_state();
-
-                        let is_showing_chat_panel =
-                            workspace_state.show_chat_panel.load(Ordering::SeqCst);
-
-                        workspace_state
-                            .show_chat_panel
-                            .compare_exchange(
-                                is_showing_chat_panel,
-                                !is_showing_chat_panel,
-                                Ordering::SeqCst,
-                                Ordering::SeqCst,
+                            .on_click(|_, cx| {
+                                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)
+                            .when(
+                                workspace_state.show_chat_panel.load(Ordering::SeqCst),
+                                |this| this.color(IconColor::Accent),
                             )
-                            .unwrap();
-
-                        cx.notify();
-                    }))
+                            .on_click(|_, cx| {
+                                let is_showing_chat_panel =
+                                    workspace_state.show_chat_panel.load(Ordering::SeqCst);
+
+                                workspace_state
+                                    .show_chat_panel
+                                    .compare_exchange(
+                                        is_showing_chat_panel,
+                                        !is_showing_chat_panel,
+                                        Ordering::SeqCst,
+                                        Ordering::SeqCst,
+                                    )
+                                    .unwrap();
+
+                                cx.notify();
+                            }),
+                    )
                     .child(IconButton::new(Icon::Ai)),
             )
     }