Support different kinds of underline rendering

Adds four new  modifiers that can be used in themes:

- undercurled
- underdashed
- underdotted
- double-underline
This commit is contained in:
Gokul Soumya 2022-07-09 03:35:06 +05:30 committed by Pascal Kuthe
parent c9584251f3
commit 999b45b28c
No known key found for this signature in database
GPG key ID: D715E8655AE166A6
3 changed files with 38 additions and 12 deletions

View file

@ -153,7 +153,7 @@ impl ModifierDiff {
if removed.contains(Modifier::ITALIC) { if removed.contains(Modifier::ITALIC) {
map_error(queue!(w, SetAttribute(CAttribute::NoItalic)))?; map_error(queue!(w, SetAttribute(CAttribute::NoItalic)))?;
} }
if removed.contains(Modifier::UNDERLINED) { if removed.intersects(Modifier::ANY_UNDERLINE) {
map_error(queue!(w, SetAttribute(CAttribute::NoUnderline)))?; map_error(queue!(w, SetAttribute(CAttribute::NoUnderline)))?;
} }
if removed.contains(Modifier::DIM) { if removed.contains(Modifier::DIM) {
@ -179,6 +179,18 @@ impl ModifierDiff {
if added.contains(Modifier::UNDERLINED) { if added.contains(Modifier::UNDERLINED) {
map_error(queue!(w, SetAttribute(CAttribute::Underlined)))?; map_error(queue!(w, SetAttribute(CAttribute::Underlined)))?;
} }
if added.contains(Modifier::UNDERCURLED) {
map_error(queue!(w, SetAttribute(CAttribute::Undercurled)))?;
}
if added.contains(Modifier::UNDERDOTTED) {
map_error(queue!(w, SetAttribute(CAttribute::Underdotted)))?;
}
if added.contains(Modifier::UNDERDASHED) {
map_error(queue!(w, SetAttribute(CAttribute::Underdashed)))?;
}
if added.contains(Modifier::DOUBLE_UNDERLINED) {
map_error(queue!(w, SetAttribute(CAttribute::DoubleUnderlined)))?;
}
if added.contains(Modifier::DIM) { if added.contains(Modifier::DIM) {
map_error(queue!(w, SetAttribute(CAttribute::Dim)))?; map_error(queue!(w, SetAttribute(CAttribute::Dim)))?;
} }

View file

@ -327,17 +327,27 @@ bitflags! {
/// ///
/// let m = Modifier::BOLD | Modifier::ITALIC; /// let m = Modifier::BOLD | Modifier::ITALIC;
/// ``` /// ```
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize), serde(rename_all = "kebab-case"))]
pub struct Modifier: u16 { pub struct Modifier: u16 {
const BOLD = 0b0000_0000_0001; const BOLD = 0b0000_0000_0000_0001;
const DIM = 0b0000_0000_0010; const DIM = 0b0000_0000_0000_0010;
const ITALIC = 0b0000_0000_0100; const ITALIC = 0b0000_0000_0000_0100;
const UNDERLINED = 0b0000_0000_1000; const UNDERLINED = 0b0000_0000_0000_1000;
const SLOW_BLINK = 0b0000_0001_0000; const SLOW_BLINK = 0b0000_0000_0001_0000;
const RAPID_BLINK = 0b0000_0010_0000; const RAPID_BLINK = 0b0000_0000_0010_0000;
const REVERSED = 0b0000_0100_0000; const REVERSED = 0b0000_0000_0100_0000;
const HIDDEN = 0b0000_1000_0000; const HIDDEN = 0b0000_0000_1000_0000;
const CROSSED_OUT = 0b0001_0000_0000; const CROSSED_OUT = 0b0000_0001_0000_0000;
const UNDERCURLED = 0b0000_0010_0000_0000;
const UNDERDOTTED = 0b0000_0100_0000_0000;
const UNDERDASHED = 0b0000_1000_0000_0000;
const DOUBLE_UNDERLINED = 0b0001_0000_0000_0000;
const ANY_UNDERLINE = Self::UNDERLINED.bits
| Self::UNDERCURLED.bits
| Self::UNDERDOTTED.bits
| Self::UNDERDASHED.bits
| Self::DOUBLE_UNDERLINED.bits;
} }
} }
@ -355,6 +365,10 @@ impl FromStr for Modifier {
"reversed" => Ok(Self::REVERSED), "reversed" => Ok(Self::REVERSED),
"hidden" => Ok(Self::HIDDEN), "hidden" => Ok(Self::HIDDEN),
"crossed_out" => Ok(Self::CROSSED_OUT), "crossed_out" => Ok(Self::CROSSED_OUT),
"undercurled" => Ok(Self::UNDERCURLED),
"underdotted" => Ok(Self::UNDERDOTTED),
"underdashed" => Ok(Self::UNDERDASHED),
"double_underlined" => Ok(Self::DOUBLE_UNDERLINED),
_ => Err("Invalid modifier"), _ => Err("Invalid modifier"),
} }
} }

View file

@ -39,7 +39,7 @@
"diff.delta" = "gold" "diff.delta" = "gold"
"diff.minus" = "red" "diff.minus" = "red"
diagnostic = { modifiers = ["underlined"] } diagnostic = { modifiers = ["undercurled"] }
"info" = { fg = "blue", modifiers = ["bold"] } "info" = { fg = "blue", modifiers = ["bold"] }
"hint" = { fg = "green", modifiers = ["bold"] } "hint" = { fg = "green", modifiers = ["bold"] }
"warning" = { fg = "yellow", modifiers = ["bold"] } "warning" = { fg = "yellow", modifiers = ["bold"] }