Add separate color for underlines

pull/4061/head
A-Walrus 2 years ago committed by Pascal Kuthe
parent 999b45b28c
commit 3ad7d543ca
No known key found for this signature in database
GPG Key ID: D715E8655AE166A6

@ -4,7 +4,7 @@ use crossterm::{
execute, queue, execute, queue,
style::{ style::{
Attribute as CAttribute, Color as CColor, Print, SetAttribute, SetBackgroundColor, Attribute as CAttribute, Color as CColor, Print, SetAttribute, SetBackgroundColor,
SetForegroundColor, SetForegroundColor, SetUnderlineColor,
}, },
terminal::{self, Clear, ClearType}, terminal::{self, Clear, ClearType},
}; };
@ -47,6 +47,7 @@ where
{ {
let mut fg = Color::Reset; let mut fg = Color::Reset;
let mut bg = Color::Reset; let mut bg = Color::Reset;
let mut underline = Color::Reset;
let mut modifier = Modifier::empty(); let mut modifier = Modifier::empty();
let mut last_pos: Option<(u16, u16)> = None; let mut last_pos: Option<(u16, u16)> = None;
for (x, y, cell) in content { for (x, y, cell) in content {
@ -73,6 +74,11 @@ where
map_error(queue!(self.buffer, SetBackgroundColor(color)))?; map_error(queue!(self.buffer, SetBackgroundColor(color)))?;
bg = cell.bg; bg = cell.bg;
} }
if cell.underline != underline {
let color = CColor::from(cell.underline);
map_error(queue!(self.buffer, SetUnderlineColor(color)))?;
underline = cell.underline;
}
map_error(queue!(self.buffer, Print(&cell.symbol)))?; map_error(queue!(self.buffer, Print(&cell.symbol)))?;
} }

@ -11,6 +11,7 @@ pub struct Cell {
pub symbol: String, pub symbol: String,
pub fg: Color, pub fg: Color,
pub bg: Color, pub bg: Color,
pub underline: Color,
pub modifier: Modifier, pub modifier: Modifier,
} }
@ -44,6 +45,9 @@ impl Cell {
if let Some(c) = style.bg { if let Some(c) = style.bg {
self.bg = c; self.bg = c;
} }
if let Some(c) = style.underline {
self.underline = c;
}
self.modifier.insert(style.add_modifier); self.modifier.insert(style.add_modifier);
self.modifier.remove(style.sub_modifier); self.modifier.remove(style.sub_modifier);
self self
@ -53,6 +57,7 @@ impl Cell {
Style::default() Style::default()
.fg(self.fg) .fg(self.fg)
.bg(self.bg) .bg(self.bg)
.underline(self.bg)
.add_modifier(self.modifier) .add_modifier(self.modifier)
} }
@ -61,6 +66,7 @@ impl Cell {
self.symbol.push(' '); self.symbol.push(' ');
self.fg = Color::Reset; self.fg = Color::Reset;
self.bg = Color::Reset; self.bg = Color::Reset;
self.underline = Color::Reset;
self.modifier = Modifier::empty(); self.modifier = Modifier::empty();
} }
} }
@ -71,6 +77,7 @@ impl Default for Cell {
symbol: " ".into(), symbol: " ".into(),
fg: Color::Reset, fg: Color::Reset,
bg: Color::Reset, bg: Color::Reset,
underline: Color::Reset,
modifier: Modifier::empty(), modifier: Modifier::empty(),
} }
} }

@ -440,6 +440,7 @@ impl FromStr for Modifier {
pub struct Style { pub struct Style {
pub fg: Option<Color>, pub fg: Option<Color>,
pub bg: Option<Color>, pub bg: Option<Color>,
pub underline: Option<Color>,
pub add_modifier: Modifier, pub add_modifier: Modifier,
pub sub_modifier: Modifier, pub sub_modifier: Modifier,
} }
@ -449,6 +450,7 @@ impl Default for Style {
Style { Style {
fg: None, fg: None,
bg: None, bg: None,
underline: None,
add_modifier: Modifier::empty(), add_modifier: Modifier::empty(),
sub_modifier: Modifier::empty(), sub_modifier: Modifier::empty(),
} }
@ -461,6 +463,7 @@ impl Style {
Style { Style {
fg: Some(Color::Reset), fg: Some(Color::Reset),
bg: Some(Color::Reset), bg: Some(Color::Reset),
underline: Some(Color::Reset),
add_modifier: Modifier::empty(), add_modifier: Modifier::empty(),
sub_modifier: Modifier::all(), sub_modifier: Modifier::all(),
} }
@ -496,6 +499,21 @@ impl Style {
self self
} }
/// Changes the underline color.
///
/// ## Examples
///
/// ```rust
/// # use helix_view::graphics::{Color, Style};
/// let style = Style::default().underline(Color::Blue);
/// let diff = Style::default().underline(Color::Red);
/// assert_eq!(style.patch(diff), Style::default().underline(Color::Red));
/// ```
pub fn underline(mut self, color: Color) -> Style {
self.underline = Some(color);
self
}
/// Changes the text emphasis. /// Changes the text emphasis.
/// ///
/// When applied, it adds the given modifier to the `Style` modifiers. /// When applied, it adds the given modifier to the `Style` modifiers.
@ -552,6 +570,7 @@ impl Style {
pub fn patch(mut self, other: Style) -> Style { pub fn patch(mut self, other: Style) -> Style {
self.fg = other.fg.or(self.fg); self.fg = other.fg.or(self.fg);
self.bg = other.bg.or(self.bg); self.bg = other.bg.or(self.bg);
self.underline = other.underline.or(self.underline);
self.add_modifier.remove(other.sub_modifier); self.add_modifier.remove(other.sub_modifier);
self.add_modifier.insert(other.add_modifier); self.add_modifier.insert(other.add_modifier);

@ -269,6 +269,7 @@ impl ThemePalette {
match name.as_str() { match name.as_str() {
"fg" => *style = style.fg(self.parse_color(value)?), "fg" => *style = style.fg(self.parse_color(value)?),
"bg" => *style = style.bg(self.parse_color(value)?), "bg" => *style = style.bg(self.parse_color(value)?),
"underline" => *style = style.underline(self.parse_color(value)?),
"modifiers" => { "modifiers" => {
let modifiers = value let modifiers = value
.as_array() .as_array()

@ -92,7 +92,8 @@
"info" = { fg = "light_blue" } "info" = { fg = "light_blue" }
"hint" = { fg = "light_gray3" } "hint" = { fg = "light_gray3" }
diagnostic = { modifiers = ["underlined"] } "diagnostic.error" = {underline = "red", modifiers = ["undercurled"] }
"diagnostic" = {underline = "gold", modifiers = ["undercurled"] }
[palette] [palette]
white = "#ffffff" white = "#ffffff"

Loading…
Cancel
Save