diff --git a/crates/diagnostics/src/diagnostics.rs b/crates/diagnostics/src/diagnostics.rs index 48a92d906e..9f02033237 100644 --- a/crates/diagnostics/src/diagnostics.rs +++ b/crates/diagnostics/src/diagnostics.rs @@ -16,8 +16,8 @@ use editor::{ }; use gpui::{ actions, div, svg, AnyElement, AnyView, AppContext, Context, EventEmitter, FocusHandle, - FocusableView, HighlightStyle, InteractiveElement, IntoElement, Model, ParentElement, Render, - SharedString, Styled, StyledText, Subscription, Task, View, ViewContext, VisualContext, + FocusableView, Global, HighlightStyle, InteractiveElement, IntoElement, Model, ParentElement, + Render, SharedString, Styled, StyledText, Subscription, Task, View, ViewContext, VisualContext, WeakView, WindowContext, }; use language::{ @@ -46,6 +46,9 @@ use workspace::{ actions!(diagnostics, [Deploy, ToggleWarnings]); +struct IncludeWarnings(bool); +impl Global for IncludeWarnings {} + pub fn init(cx: &mut AppContext) { ProjectDiagnosticsSettings::register(cx); cx.observe_new_views(ProjectDiagnosticsEditor::register) @@ -117,6 +120,7 @@ impl ProjectDiagnosticsEditor { fn new_with_context( context: u32, + include_warnings: bool, project_handle: Model, workspace: WeakView, cx: &mut ViewContext, @@ -186,19 +190,24 @@ impl ProjectDiagnosticsEditor { } }) .detach(); + cx.observe_global::(|this, cx| { + this.include_warnings = cx.global::().0; + this.update_all_excerpts(cx); + }) + .detach(); let project = project_handle.read(cx); let mut this = Self { project: project_handle.clone(), context, summary: project.diagnostic_summary(false, cx), + include_warnings, workspace, excerpts, focus_handle, editor, path_states: Default::default(), paths_to_update: Default::default(), - include_warnings: ProjectDiagnosticsSettings::get_global(cx).include_warnings, update_excerpts_task: None, _subscription: project_event_subscription, }; @@ -243,11 +252,13 @@ impl ProjectDiagnosticsEditor { fn new( project_handle: Model, + include_warnings: bool, workspace: WeakView, cx: &mut ViewContext, ) -> Self { Self::new_with_context( editor::DEFAULT_MULTIBUFFER_CONTEXT, + include_warnings, project_handle, workspace, cx, @@ -259,8 +270,19 @@ impl ProjectDiagnosticsEditor { workspace.activate_item(&existing, true, true, cx); } else { let workspace_handle = cx.view().downgrade(); + + let include_warnings = match cx.try_global::() { + Some(include_warnings) => include_warnings.0, + None => ProjectDiagnosticsSettings::get_global(cx).include_warnings, + }; + let diagnostics = cx.new_view(|cx| { - ProjectDiagnosticsEditor::new(workspace.project().clone(), workspace_handle, cx) + ProjectDiagnosticsEditor::new( + workspace.project().clone(), + include_warnings, + workspace_handle, + cx, + ) }); workspace.add_item_to_active_pane(Box::new(diagnostics), None, true, cx); } @@ -268,6 +290,7 @@ impl ProjectDiagnosticsEditor { fn toggle_warnings(&mut self, _: &ToggleWarnings, cx: &mut ViewContext) { self.include_warnings = !self.include_warnings; + cx.set_global(IncludeWarnings(self.include_warnings)); self.update_all_excerpts(cx); cx.notify(); } @@ -740,7 +763,12 @@ impl Item for ProjectDiagnosticsEditor { Self: Sized, { Some(cx.new_view(|cx| { - ProjectDiagnosticsEditor::new(self.project.clone(), self.workspace.clone(), cx) + ProjectDiagnosticsEditor::new( + self.project.clone(), + self.include_warnings, + self.workspace.clone(), + cx, + ) })) } diff --git a/crates/diagnostics/src/diagnostics_tests.rs b/crates/diagnostics/src/diagnostics_tests.rs index ff305e45a2..6ee1a90511 100644 --- a/crates/diagnostics/src/diagnostics_tests.rs +++ b/crates/diagnostics/src/diagnostics_tests.rs @@ -151,7 +151,13 @@ async fn test_diagnostics(cx: &mut TestAppContext) { // Open the project diagnostics view while there are already diagnostics. let view = window.build_view(cx, |cx| { - ProjectDiagnosticsEditor::new_with_context(1, project.clone(), workspace.downgrade(), cx) + ProjectDiagnosticsEditor::new_with_context( + 1, + true, + project.clone(), + workspace.downgrade(), + cx, + ) }); let editor = view.update(cx, |view, _| view.editor.clone()); @@ -459,7 +465,13 @@ async fn test_diagnostics_multiple_servers(cx: &mut TestAppContext) { let workspace = window.root(cx).unwrap(); let view = window.build_view(cx, |cx| { - ProjectDiagnosticsEditor::new_with_context(1, project.clone(), workspace.downgrade(), cx) + ProjectDiagnosticsEditor::new_with_context( + 1, + true, + project.clone(), + workspace.downgrade(), + cx, + ) }); let editor = view.update(cx, |view, _| view.editor.clone()); @@ -720,7 +732,13 @@ async fn test_random_diagnostics(cx: &mut TestAppContext, mut rng: StdRng) { let workspace = window.root(cx).unwrap(); let mutated_view = window.build_view(cx, |cx| { - ProjectDiagnosticsEditor::new_with_context(1, project.clone(), workspace.downgrade(), cx) + ProjectDiagnosticsEditor::new_with_context( + 1, + true, + project.clone(), + workspace.downgrade(), + cx, + ) }); workspace.update(cx, |workspace, cx| { @@ -816,7 +834,13 @@ async fn test_random_diagnostics(cx: &mut TestAppContext, mut rng: StdRng) { log::info!("constructing reference diagnostics view"); let reference_view = window.build_view(cx, |cx| { - ProjectDiagnosticsEditor::new_with_context(1, project.clone(), workspace.downgrade(), cx) + ProjectDiagnosticsEditor::new_with_context( + 1, + true, + project.clone(), + workspace.downgrade(), + cx, + ) }); cx.run_until_parked();