toolbar_controls.rs

 1use crate::ProjectDiagnosticsEditor;
 2use gpui::{EventEmitter, ParentElement, Render, View, ViewContext, WeakView};
 3use ui::prelude::*;
 4use ui::{IconButton, IconName, Tooltip};
 5use workspace::{item::ItemHandle, ToolbarItemEvent, ToolbarItemLocation, ToolbarItemView};
 6
 7pub struct ToolbarControls {
 8    editor: Option<WeakView<ProjectDiagnosticsEditor>>,
 9}
10
11impl Render for ToolbarControls {
12    fn render(&mut self, cx: &mut ViewContext<Self>) -> impl IntoElement {
13        let mut include_warnings = false;
14        let mut has_stale_excerpts = false;
15        let mut is_updating = false;
16
17        if let Some(editor) = self.editor() {
18            let editor = editor.read(cx);
19            include_warnings = editor.include_warnings;
20            has_stale_excerpts = !editor.paths_to_update.is_empty();
21            is_updating = editor.update_paths_tx.len() > 0
22                || editor
23                    .project
24                    .read(cx)
25                    .language_servers_running_disk_based_diagnostics()
26                    .next()
27                    .is_some();
28        }
29
30        let tooltip = if include_warnings {
31            "Exclude Warnings"
32        } else {
33            "Include Warnings"
34        };
35
36        h_flex()
37            .when(has_stale_excerpts, |div| {
38                div.child(
39                    IconButton::new("update-excerpts", IconName::Update)
40                        .icon_color(Color::Info)
41                        .disabled(is_updating)
42                        .tooltip(move |cx| Tooltip::text("Update excerpts", cx))
43                        .on_click(cx.listener(|this, _, cx| {
44                            if let Some(editor) = this.editor() {
45                                editor.update(cx, |editor, _| {
46                                    editor.enqueue_update_stale_excerpts(None);
47                                });
48                            }
49                        })),
50                )
51            })
52            .child(
53                IconButton::new("toggle-warnings", IconName::ExclamationTriangle)
54                    .tooltip(move |cx| Tooltip::text(tooltip, cx))
55                    .on_click(cx.listener(|this, _, cx| {
56                        if let Some(editor) = this.editor() {
57                            editor.update(cx, |editor, cx| {
58                                editor.toggle_warnings(&Default::default(), cx);
59                            });
60                        }
61                    })),
62            )
63    }
64}
65
66impl EventEmitter<ToolbarItemEvent> for ToolbarControls {}
67
68impl ToolbarItemView for ToolbarControls {
69    fn set_active_pane_item(
70        &mut self,
71        active_pane_item: Option<&dyn ItemHandle>,
72        _: &mut ViewContext<Self>,
73    ) -> ToolbarItemLocation {
74        if let Some(pane_item) = active_pane_item.as_ref() {
75            if let Some(editor) = pane_item.downcast::<ProjectDiagnosticsEditor>() {
76                self.editor = Some(editor.downgrade());
77                ToolbarItemLocation::PrimaryRight
78            } else {
79                ToolbarItemLocation::Hidden
80            }
81        } else {
82            ToolbarItemLocation::Hidden
83        }
84    }
85}
86
87impl ToolbarControls {
88    pub fn new() -> Self {
89        ToolbarControls { editor: None }
90    }
91
92    fn editor(&self) -> Option<View<ProjectDiagnosticsEditor>> {
93        self.editor.as_ref()?.upgrade()
94    }
95}