cursive/src/theme/palette.rs

137 lines
3.9 KiB
Rust
Raw Normal View History

2018-01-08 15:11:12 +00:00
use super::Color;
use toml;
use enum_map::EnumMap;
2018-01-08 15:11:12 +00:00
/// Color configuration for the application.
///
/// Assign each color role an actual color.
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
2018-01-08 15:11:12 +00:00
pub struct Palette {
/// Color map for this palette
pub colors: EnumMap<PaletteColor, Color>,
}
impl Default for Palette {
fn default() -> Self {
use self::PaletteColor::*;
use theme::Color::*;
use theme::BaseColor::*;
Palette {
colors: enum_map!{
Background => Dark(Blue),
Shadow => Dark(Black),
View => Dark(White),
Primary => Dark(Black),
Secondary => Dark(Blue),
Tertiary => Dark(White),
TitlePrimary => Dark(Red),
TitleSecondary => Dark(Yellow),
Highlight => Dark(Red),
HighlightInactive => Dark(Blue),
}
}
}
}
impl Palette {
/// Fills `self` with the colors from the given `table`.
pub(crate) fn load(&mut self, table: &toml::value::Table) {
// TODO: use serde for that?
// Problem: toml-rs doesn't do well with Enums...
load_color(
&mut self.colors[PaletteColor::Background],
table.get("background"),
);
load_color(
&mut self.colors[PaletteColor::Shadow],
table.get("shadow"),
);
load_color(&mut self.colors[PaletteColor::View], table.get("view"));
load_color(
&mut self.colors[PaletteColor::Primary],
table.get("primary"),
);
load_color(
&mut self.colors[PaletteColor::Secondary],
table.get("secondary"),
);
load_color(
&mut self.colors[PaletteColor::Tertiary],
table.get("tertiary"),
);
load_color(
&mut self.colors[PaletteColor::TitlePrimary],
table.get("title_primary"),
);
load_color(
&mut self.colors[PaletteColor::TitleSecondary],
table.get("title_secondary"),
);
load_color(
&mut self.colors[PaletteColor::Highlight],
table.get("highlight"),
);
load_color(
&mut self.colors[PaletteColor::HighlightInactive],
table.get("highlight_inactive"),
);
}
}
/// Color entry in a palette.
///
/// Each ColorRole is used for a specific role in a default application.
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, EnumMap)]
pub enum PaletteColor {
2018-01-08 15:11:12 +00:00
/// Color used for the application background.
Background,
2018-01-08 15:11:12 +00:00
/// Color used for View shadows.
Shadow,
2018-01-08 15:11:12 +00:00
/// Color used for View backgrounds.
View,
2018-01-08 15:11:12 +00:00
/// Primary color used for the text.
Primary,
2018-01-08 15:11:12 +00:00
/// Secondary color used for the text.
Secondary,
2018-01-08 15:11:12 +00:00
/// Tertiary color used for the text.
Tertiary,
2018-01-08 15:11:12 +00:00
/// Primary color used for title text.
TitlePrimary,
2018-01-08 15:11:12 +00:00
/// Secondary color used for title text.
TitleSecondary,
2018-01-08 15:11:12 +00:00
/// Color used for highlighting text.
Highlight,
2018-01-08 15:11:12 +00:00
/// Color used for highlighting inactive text.
HighlightInactive,
2018-01-08 15:11:12 +00:00
}
impl PaletteColor {
/// Given a palette, resolve `self` to a concrete color.
pub fn resolve(self, palette: &Palette) -> Color {
palette.colors[self]
2018-01-08 15:11:12 +00:00
}
}
/// Parses `value` and fills `target` if it's a valid color.
fn load_color(target: &mut Color, value: Option<&toml::Value>) -> bool {
if let Some(value) = value {
match *value {
toml::Value::String(ref value) => {
if let Some(color) = Color::parse(value) {
*target = color;
true
} else {
false
}
}
toml::Value::Array(ref array) => {
array.iter().any(|item| load_color(target, Some(item)))
}
_ => false,
}
} else {
false
}
}