2018-01-08 15:11:12 +00:00
|
|
|
use super::Color;
|
|
|
|
use toml;
|
2018-01-17 17:35:57 +00:00
|
|
|
use enum_map::EnumMap;
|
2018-01-08 15:11:12 +00:00
|
|
|
|
|
|
|
/// Color configuration for the application.
|
|
|
|
///
|
|
|
|
/// Assign each color role an actual color.
|
2018-01-17 17:35:57 +00:00
|
|
|
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
|
2018-01-08 15:11:12 +00:00
|
|
|
pub struct Palette {
|
2018-01-17 17:35:57 +00:00
|
|
|
/// 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.
|
2018-01-17 17:35:57 +00:00
|
|
|
Background,
|
2018-01-08 15:11:12 +00:00
|
|
|
/// Color used for View shadows.
|
2018-01-17 17:35:57 +00:00
|
|
|
Shadow,
|
2018-01-08 15:11:12 +00:00
|
|
|
/// Color used for View backgrounds.
|
2018-01-17 17:35:57 +00:00
|
|
|
View,
|
2018-01-08 15:11:12 +00:00
|
|
|
/// Primary color used for the text.
|
2018-01-17 17:35:57 +00:00
|
|
|
Primary,
|
2018-01-08 15:11:12 +00:00
|
|
|
/// Secondary color used for the text.
|
2018-01-17 17:35:57 +00:00
|
|
|
Secondary,
|
2018-01-08 15:11:12 +00:00
|
|
|
/// Tertiary color used for the text.
|
2018-01-17 17:35:57 +00:00
|
|
|
Tertiary,
|
2018-01-08 15:11:12 +00:00
|
|
|
/// Primary color used for title text.
|
2018-01-17 17:35:57 +00:00
|
|
|
TitlePrimary,
|
2018-01-08 15:11:12 +00:00
|
|
|
/// Secondary color used for title text.
|
2018-01-17 17:35:57 +00:00
|
|
|
TitleSecondary,
|
2018-01-08 15:11:12 +00:00
|
|
|
/// Color used for highlighting text.
|
2018-01-17 17:35:57 +00:00
|
|
|
Highlight,
|
2018-01-08 15:11:12 +00:00
|
|
|
/// Color used for highlighting inactive text.
|
2018-01-17 17:35:57 +00:00
|
|
|
HighlightInactive,
|
2018-01-08 15:11:12 +00:00
|
|
|
}
|
|
|
|
|
2018-01-17 17:35:57 +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
|
|
|
|
}
|
|
|
|
}
|