on master help sign in
dap: Extract diagnostics gutter into gutters.rs
30ac586Blaž Hrastnik
helix-term/src/ui/editor.rs+1−63
@@ -17,7 +17,7 @@ use helix_core::{
17};
17};
18use helix_view::{
18use helix_view::{
19 document::{Mode, SCRATCH_BUFFER_NAME},
19 document::{Mode, SCRATCH_BUFFER_NAME},
20− graphics::{Color, CursorKind, Modifier, Rect, Style},
20+ graphics::{CursorKind, Modifier, Rect, Style},
21 info::Info,
21 info::Info,
22 input::KeyEvent,
22 input::KeyEvent,
23 keyboard::{KeyCode, KeyModifiers},
23 keyboard::{KeyCode, KeyModifiers},
@@ -419,68 +419,6 @@ impl EditorView {
419 .map(|range| range.cursor_line(text))
419 .map(|range| range.cursor_line(text))
420 .collect();
420 .collect();
421
421
422− use helix_view::editor::Config;
423− use helix_view::gutter::GutterFn;
424− fn breakpoints<'doc>(
425− editor: &'doc Editor,
426− doc: &'doc Document,
427− _view: &View,
428− theme: &Theme,
429− _config: &Config,
430− _is_focused: bool,
431− _width: usize,
432− ) -> GutterFn<'doc> {
433− let warning = theme.get("warning");
434− let error = theme.get("error");
435− let info = theme.get("info");
436−
437− let breakpoints = doc
438− .path()
439− .and_then(|path| editor.breakpoints.get(path))
440− .unwrap();
441−
442− Box::new(move |line: usize, _selected: bool, out: &mut String| {
443− let breakpoint = breakpoints
444− .iter()
445− .find(|breakpoint| breakpoint.line == line);
446−
447− let breakpoint = match breakpoint {
448− Some(b) => b,
449− None => return None,
450− };
451−
452− let mut style =
453− if breakpoint.condition.is_some() && breakpoint.log_message.is_some() {
454− error.add_modifier(Modifier::UNDERLINED)
455− } else if breakpoint.condition.is_some() {
456− error
457− } else if breakpoint.log_message.is_some() {
458− info
459− } else {
460− warning
461− };
462−
463− if !breakpoint.verified {
464− // Faded colors
465− style = if let Some(Color::Rgb(r, g, b)) = style.fg {
466− style.fg(Color::Rgb(
467− ((r as f32) * 0.4).floor() as u8,
468− ((g as f32) * 0.4).floor() as u8,
469− ((b as f32) * 0.4).floor() as u8,
470− ))
471− } else {
472− style.fg(Color::Gray)
473− }
474− };
475−
476− // TODO: also handle breakpoints only present in the user struct
477− use std::fmt::Write;
478− let sym = if breakpoint.verified { "▲" } else { "⊚" };
479− write!(out, "{}", sym).unwrap();
480− Some(style)
481− })
482− }
483−
484 // let mut stack_frame: Option<&StackFrame> = None;
422 // let mut stack_frame: Option<&StackFrame> = None;
485 // if let Some(path) = doc.path() {
423 // if let Some(path) = doc.path() {
486 // if let Some(debugger) = debugger {
424 // if let Some(debugger) = debugger {
helix-view/src/gutter.rs+61−1
@@ -1,6 +1,9 @@
1use std::fmt::Write;
1use std::fmt::Write;
2
2
3+use crate::{
4+ graphics::{Color, Modifier, Style},
3−use crate::{graphics::Style, Document, Editor, Theme, View};
5+ Document, Editor, Theme, View,
6+};
4
7
5pub type GutterFn<'doc> = Box<dyn Fn(usize, bool, &mut String) -> Option<Style> + 'doc>;
8pub type GutterFn<'doc> = Box<dyn Fn(usize, bool, &mut String) -> Option<Style> + 'doc>;
6pub type Gutter =
9pub type Gutter =
@@ -93,3 +96,60 @@ const fn abs_diff(a: usize, b: usize) -> usize {
93 b - a
96 b - a
94 }
97 }
95}
98}
99+
100+pub fn breakpoints<'doc>(
101+ editor: &'doc Editor,
102+ doc: &'doc Document,
103+ _view: &View,
104+ theme: &Theme,
105+ _is_focused: bool,
106+ _width: usize,
107+) -> GutterFn<'doc> {
108+ let warning = theme.get("warning");
109+ let error = theme.get("error");
110+ let info = theme.get("info");
111+
112+ let breakpoints = doc
113+ .path()
114+ .and_then(|path| editor.breakpoints.get(path))
115+ .unwrap();
116+
117+ Box::new(move |line: usize, _selected: bool, out: &mut String| {
118+ let breakpoint = breakpoints
119+ .iter()
120+ .find(|breakpoint| breakpoint.line == line);
121+
122+ let breakpoint = match breakpoint {
123+ Some(b) => b,
124+ None => return None,
125+ };
126+
127+ let mut style = if breakpoint.condition.is_some() && breakpoint.log_message.is_some() {
128+ error.add_modifier(Modifier::UNDERLINED)
129+ } else if breakpoint.condition.is_some() {
130+ error
131+ } else if breakpoint.log_message.is_some() {
132+ info
133+ } else {
134+ warning
135+ };
136+
137+ if !breakpoint.verified {
138+ // Faded colors
139+ style = if let Some(Color::Rgb(r, g, b)) = style.fg {
140+ style.fg(Color::Rgb(
141+ ((r as f32) * 0.4).floor() as u8,
142+ ((g as f32) * 0.4).floor() as u8,
143+ ((b as f32) * 0.4).floor() as u8,
144+ ))
145+ } else {
146+ style.fg(Color::Gray)
147+ }
148+ };
149+
150+ // TODO: also handle breakpoints only present in the user struct
151+ let sym = if breakpoint.verified { "▲" } else { "⊚" };
152+ write!(out, "{}", sym).unwrap();
153+ Some(style)
154+ })
155+}
helix-view/src/view.rs+5−1
@@ -64,7 +64,11 @@ impl JumpList {
64 }
64 }
65}
65}
66
66
67−const GUTTERS: &[(Gutter, usize)] = &[(gutter::diagnostic, 1), (gutter::line_number, 5)];
67+const GUTTERS: &[(Gutter, usize)] = &[
68+ (gutter::breakpoints, 1),
69+ (gutter::diagnostic, 1),
70+ (gutter::line_number, 5),
71+];
68
72
69#[derive(Debug)]
73#[derive(Debug)]
70pub struct View {
74pub struct View {