Use ColorType::InheritParent in more places

This commit is contained in:
Alexandre Bury 2021-01-18 09:46:34 -08:00
parent c3c3d4096f
commit 2b4ee4df4f
3 changed files with 51 additions and 22 deletions

View File

@ -340,13 +340,9 @@ impl<'a, 'b> Printer<'a, 'b> {
let color = style.color; let color = style.color;
let effects = style.effects; let effects = style.effects;
if let Some(color) = color {
self.with_color(color, |printer| { self.with_color(color, |printer| {
printer.with_effects(effects, f); printer.with_effects(effects, f);
}); });
} else {
self.with_effects(effects, f);
}
} }
/// Call the given closure with a modified printer /// Call the given closure with a modified printer
@ -496,7 +492,7 @@ impl<'a, 'b> Printer<'a, 'b> {
ColorStyle::highlight_inactive() ColorStyle::highlight_inactive()
} }
} else { } else {
ColorStyle::primary() ColorStyle::inherit_parent()
}, },
f, f,
); );

View File

@ -5,7 +5,9 @@ use super::{BaseColor, Color, ColorPair, Palette, PaletteColor};
/// Represents a color pair role to use when printing something. /// Represents a color pair role to use when printing something.
/// ///
/// The current theme will assign each role a foreground and background color. /// The current theme will assign each role a foreground and background color.
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] ///
/// The `Default` value is to inherit the parent's colors.
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Default)]
pub struct ColorStyle { pub struct ColorStyle {
/// Color used for the foreground (the text itself). /// Color used for the foreground (the text itself).
pub front: ColorType, pub front: ColorType,
@ -42,6 +44,11 @@ impl ColorStyle {
Self::new(ColorType::InheritParent, back) Self::new(ColorType::InheritParent, back)
} }
/// Uses `ColorType::InheritParent` for both front and background.
pub fn inherit_parent() -> Self {
Self::new(ColorType::InheritParent, ColorType::InheritParent)
}
/// Style set by terminal before entering a Cursive program. /// Style set by terminal before entering a Cursive program.
pub fn terminal_default() -> Self { pub fn terminal_default() -> Self {
Self::new(Color::TerminalDefault, Color::TerminalDefault) Self::new(Color::TerminalDefault, Color::TerminalDefault)
@ -92,6 +99,16 @@ impl ColorStyle {
Self::new(PaletteColor::HighlightText, PaletteColor::HighlightInactive) Self::new(PaletteColor::HighlightText, PaletteColor::HighlightInactive)
} }
/// Merge the style `b` over style `a`.
///
/// This merges the front and back color types of `a` and `b`.
pub fn merge(a: Self, b: Self) -> Self {
ColorStyle {
front: ColorType::merge(a.front, b.front),
back: ColorType::merge(a.back, b.back),
}
}
/// Return the color pair that this style represents. /// Return the color pair that this style represents.
pub fn resolve( pub fn resolve(
&self, &self,
@ -107,25 +124,25 @@ impl ColorStyle {
impl From<Color> for ColorStyle { impl From<Color> for ColorStyle {
fn from(color: Color) -> Self { fn from(color: Color) -> Self {
Self::new(color, PaletteColor::View) Self::front(color)
} }
} }
impl From<BaseColor> for ColorStyle { impl From<BaseColor> for ColorStyle {
fn from(color: BaseColor) -> Self { fn from(color: BaseColor) -> Self {
Self::new(Color::Dark(color), PaletteColor::View) Self::front(Color::Dark(color))
} }
} }
impl From<PaletteColor> for ColorStyle { impl From<PaletteColor> for ColorStyle {
fn from(color: PaletteColor) -> Self { fn from(color: PaletteColor) -> Self {
Self::new(color, PaletteColor::View) Self::front(color)
} }
} }
impl From<ColorType> for ColorStyle { impl From<ColorType> for ColorStyle {
fn from(color: ColorType) -> Self { fn from(color: ColorType) -> Self {
Self::new(color, PaletteColor::View) Self::front(color)
} }
} }
@ -140,6 +157,8 @@ where
} }
/// Either a color from the palette, or a direct color. /// Either a color from the palette, or a direct color.
///
/// The `Default` implementation returns `InheritParent`.
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum ColorType { pub enum ColorType {
/// Uses a color from the application palette. /// Uses a color from the application palette.
@ -152,6 +171,12 @@ pub enum ColorType {
InheritParent, InheritParent,
} }
impl Default for ColorType {
fn default() -> Self {
ColorType::InheritParent
}
}
impl ColorType { impl ColorType {
/// Given a palette, resolve `self` to a concrete color. /// Given a palette, resolve `self` to a concrete color.
pub fn resolve(self, palette: &Palette, previous: Color) -> Color { pub fn resolve(self, palette: &Palette, previous: Color) -> Color {
@ -161,6 +186,17 @@ impl ColorType {
ColorType::InheritParent => previous, ColorType::InheritParent => previous,
} }
} }
/// Merge the color type `b` over the color type `a`.
///
/// This returns `b`, unless `b = ColorType::InheritParent`,
/// in which case it returns `a`.
pub fn merge(a: ColorType, b: ColorType) -> ColorType {
match b {
ColorType::InheritParent => a,
b => b,
}
}
} }
impl From<Color> for ColorType { impl From<Color> for ColorType {

View File

@ -16,7 +16,7 @@ pub struct Style {
/// Color style to apply. /// Color style to apply.
/// ///
/// `None` to keep using the previous colors. /// `None` to keep using the previous colors.
pub color: Option<ColorStyle>, pub color: ColorStyle,
} }
impl Default for Style { impl Default for Style {
@ -30,7 +30,7 @@ impl Style {
pub fn none() -> Self { pub fn none() -> Self {
Style { Style {
effects: EnumSet::new(), effects: EnumSet::new(),
color: None, color: ColorStyle::inherit_parent(),
} }
} }
@ -54,7 +54,7 @@ impl From<Effect> for Style {
fn from(effect: Effect) -> Self { fn from(effect: Effect) -> Self {
Style { Style {
effects: enum_set!(effect), effects: enum_set!(effect),
color: None, color: ColorStyle::inherit_parent(),
} }
} }
} }
@ -63,7 +63,7 @@ impl From<ColorStyle> for Style {
fn from(color: ColorStyle) -> Self { fn from(color: ColorStyle) -> Self {
Style { Style {
effects: EnumSet::new(), effects: EnumSet::new(),
color: Some(color), color,
} }
} }
} }
@ -91,14 +91,11 @@ impl From<ColorType> for Style {
/// Will use the last non-`None` color, and will combine all effects. /// Will use the last non-`None` color, and will combine all effects.
impl<'a> FromIterator<&'a Style> for Style { impl<'a> FromIterator<&'a Style> for Style {
fn from_iter<I: IntoIterator<Item = &'a Style>>(iter: I) -> Style { fn from_iter<I: IntoIterator<Item = &'a Style>>(iter: I) -> Style {
let mut color = None; let mut color = ColorStyle::inherit_parent();
let mut effects = EnumSet::new(); let mut effects = EnumSet::new();
for style in iter { for style in iter {
if style.color.is_some() { color = ColorStyle::merge(color, style.color);
color = style.color;
}
effects.insert_all(style.effects); effects.insert_all(style.effects);
} }