Correctly incorporate editor settings into diagnostic header rendering

This commit is contained in:
Max Brunsfeld 2021-12-16 16:36:33 -08:00
parent ae147a379d
commit fb492a9fb8
8 changed files with 37 additions and 55 deletions

View file

@ -13,7 +13,7 @@ use gpui::{
ViewContext, ViewHandle, ViewContext, ViewHandle,
}; };
use postage::{prelude::Stream, watch}; use postage::{prelude::Stream, watch};
use std::{rc::Rc, sync::Arc}; use std::sync::Arc;
use time::{OffsetDateTime, UtcOffset}; use time::{OffsetDateTime, UtcOffset};
use util::{ResultExt, TryFutureExt}; use util::{ResultExt, TryFutureExt};
use workspace::Settings; use workspace::Settings;
@ -56,7 +56,7 @@ impl ChatPanel {
4, 4,
{ {
let settings = settings.clone(); let settings = settings.clone();
Rc::new(move |_| { Arc::new(move |_| {
let settings = settings.borrow(); let settings = settings.borrow();
EditorSettings { EditorSettings {
tab_size: settings.tab_size, tab_size: settings.tab_size,

View file

@ -1,7 +1,5 @@
use std::{cmp, sync::Arc};
use editor::{ use editor::{
diagnostic_block_renderer, diagnostic_style, diagnostic_block_renderer, diagnostic_header_renderer,
display_map::{BlockDisposition, BlockProperties}, display_map::{BlockDisposition, BlockProperties},
Editor, ExcerptProperties, MultiBuffer, Editor, ExcerptProperties, MultiBuffer,
}; };
@ -12,6 +10,7 @@ use gpui::{
use language::Point; use language::Point;
use postage::watch; use postage::watch;
use project::Project; use project::Project;
use std::cmp;
use workspace::Workspace; use workspace::Workspace;
action!(Toggle); action!(Toggle);
@ -129,27 +128,10 @@ impl workspace::Item for ProjectDiagnostics {
.count() .count()
as u8 as u8
+ 1, + 1,
render_header: Some(Arc::new({ render_header: Some(diagnostic_header_renderer(
let settings = settings.clone(); primary_diagnostic,
build_settings.clone(),
move |_| { )),
let editor_style =
&settings.borrow().theme.editor;
let mut text_style = editor_style.text.clone();
text_style.color = diagnostic_style(
primary_diagnostic.severity,
true,
&editor_style,
)
.text;
Text::new(
primary_diagnostic.message.clone(),
text_style,
)
.boxed()
}
})),
}, },
excerpts_cx, excerpts_cx,
); );

View file

@ -28,7 +28,9 @@ use language::{
TransactionId, TransactionId,
}; };
pub use multi_buffer::{Anchor, ExcerptProperties, MultiBuffer}; pub use multi_buffer::{Anchor, ExcerptProperties, MultiBuffer};
use multi_buffer::{AnchorRangeExt, MultiBufferChunks, MultiBufferSnapshot, ToOffset, ToPoint}; use multi_buffer::{
AnchorRangeExt, MultiBufferChunks, MultiBufferSnapshot, RenderHeaderFn, ToOffset, ToPoint,
};
use postage::watch; use postage::watch;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use smallvec::SmallVec; use smallvec::SmallVec;
@ -39,7 +41,6 @@ use std::{
iter::{self, FromIterator}, iter::{self, FromIterator},
mem, mem,
ops::{Deref, Range, RangeInclusive, Sub}, ops::{Deref, Range, RangeInclusive, Sub},
rc::Rc,
sync::Arc, sync::Arc,
time::{Duration, Instant}, time::{Duration, Instant},
}; };
@ -356,7 +357,7 @@ pub enum SoftWrap {
Column(u32), Column(u32),
} }
type BuildSettings = Rc<dyn Fn(&AppContext) -> EditorSettings>; type BuildSettings = Arc<dyn 'static + Send + Sync + Fn(&AppContext) -> EditorSettings>;
pub struct Editor { pub struct Editor {
handle: WeakViewHandle<Self>, handle: WeakViewHandle<Self>,
@ -3771,24 +3772,26 @@ pub fn diagnostic_block_renderer(
build_settings: BuildSettings, build_settings: BuildSettings,
) -> RenderBlock { ) -> RenderBlock {
Arc::new(move |cx: &BlockContext| { Arc::new(move |cx: &BlockContext| {
let diagnostic = diagnostic.clone();
let settings = build_settings(cx); let settings = build_settings(cx);
render_diagnostic(diagnostic, &settings.style, is_valid, cx.anchor_x) let mut text_style = settings.style.text.clone();
text_style.color = diagnostic_style(diagnostic.severity, is_valid, &settings.style).text;
Text::new(diagnostic.message.clone(), text_style)
.contained()
.with_margin_left(cx.anchor_x)
.boxed()
}) })
} }
fn render_diagnostic( pub fn diagnostic_header_renderer(
diagnostic: Diagnostic, diagnostic: Diagnostic,
style: &EditorStyle, build_settings: BuildSettings,
valid: bool, ) -> RenderHeaderFn {
anchor_x: f32, Arc::new(move |cx| {
) -> ElementBox { let settings = build_settings(cx);
let mut text_style = style.text.clone(); let mut text_style = settings.style.text.clone();
text_style.color = diagnostic_style(diagnostic.severity, valid, &style).text; text_style.color = diagnostic_style(diagnostic.severity, true, &settings.style).text;
Text::new(diagnostic.message, text_style) Text::new(diagnostic.message.clone(), text_style).boxed()
.contained() })
.with_margin_left(anchor_x)
.boxed()
} }
pub fn diagnostic_style( pub fn diagnostic_style(
@ -3813,7 +3816,7 @@ pub fn settings_builder(
buffer: WeakModelHandle<MultiBuffer>, buffer: WeakModelHandle<MultiBuffer>,
settings: watch::Receiver<workspace::Settings>, settings: watch::Receiver<workspace::Settings>,
) -> BuildSettings { ) -> BuildSettings {
Rc::new(move |cx| { Arc::new(move |cx| {
let settings = settings.borrow(); let settings = settings.borrow();
let font_cache = cx.font_cache(); let font_cache = cx.font_cache();
let font_family_id = settings.buffer_font_family; let font_family_id = settings.buffer_font_family;
@ -6106,7 +6109,7 @@ mod tests {
settings: EditorSettings, settings: EditorSettings,
cx: &mut ViewContext<Editor>, cx: &mut ViewContext<Editor>,
) -> Editor { ) -> Editor {
Editor::for_buffer(buffer, Rc::new(move |_| settings.clone()), cx) Editor::for_buffer(buffer, Arc::new(move |_| settings.clone()), cx)
} }
} }

View file

@ -1179,7 +1179,7 @@ fn scale_horizontal_mouse_autoscroll_delta(delta: f32) -> f32 {
mod tests { mod tests {
use super::*; use super::*;
use crate::{Editor, EditorSettings, MultiBuffer}; use crate::{Editor, EditorSettings, MultiBuffer};
use std::rc::Rc; use std::sync::Arc;
use util::test::sample_text; use util::test::sample_text;
#[gpui::test] #[gpui::test]
@ -1191,7 +1191,7 @@ mod tests {
buffer, buffer,
{ {
let settings = settings.clone(); let settings = settings.clone();
Rc::new(move |_| settings.clone()) Arc::new(move |_| settings.clone())
}, },
cx, cx,
) )

View file

@ -16,7 +16,6 @@ use project::{Project, ProjectPath};
use std::{ use std::{
cmp, cmp,
path::Path, path::Path,
rc::Rc,
sync::{ sync::{
atomic::{self, AtomicBool}, atomic::{self, AtomicBool},
Arc, Arc,
@ -271,7 +270,7 @@ impl FileFinder {
Editor::single_line( Editor::single_line(
{ {
let settings = settings.clone(); let settings = settings.clone();
Rc::new(move |_| { Arc::new(move |_| {
let settings = settings.borrow(); let settings = settings.borrow();
EditorSettings { EditorSettings {
style: settings.theme.selector.input_editor.as_editor(), style: settings.theme.selector.input_editor.as_editor(),

View file

@ -1,11 +1,10 @@
use std::rc::Rc;
use editor::{display_map::ToDisplayPoint, Autoscroll, Editor, EditorSettings}; use editor::{display_map::ToDisplayPoint, Autoscroll, Editor, EditorSettings};
use gpui::{ use gpui::{
action, elements::*, geometry::vector::Vector2F, keymap::Binding, Axis, Entity, action, elements::*, geometry::vector::Vector2F, keymap::Binding, Axis, Entity,
MutableAppContext, RenderContext, View, ViewContext, ViewHandle, MutableAppContext, RenderContext, View, ViewContext, ViewHandle,
}; };
use postage::watch; use postage::watch;
use std::sync::Arc;
use text::{Bias, Point, Selection}; use text::{Bias, Point, Selection};
use workspace::{Settings, Workspace}; use workspace::{Settings, Workspace};
@ -51,7 +50,7 @@ impl GoToLine {
Editor::single_line( Editor::single_line(
{ {
let settings = settings.clone(); let settings = settings.clone();
Rc::new(move |_| { Arc::new(move |_| {
let settings = settings.borrow(); let settings = settings.borrow();
EditorSettings { EditorSettings {
tab_size: settings.tab_size, tab_size: settings.tab_size,

View file

@ -932,7 +932,6 @@ mod tests {
use std::{ use std::{
ops::Deref, ops::Deref,
path::Path, path::Path,
rc::Rc,
sync::{ sync::{
atomic::{AtomicBool, Ordering::SeqCst}, atomic::{AtomicBool, Ordering::SeqCst},
Arc, Arc,
@ -1047,7 +1046,7 @@ mod tests {
.unwrap(); .unwrap();
let editor_b = cx_b.add_view(window_b, |cx| { let editor_b = cx_b.add_view(window_b, |cx| {
Editor::for_buffer(buffer_b, Rc::new(|cx| EditorSettings::test(cx)), cx) Editor::for_buffer(buffer_b, Arc::new(|cx| EditorSettings::test(cx)), cx)
}); });
// TODO // TODO
// // Create a selection set as client B and see that selection set as client A. // // Create a selection set as client B and see that selection set as client A.

View file

@ -9,7 +9,7 @@ use gpui::{
}; };
use parking_lot::Mutex; use parking_lot::Mutex;
use postage::watch; use postage::watch;
use std::{cmp, rc::Rc, sync::Arc}; use std::{cmp, sync::Arc};
use theme::ThemeRegistry; use theme::ThemeRegistry;
use workspace::{Settings, Workspace}; use workspace::{Settings, Workspace};
@ -64,7 +64,7 @@ impl ThemeSelector {
Editor::single_line( Editor::single_line(
{ {
let settings = settings.clone(); let settings = settings.clone();
Rc::new(move |_| { Arc::new(move |_| {
let settings = settings.borrow(); let settings = settings.borrow();
EditorSettings { EditorSettings {
tab_size: settings.tab_size, tab_size: settings.tab_size,