summaryrefslogtreecommitdiff
path: root/helix-term
diff options
context:
space:
mode:
authorBlaž Hrastnik2021-11-23 03:56:46 +0000
committerBlaž Hrastnik2021-11-29 02:00:28 +0000
commit225e8ccf31ac554ae0977b4359c50edb2670594e (patch)
tree4ff6411ed8955669ad4edf3e331d17aa8dd8081a /helix-term
parent27c1a84f053d1282ed09d64ec737a46f55685d85 (diff)
Extract gutters into helix-view
Diffstat (limited to 'helix-term')
-rw-r--r--helix-term/src/ui/editor.rs97
1 files changed, 1 insertions, 96 deletions
diff --git a/helix-term/src/ui/editor.rs b/helix-term/src/ui/editor.rs
index 82fb8fbf..83be816f 100644
--- a/helix-term/src/ui/editor.rs
+++ b/helix-term/src/ui/editor.rs
@@ -17,7 +17,6 @@ use helix_core::{
};
use helix_view::{
document::{Mode, SCRATCH_BUFFER_NAME},
- editor::{Config, LineNumber},
graphics::{CursorKind, Modifier, Rect, Style},
info::Info,
input::KeyEvent,
@@ -421,97 +420,12 @@ impl EditorView {
.map(|range| range.cursor_line(text))
.collect();
- use std::fmt::Write;
-
- fn diagnostic<'doc>(
- doc: &'doc Document,
- _view: &View,
- theme: &Theme,
- _config: &Config,
- _is_focused: bool,
- _width: usize,
- ) -> GutterFn<'doc> {
- let warning = theme.get("warning");
- let error = theme.get("error");
- let info = theme.get("info");
- let hint = theme.get("hint");
- let diagnostics = doc.diagnostics();
-
- Box::new(move |line: usize, _selected: bool, out: &mut String| {
- use helix_core::diagnostic::Severity;
- if let Some(diagnostic) = diagnostics.iter().find(|d| d.line == line) {
- write!(out, "●").unwrap();
- return Some(match diagnostic.severity {
- Some(Severity::Error) => error,
- Some(Severity::Warning) | None => warning,
- Some(Severity::Info) => info,
- Some(Severity::Hint) => hint,
- });
- }
- None
- })
- }
-
- fn line_number<'doc>(
- doc: &'doc Document,
- view: &View,
- theme: &Theme,
- config: &Config,
- is_focused: bool,
- width: usize,
- ) -> GutterFn<'doc> {
- let text = doc.text().slice(..);
- let last_line = view.last_line(doc);
- // Whether to draw the line number for the last line of the
- // document or not. We only draw it if it's not an empty line.
- let draw_last = text.line_to_byte(last_line) < text.len_bytes();
-
- let linenr = theme.get("ui.linenr");
- let linenr_select: Style = theme.try_get("ui.linenr.selected").unwrap_or(linenr);
-
- let current_line = doc
- .text()
- .char_to_line(doc.selection(view.id).primary().cursor(text));
-
- let config = config.line_number;
-
- Box::new(move |line: usize, selected: bool, out: &mut String| {
- if line == last_line && !draw_last {
- write!(out, "{:>1$}", '~', width).unwrap();
- Some(linenr)
- } else {
- let line = match config {
- LineNumber::Absolute => line + 1,
- LineNumber::Relative => {
- if current_line == line {
- line + 1
- } else {
- abs_diff(current_line, line)
- }
- }
- };
- let style = if selected && is_focused {
- linenr_select
- } else {
- linenr
- };
- write!(out, "{:>1$}", line, width).unwrap();
- Some(style)
- }
- })
- }
-
- type GutterFn<'doc> = Box<dyn Fn(usize, bool, &mut String) -> Option<Style> + 'doc>;
- type Gutter =
- for<'doc> fn(&'doc Document, &View, &Theme, &Config, bool, usize) -> GutterFn<'doc>;
- let gutters: &[(Gutter, usize)] = &[(diagnostic, 1), (line_number, 5)];
-
let mut offset = 0;
// avoid lots of small allocations by reusing a text buffer for each line
let mut text = String::with_capacity(8);
- for (constructor, width) in gutters {
+ for (constructor, width) in view.gutters() {
let gutter = constructor(doc, view, theme, config, is_focused, *width);
text.reserve(*width); // ensure there's enough space for the gutter
for (i, line) in (view.offset.row..(last_line + 1)).enumerate() {
@@ -1214,12 +1128,3 @@ fn canonicalize_key(key: &mut KeyEvent) {
key.modifiers.remove(KeyModifiers::SHIFT)
}
}
-
-#[inline]
-const fn abs_diff(a: usize, b: usize) -> usize {
- if a > b {
- a - b
- } else {
- b - a
- }
-}