Implemented indentation for soft-wrapped lines again.
This commit is contained in:
parent
7b652c98da
commit
9512018983
|
@ -38,6 +38,9 @@ impl ConsoleLineFormatter {
|
||||||
tab_width: self.tab_width as usize,
|
tab_width: self.tab_width as usize,
|
||||||
word_buf: Vec::new(),
|
word_buf: Vec::new(),
|
||||||
word_i: 0,
|
word_i: 0,
|
||||||
|
indent: 0,
|
||||||
|
extra_indent: 2,
|
||||||
|
finding_indent: true,
|
||||||
pos: (0, 0),
|
pos: (0, 0),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -115,6 +118,10 @@ pub struct FormattingIter<'a> {
|
||||||
word_buf: Vec<(Cow<'a, str>, usize)>, // Printable character and its width.
|
word_buf: Vec<(Cow<'a, str>, usize)>, // Printable character and its width.
|
||||||
word_i: usize,
|
word_i: usize,
|
||||||
|
|
||||||
|
indent: usize, // Size of soft indent to use.
|
||||||
|
extra_indent: usize, // Additional amount to indent soft-wrapped lines.
|
||||||
|
finding_indent: bool,
|
||||||
|
|
||||||
pos: (usize, usize),
|
pos: (usize, usize),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -122,6 +129,10 @@ impl<'a> Iterator for FormattingIter<'a> {
|
||||||
type Item = (Cow<'a, str>, (usize, usize), usize);
|
type Item = (Cow<'a, str>, (usize, usize), usize);
|
||||||
|
|
||||||
fn next(&mut self) -> Option<Self::Item> {
|
fn next(&mut self) -> Option<Self::Item> {
|
||||||
|
if self.pos == (0, 0) {
|
||||||
|
self.pos = (0, self.indent);
|
||||||
|
}
|
||||||
|
|
||||||
// Get next word if necessary
|
// Get next word if necessary
|
||||||
if self.word_i >= self.word_buf.len() {
|
if self.word_i >= self.word_buf.len() {
|
||||||
let mut word_width = 0;
|
let mut word_width = 0;
|
||||||
|
@ -134,7 +145,19 @@ impl<'a> Iterator for FormattingIter<'a> {
|
||||||
word_width += width;
|
word_width += width;
|
||||||
|
|
||||||
if is_whitespace(&g) {
|
if is_whitespace(&g) {
|
||||||
|
if self.finding_indent {
|
||||||
|
if (self.indent + self.extra_indent + width + 2) > self.wrap_width {
|
||||||
|
// Cancel indentation if it's too long for the screen.
|
||||||
|
self.indent = 0;
|
||||||
|
self.extra_indent = 0;
|
||||||
|
self.finding_indent = false;
|
||||||
|
} else {
|
||||||
|
self.indent += width;
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
} else {
|
||||||
|
self.finding_indent = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -143,9 +166,9 @@ impl<'a> Iterator for FormattingIter<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Move to next line if necessary
|
// Move to next line if necessary
|
||||||
if (self.pos.1 + word_width) > self.wrap_width {
|
if (self.pos.1 + word_width) > self.wrap_width && (self.pos.1 > self.indent) {
|
||||||
if self.pos.1 > 0 {
|
if self.pos.1 > 0 {
|
||||||
self.pos = (self.pos.0 + 1, 0);
|
self.pos = (self.pos.0 + 1, self.indent + self.extra_indent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -165,7 +188,7 @@ impl<'a> Iterator for FormattingIter<'a> {
|
||||||
// grapheme.
|
// grapheme.
|
||||||
if (self.pos.1 + g_width) > self.wrap_width && self.pos.1 > 0 {
|
if (self.pos.1 + g_width) > self.wrap_width && self.pos.1 > 0 {
|
||||||
self.pos.0 += 1;
|
self.pos.0 += 1;
|
||||||
self.pos.1 = 0;
|
self.pos.1 = self.indent + self.extra_indent;
|
||||||
}
|
}
|
||||||
let pos = self.pos;
|
let pos = self.pos;
|
||||||
self.pos.1 += g_width;
|
self.pos.1 += g_width;
|
||||||
|
|
|
@ -632,8 +632,12 @@ impl TermUI {
|
||||||
let pos_x = editor
|
let pos_x = editor
|
||||||
.formatter
|
.formatter
|
||||||
.index_to_horizontal_v2d(&self.editor.buffer, self.editor.buffer.char_count());
|
.index_to_horizontal_v2d(&self.editor.buffer, self.editor.buffer.char_count());
|
||||||
let px = pos_x as isize + screen_col - editor.view_pos.1 as isize;
|
let mut px = pos_x as isize + screen_col - editor.view_pos.1 as isize;
|
||||||
let py = screen_line - 1;
|
let mut py = screen_line - 1;
|
||||||
|
if px > c2.1 as isize {
|
||||||
|
px = c1.1 as isize + screen_col;
|
||||||
|
py += 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (px >= c1.1 as isize)
|
if (px >= c1.1 as isize)
|
||||||
&& (py >= c1.0 as isize)
|
&& (py >= c1.0 as isize)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user