added configuration for diagnostic icons

This is to aid accessibility.

Some themes are not gread for colourblind people. With this
configuration, they can easily change the icons that appear around the
editor (gutter, statusbar) to make them easier to distinguish!
pull/12060/head
Stephen Broadley 2 weeks ago
parent 10c3502a89
commit d8e82eed49

@ -240,10 +240,12 @@ where
counts counts
}); });
let icons = context.editor.config().diagnostic_icons;
if warnings > 0 { if warnings > 0 {
write( write(
context, context,
"●".to_string(), icons.warning.to_string(),
Some(context.editor.theme.get("warning")), Some(context.editor.theme.get("warning")),
); );
write(context, format!(" {} ", warnings), None); write(context, format!(" {} ", warnings), None);
@ -252,7 +254,7 @@ where
if errors > 0 { if errors > 0 {
write( write(
context, context,
"●".to_string(), icons.error.to_string(),
Some(context.editor.theme.get("error")), Some(context.editor.theme.get("error")),
); );
write(context, format!(" {} ", errors), None); write(context, format!(" {} ", errors), None);

@ -13,6 +13,27 @@ pub enum DiagnosticFilter {
Enable(Severity), Enable(Severity),
} }
/// The icon (character) to use for each [`Diagnostic`] level.
#[derive(Debug, Serialize, Deserialize, Copy, Clone, Eq, PartialEq, PartialOrd, Ord)]
#[serde(default, deny_unknown_fields)]
pub struct DiagnosticIcons {
pub error: char,
pub warning: char,
pub info: char,
pub hint: char,
}
impl Default for DiagnosticIcons {
fn default() -> Self {
Self {
error: '',
warning: '',
info: '',
hint: '',
}
}
}
impl<'de> Deserialize<'de> for DiagnosticFilter { impl<'de> Deserialize<'de> for DiagnosticFilter {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where where

@ -1,5 +1,5 @@
use crate::{ use crate::{
annotations::diagnostics::{DiagnosticFilter, InlineDiagnosticsConfig}, annotations::diagnostics::{DiagnosticFilter, DiagnosticIcons, InlineDiagnosticsConfig},
document::{ document::{
DocumentOpenError, DocumentSavedEventFuture, DocumentSavedEventResult, Mode, SavePoint, DocumentOpenError, DocumentSavedEventFuture, DocumentSavedEventResult, Mode, SavePoint,
}, },
@ -345,6 +345,7 @@ pub struct Config {
/// Display diagnostic below the line they occur. /// Display diagnostic below the line they occur.
pub inline_diagnostics: InlineDiagnosticsConfig, pub inline_diagnostics: InlineDiagnosticsConfig,
pub end_of_line_diagnostics: DiagnosticFilter, pub end_of_line_diagnostics: DiagnosticFilter,
pub diagnostic_icons: DiagnosticIcons,
} }
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, Eq, PartialOrd, Ord)] #[derive(Debug, Clone, PartialEq, Deserialize, Serialize, Eq, PartialOrd, Ord)]
@ -982,6 +983,7 @@ impl Default for Config {
jump_label_alphabet: ('a'..='z').collect(), jump_label_alphabet: ('a'..='z').collect(),
inline_diagnostics: InlineDiagnosticsConfig::default(), inline_diagnostics: InlineDiagnosticsConfig::default(),
end_of_line_diagnostics: DiagnosticFilter::Disable, end_of_line_diagnostics: DiagnosticFilter::Disable,
diagnostic_icons: DiagnosticIcons::default(),
} }
} }
} }

@ -46,16 +46,19 @@ impl GutterType {
} }
pub fn diagnostic<'doc>( pub fn diagnostic<'doc>(
_editor: &'doc Editor, editor: &'doc Editor,
doc: &'doc Document, doc: &'doc Document,
_view: &View, _view: &View,
theme: &Theme, theme: &Theme,
_is_focused: bool, _is_focused: bool,
) -> GutterFn<'doc> { ) -> GutterFn<'doc> {
let warning = theme.get("warning"); let icons = &editor.config().diagnostic_icons;
let error = theme.get("error");
let info = theme.get("info"); let warning = (theme.get("warning"), icons.warning);
let hint = theme.get("hint"); let error = (theme.get("error"), icons.error);
let info = (theme.get("info"), icons.info);
let hint = (theme.get("hint"), icons.hint);
let diagnostics = &doc.diagnostics; let diagnostics = &doc.diagnostics;
Box::new( Box::new(
@ -74,13 +77,14 @@ pub fn diagnostic<'doc>(
.any(|ls| ls.id() == d.provider) .any(|ls| ls.id() == d.provider)
}); });
diagnostics_on_line.max_by_key(|d| d.severity).map(|d| { diagnostics_on_line.max_by_key(|d| d.severity).map(|d| {
write!(out, "●").ok(); let (style, indicator) = match d.severity {
match d.severity {
Some(Severity::Error) => error, Some(Severity::Error) => error,
Some(Severity::Warning) | None => warning, Some(Severity::Warning) | None => warning,
Some(Severity::Info) => info, Some(Severity::Info) => info,
Some(Severity::Hint) => hint, Some(Severity::Hint) => hint,
} };
write!(out, "{}", indicator).ok();
style
}) })
}, },
) )

Loading…
Cancel
Save