aboutsummaryrefslogtreecommitdiff
path: root/helix-tui
diff options
context:
space:
mode:
authorPascal Kuthe2022-10-01 00:15:25 +0000
committerPascal Kuthe2022-10-01 17:29:46 +0000
commit71ee589bbc723e7a55585ddc2ca43c29ee93fabe (patch)
treef64805cc305349a2430cae837355e7ef6ee7546c /helix-tui
parent79d3d44c3db48365597eefd274e868bc1e15de57 (diff)
make underline_style a seperate option
Underline styles are mutally exclusive and overwrite each other. Therefore implementing as an modifier lead to incorrect behaviour when the underline style is overwritten. For backwards compatability the "underline" modified is retained (but deprecated). Instead the "underline_style" and "underline_color" optios should be used to style underlines.
Diffstat (limited to 'helix-tui')
-rw-r--r--helix-tui/src/backend/crossterm.rs56
-rw-r--r--helix-tui/src/buffer.rs27
-rw-r--r--helix-tui/src/text.rs12
3 files changed, 49 insertions, 46 deletions
diff --git a/helix-tui/src/backend/crossterm.rs b/helix-tui/src/backend/crossterm.rs
index 3a50074e..3e6dc5f5 100644
--- a/helix-tui/src/backend/crossterm.rs
+++ b/helix-tui/src/backend/crossterm.rs
@@ -8,7 +8,7 @@ use crossterm::{
},
terminal::{self, Clear, ClearType},
};
-use helix_view::graphics::{Color, CursorKind, Modifier, Rect};
+use helix_view::graphics::{Color, CursorKind, Modifier, Rect, UnderlineStyle};
use std::io::{self, Write};
fn vte_version() -> Option<usize> {
@@ -80,7 +80,8 @@ where
{
let mut fg = Color::Reset;
let mut bg = Color::Reset;
- let mut underline = Color::Reset;
+ let mut underline_color = Color::Reset;
+ let mut underline_style = UnderlineStyle::Reset;
let mut modifier = Modifier::empty();
let mut last_pos: Option<(u16, u16)> = None;
for (x, y, cell) in content {
@@ -94,7 +95,7 @@ where
from: modifier,
to: cell.modifier,
};
- diff.queue(&mut self.buffer, self.capabilities)?;
+ diff.queue(&mut self.buffer)?;
modifier = cell.modifier;
}
if cell.fg != fg {
@@ -107,10 +108,24 @@ where
map_error(queue!(self.buffer, SetBackgroundColor(color)))?;
bg = cell.bg;
}
- if cell.underline != underline {
- let color = CColor::from(cell.underline);
+ if cell.underline_color != underline_color {
+ let color = CColor::from(cell.underline_color);
map_error(queue!(self.buffer, SetUnderlineColor(color)))?;
- underline = cell.underline;
+ underline_color = cell.underline_color;
+ }
+
+ let mut new_underline_style = cell.underline_style;
+ if !self.capabilities.has_extended_underlines {
+ match new_underline_style {
+ UnderlineStyle::Reset => (),
+ _ => new_underline_style = UnderlineStyle::Line,
+ }
+ }
+
+ if new_underline_style != underline_style {
+ let attr = CAttribute::from(cell.underline_style);
+ map_error(queue!(self.buffer, SetAttribute(attr)))?;
+ underline_style = new_underline_style;
}
map_error(queue!(self.buffer, Print(&cell.symbol)))?;
@@ -118,6 +133,7 @@ where
map_error(queue!(
self.buffer,
+ SetUnderlineColor(CColor::Reset),
SetForegroundColor(CColor::Reset),
SetBackgroundColor(CColor::Reset),
SetAttribute(CAttribute::Reset)
@@ -174,7 +190,7 @@ struct ModifierDiff {
}
impl ModifierDiff {
- fn queue<W>(&self, mut w: W, caps: Capabilities) -> io::Result<()>
+ fn queue<W>(&self, mut w: W) -> io::Result<()>
where
W: io::Write,
{
@@ -192,9 +208,6 @@ impl ModifierDiff {
if removed.contains(Modifier::ITALIC) {
map_error(queue!(w, SetAttribute(CAttribute::NoItalic)))?;
}
- if removed.intersects(Modifier::ANY_UNDERLINE) {
- map_error(queue!(w, SetAttribute(CAttribute::NoUnderline)))?;
- }
if removed.contains(Modifier::DIM) {
map_error(queue!(w, SetAttribute(CAttribute::NormalIntensity)))?;
}
@@ -205,14 +218,6 @@ impl ModifierDiff {
map_error(queue!(w, SetAttribute(CAttribute::NoBlink)))?;
}
- let queue_styled_underline = |styled_underline, w: &mut W| -> io::Result<()> {
- let underline = match caps.has_extended_underlines {
- true => styled_underline,
- false => CAttribute::Underlined,
- };
- map_error(queue!(w, SetAttribute(underline)))
- };
-
let added = self.to - self.from;
if added.contains(Modifier::REVERSED) {
map_error(queue!(w, SetAttribute(CAttribute::Reverse)))?;
@@ -223,21 +228,6 @@ impl ModifierDiff {
if added.contains(Modifier::ITALIC) {
map_error(queue!(w, SetAttribute(CAttribute::Italic)))?;
}
- if added.contains(Modifier::UNDERLINED) {
- map_error(queue!(w, SetAttribute(CAttribute::Underlined)))?;
- }
- if added.contains(Modifier::UNDERCURLED) {
- queue_styled_underline(CAttribute::Undercurled, &mut w)?;
- }
- if added.contains(Modifier::UNDERDOTTED) {
- queue_styled_underline(CAttribute::Underdotted, &mut w)?;
- }
- if added.contains(Modifier::UNDERDASHED) {
- queue_styled_underline(CAttribute::Underdashed, &mut w)?;
- }
- if added.contains(Modifier::DOUBLE_UNDERLINED) {
- queue_styled_underline(CAttribute::DoubleUnderlined, &mut w)?;
- }
if added.contains(Modifier::DIM) {
map_error(queue!(w, SetAttribute(CAttribute::Dim)))?;
}
diff --git a/helix-tui/src/buffer.rs b/helix-tui/src/buffer.rs
index 3036608d..424e6d32 100644
--- a/helix-tui/src/buffer.rs
+++ b/helix-tui/src/buffer.rs
@@ -3,7 +3,7 @@ use helix_core::unicode::width::UnicodeWidthStr;
use std::cmp::min;
use unicode_segmentation::UnicodeSegmentation;
-use helix_view::graphics::{Color, Modifier, Rect, Style};
+use helix_view::graphics::{Color, Modifier, Rect, Style, UnderlineStyle};
/// A buffer cell
#[derive(Debug, Clone, PartialEq)]
@@ -11,7 +11,8 @@ pub struct Cell {
pub symbol: String,
pub fg: Color,
pub bg: Color,
- pub underline: Color,
+ pub underline_color: Color,
+ pub underline_style: UnderlineStyle,
pub modifier: Modifier,
}
@@ -45,9 +46,13 @@ impl Cell {
if let Some(c) = style.bg {
self.bg = c;
}
- if let Some(c) = style.underline {
- self.underline = c;
+ if let Some(c) = style.underline_color {
+ self.underline_color = c;
}
+ if let Some(style) = style.underline_style {
+ self.underline_style = style;
+ }
+
self.modifier.insert(style.add_modifier);
self.modifier.remove(style.sub_modifier);
self
@@ -57,7 +62,8 @@ impl Cell {
Style::default()
.fg(self.fg)
.bg(self.bg)
- .underline(self.underline)
+ .underline_color(self.underline_color)
+ .underline_style(self.underline_style)
.add_modifier(self.modifier)
}
@@ -66,7 +72,8 @@ impl Cell {
self.symbol.push(' ');
self.fg = Color::Reset;
self.bg = Color::Reset;
- self.underline = Color::Reset;
+ self.underline_color = Color::Reset;
+ self.underline_style = UnderlineStyle::Reset;
self.modifier = Modifier::empty();
}
}
@@ -77,7 +84,8 @@ impl Default for Cell {
symbol: " ".into(),
fg: Color::Reset,
bg: Color::Reset,
- underline: Color::Reset,
+ underline_color: Color::Reset,
+ underline_style: UnderlineStyle::Reset,
modifier: Modifier::empty(),
}
}
@@ -94,7 +102,7 @@ impl Default for Cell {
///
/// ```
/// use helix_tui::buffer::{Buffer, Cell};
-/// use helix_view::graphics::{Rect, Color, Style, Modifier};
+/// use helix_view::graphics::{Rect, Color, UnderlineStyle, Style, Modifier};
///
/// let mut buf = Buffer::empty(Rect{x: 0, y: 0, width: 10, height: 5});
/// buf[(0, 2)].set_symbol("x");
@@ -104,7 +112,8 @@ impl Default for Cell {
/// symbol: String::from("r"),
/// fg: Color::Red,
/// bg: Color::White,
-/// underline: Color::Reset,
+/// underline_color: Color::Reset,
+/// underline_style: UnderlineStyle::Reset,
/// modifier: Modifier::empty(),
/// });
/// buf[(5, 0)].set_char('x');
diff --git a/helix-tui/src/text.rs b/helix-tui/src/text.rs
index 73d58803..1bfe5ee1 100644
--- a/helix-tui/src/text.rs
+++ b/helix-tui/src/text.rs
@@ -134,7 +134,8 @@ impl<'a> Span<'a> {
/// style: Style {
/// fg: Some(Color::Yellow),
/// bg: Some(Color::Black),
- /// underline: None,
+ /// underline_color: None,
+ /// underline_style: None,
/// add_modifier: Modifier::empty(),
/// sub_modifier: Modifier::empty(),
/// },
@@ -144,7 +145,8 @@ impl<'a> Span<'a> {
/// style: Style {
/// fg: Some(Color::Yellow),
/// bg: Some(Color::Black),
- /// underline: None,
+ /// underline_color: None,
+ /// underline_style: None,
/// add_modifier: Modifier::empty(),
/// sub_modifier: Modifier::empty(),
/// },
@@ -154,7 +156,8 @@ impl<'a> Span<'a> {
/// style: Style {
/// fg: Some(Color::Yellow),
/// bg: Some(Color::Black),
- /// underline: None,
+ /// underline_color: None,
+ /// underline_style: None,
/// add_modifier: Modifier::empty(),
/// sub_modifier: Modifier::empty(),
/// },
@@ -164,7 +167,8 @@ impl<'a> Span<'a> {
/// style: Style {
/// fg: Some(Color::Yellow),
/// bg: Some(Color::Black),
- /// underline: None,
+ /// underline_color: None,
+ /// underline_style: None,
/// add_modifier: Modifier::empty(),
/// sub_modifier: Modifier::empty(),
/// },