[WIP] Implement --config option
This commit is contained in:
parent
ca583bddcb
commit
66b57cfea6
7 changed files with 1313 additions and 376 deletions
|
|
@ -12,10 +12,8 @@ default-run = "hyfetch"
|
|||
[dependencies]
|
||||
aho-corasick = { workspace = true, features = ["perf-literal", "std"] }
|
||||
ansi_colours = { workspace = true, features = [] }
|
||||
# anstream = { workspace = true, features = ["auto"] }
|
||||
anyhow = { workspace = true, features = ["std"] }
|
||||
bpaf = { workspace = true, features = [] }
|
||||
chrono = { workspace = true, features = ["clock", "std"] }
|
||||
deranged = { workspace = true, features = ["serde", "std"] }
|
||||
directories = { workspace = true, features = [] }
|
||||
indexmap = { workspace = true, features = ["serde", "std"] }
|
||||
|
|
@ -25,8 +23,12 @@ serde_json = { workspace = true, features = ["std"] }
|
|||
serde_path_to_error = { workspace = true, features = [] }
|
||||
shell-words = { workspace = true, features = ["std"] }
|
||||
strum = { workspace = true, features = ["derive", "std"] }
|
||||
supports-color = { workspace = true, features = [] }
|
||||
tempfile = { workspace = true, features = [] }
|
||||
termbg = { workspace = true, features = [] }
|
||||
terminal_size = { workspace = true, features = [] }
|
||||
thiserror = { workspace = true, features = [] }
|
||||
time = { workspace = true, features = ["local-offset", "std"] }
|
||||
tracing = { workspace = true, features = ["attributes", "std"] }
|
||||
tracing-subscriber = { workspace = true, features = ["ansi", "fmt", "smallvec", "std", "tracing-log"] }
|
||||
unicode-segmentation = { workspace = true, features = [] }
|
||||
|
|
|
|||
|
|
@ -1,17 +1,23 @@
|
|||
use std::fmt;
|
||||
use std::borrow::Cow;
|
||||
use std::cmp;
|
||||
use std::fs::{self, File};
|
||||
use std::io::{self, ErrorKind, IsTerminal, Read};
|
||||
use std::path::Path;
|
||||
|
||||
use anyhow::{Context, Result};
|
||||
use chrono::Datelike;
|
||||
use hyfetch::cli_options::options;
|
||||
use hyfetch::color_util::{clear_screen, color, printc, ForegroundBackground, Theme};
|
||||
use hyfetch::models::Config;
|
||||
#[cfg(windows)]
|
||||
use hyfetch::neofetch_util::ensure_git_bash;
|
||||
use hyfetch::neofetch_util::{self, get_distro_ascii, ColorAlignment};
|
||||
use hyfetch::presets::AssignLightness;
|
||||
use hyfetch::neofetch_util::{self, ascii_size, get_distro_ascii, ColorAlignment};
|
||||
use hyfetch::presets::{AssignLightness, Preset};
|
||||
use hyfetch::types::{AnsiMode, LightDark};
|
||||
use hyfetch::utils::get_cache_path;
|
||||
use palette::Srgb;
|
||||
use strum::{EnumCount, VariantArray, VariantNames};
|
||||
use terminal_size::terminal_size;
|
||||
use time::{Month, OffsetDateTime};
|
||||
use tracing::debug;
|
||||
|
||||
fn main() -> Result<()> {
|
||||
|
|
@ -39,21 +45,24 @@ fn main() -> Result<()> {
|
|||
}
|
||||
|
||||
let config = if options.config {
|
||||
create_config(options.config_file).context("failed to create config")?
|
||||
create_config(distro, &options.config_file, options.debug)
|
||||
.context("failed to create config")?
|
||||
} else if let Some(config) =
|
||||
read_config(&options.config_file).context("failed to read config")?
|
||||
{
|
||||
config
|
||||
} else {
|
||||
create_config(options.config_file).context("failed to create config")?
|
||||
create_config(distro, &options.config_file, options.debug)
|
||||
.context("failed to create config")?
|
||||
};
|
||||
|
||||
// Check if it's June (pride month)
|
||||
let now = chrono::Local::now();
|
||||
let now =
|
||||
OffsetDateTime::now_local().context("failed to get current datetime in local timezone")?;
|
||||
let cache_path = get_cache_path().context("failed to get cache path")?;
|
||||
let june_path = cache_path.join(format!("animation-displayed-{}", now.year()));
|
||||
let show_pride_month =
|
||||
options.june || now.month() == 6 && !june_path.is_file() && io::stdout().is_terminal();
|
||||
let show_pride_month = options.june
|
||||
|| now.month() == Month::June && !june_path.is_file() && io::stdout().is_terminal();
|
||||
|
||||
if show_pride_month && !config.pride_month_disable {
|
||||
// TODO
|
||||
|
|
@ -134,12 +143,7 @@ fn main() -> Result<()> {
|
|||
///
|
||||
/// Returns `None` if the config file does not exist.
|
||||
#[tracing::instrument(level = "debug")]
|
||||
fn read_config<P>(path: P) -> Result<Option<Config>>
|
||||
where
|
||||
P: AsRef<Path> + fmt::Debug,
|
||||
{
|
||||
let path = path.as_ref();
|
||||
|
||||
fn read_config(path: &Path) -> Result<Option<Config>> {
|
||||
let mut file = match File::open(path) {
|
||||
Ok(file) => file,
|
||||
Err(err) if err.kind() == ErrorKind::NotFound => {
|
||||
|
|
@ -168,10 +172,229 @@ where
|
|||
///
|
||||
/// The config is automatically stored to file.
|
||||
#[tracing::instrument(level = "debug")]
|
||||
fn create_config<P>(path: P) -> Result<Config>
|
||||
where
|
||||
P: AsRef<Path> + fmt::Debug,
|
||||
{
|
||||
fn create_config(distro: Option<&String>, path: &Path, debug_: bool) -> Result<Config> {
|
||||
// Detect terminal environment (doesn't work for all terminal emulators,
|
||||
// especially on Windows)
|
||||
let det_bg = match termbg::rgb(std::time::Duration::from_millis(100)) {
|
||||
Ok(rgb) => Some(Srgb::<u16>::new(rgb.r, rgb.g, rgb.b).into_format::<u8>()),
|
||||
Err(termbg::Error::Unsupported) => None,
|
||||
Err(err) => {
|
||||
return Err(err).context("failed to get background color");
|
||||
},
|
||||
};
|
||||
debug!(?det_bg, "detected background color");
|
||||
let det_ansi = supports_color::on(supports_color::Stream::Stdout).map(|color_level| {
|
||||
if color_level.has_16m {
|
||||
AnsiMode::Rgb
|
||||
} else if color_level.has_256 {
|
||||
AnsiMode::Ansi256
|
||||
} else if color_level.has_basic {
|
||||
AnsiMode::Ansi16
|
||||
} else {
|
||||
unreachable!();
|
||||
}
|
||||
});
|
||||
debug!(?det_ansi, "detected color mode");
|
||||
|
||||
let (asc, fore_back) = get_distro_ascii(distro).context("failed to get distro ascii")?;
|
||||
let (asc_width, asc_lines) = ascii_size(asc);
|
||||
let theme = det_bg.map(|bg| bg.theme()).unwrap_or(LightDark::Light);
|
||||
let color_mode = det_ansi.unwrap_or(AnsiMode::Ansi256);
|
||||
let logo = color(
|
||||
match theme {
|
||||
LightDark::Light => "&l&bhyfetch&~&L",
|
||||
LightDark::Dark => "&l&bhy&ffetch&~&L",
|
||||
},
|
||||
color_mode,
|
||||
)
|
||||
.expect("logo should not contain invalid color codes");
|
||||
let mut title = format!("Welcome to {logo} Let's set up some colors first.");
|
||||
clear_screen(Some(&title), color_mode, debug_)
|
||||
.expect("title should not contain invalid color codes");
|
||||
|
||||
let mut option_counter: u8 = 1;
|
||||
|
||||
fn update_title(title: &mut String, option_counter: &mut u8, k: &str, v: &str) {
|
||||
let k: Cow<str> = if k.ends_with(':') {
|
||||
k.into()
|
||||
} else {
|
||||
format!("{k}:").into()
|
||||
};
|
||||
title.push_str({
|
||||
let pad = " ".repeat(30 - k.len());
|
||||
&format!("\n&e{option_counter}. {k}{pad} &~{v}")
|
||||
});
|
||||
*option_counter += 1;
|
||||
}
|
||||
|
||||
fn print_title_prompt(option_counter: u8, prompt: &str, color_mode: AnsiMode) {
|
||||
printc(format!("&a{option_counter}. {prompt}"), color_mode)
|
||||
.expect("prompt should not contain invalid color codes");
|
||||
}
|
||||
|
||||
//////////////////////////////
|
||||
// 0. Check term size
|
||||
|
||||
// TODO
|
||||
|
||||
//////////////////////////////
|
||||
// 1. Select color system
|
||||
let select_color_system = || -> Result<(AnsiMode, &str)> {
|
||||
if det_ansi == Some(AnsiMode::Rgb) {
|
||||
return Ok((AnsiMode::Rgb, "Detected color mode"));
|
||||
}
|
||||
|
||||
clear_screen(Some(&title), color_mode, debug_)
|
||||
.expect("title should not contain invalid color codes");
|
||||
|
||||
// TODO
|
||||
|
||||
println!();
|
||||
print_title_prompt(
|
||||
option_counter,
|
||||
"Which &bcolor system &ado you want to use?",
|
||||
color_mode,
|
||||
);
|
||||
printc(
|
||||
r#"(If you can't see colors under "RGB Color Testing", please choose 8bit)"#,
|
||||
color_mode,
|
||||
)
|
||||
.expect("message should not contain invalid color codes");
|
||||
println!();
|
||||
|
||||
todo!()
|
||||
};
|
||||
|
||||
let color_mode = {
|
||||
let (color_system, ttl) = select_color_system().context("failed to select color system")?;
|
||||
debug!(?color_system, "selected color mode");
|
||||
update_title(&mut title, &mut option_counter, ttl, color_system.into());
|
||||
color_system
|
||||
};
|
||||
|
||||
//////////////////////////////
|
||||
// 2. Select light/dark mode
|
||||
let select_light_dark = || -> Result<(LightDark, &str)> {
|
||||
if let Some(det_bg) = det_bg {
|
||||
return Ok((det_bg.theme(), "Detected background color"));
|
||||
}
|
||||
|
||||
clear_screen(Some(&title), color_mode, debug_)
|
||||
.expect("title should not contain invalid color codes");
|
||||
|
||||
todo!()
|
||||
};
|
||||
|
||||
let theme = {
|
||||
let (light_dark, ttl) =
|
||||
select_light_dark().context("failed to select light / dark mode")?;
|
||||
debug!(?light_dark, "selected theme");
|
||||
update_title(&mut title, &mut option_counter, ttl, light_dark.into());
|
||||
light_dark
|
||||
};
|
||||
|
||||
//////////////////////////////
|
||||
// 3. Choose preset
|
||||
// Create flag lines
|
||||
let mut flags = Vec::with_capacity(Preset::COUNT);
|
||||
let spacing = {
|
||||
let Some(spacing) = <Preset as VariantNames>::VARIANTS
|
||||
.iter()
|
||||
.map(|name| name.chars().count())
|
||||
.max()
|
||||
else {
|
||||
unreachable!();
|
||||
};
|
||||
let spacing: u8 = spacing.try_into().expect("`spacing` should fit in `u8`");
|
||||
cmp::max(spacing, 20)
|
||||
};
|
||||
for preset in <Preset as VariantArray>::VARIANTS {
|
||||
let color_profile = preset.color_profile();
|
||||
let flag = color_profile
|
||||
.color_text(
|
||||
" ".repeat(spacing as usize),
|
||||
color_mode,
|
||||
ForegroundBackground::Background,
|
||||
false,
|
||||
)
|
||||
.with_context(|| format!("failed to color flag using preset: {preset:?}"))?;
|
||||
let name = {
|
||||
let name: &'static str = preset.into();
|
||||
let name_len = name.chars().count();
|
||||
let name_len: u8 = name_len.try_into().expect("`name_len` should fit in `u8`");
|
||||
let pad_start = " ".repeat(((spacing - name_len) / 2) as usize);
|
||||
let pad_end =
|
||||
" ".repeat(((spacing - name_len) / 2 + (spacing - name_len) % 2) as usize);
|
||||
format!("{pad_start}{name}{pad_end}")
|
||||
};
|
||||
flags.push([name, flag.clone(), flag.clone(), flag]);
|
||||
}
|
||||
|
||||
// Calculate flags per row
|
||||
let (flags_per_row, rows_per_page) = {
|
||||
let (term_w, term_h) = terminal_size().context("failed to get terminal size")?;
|
||||
let flags_per_row = term_w.0 / (spacing as u16 + 2);
|
||||
let flags_per_row: u8 = flags_per_row
|
||||
.try_into()
|
||||
.expect("`flags_per_row` should fit in `u8`");
|
||||
let rows_per_page = ((term_h.0 - 13) as f32 / 5.0).floor() as usize;
|
||||
let rows_per_page: u8 = rows_per_page
|
||||
.try_into()
|
||||
.expect("`rows_per_page` should fit in `u8`");
|
||||
let rows_per_page = cmp::max(1, rows_per_page);
|
||||
(flags_per_row, rows_per_page)
|
||||
};
|
||||
let num_pages = (Preset::COUNT as f32 / (flags_per_row * rows_per_page) as f32).ceil() as usize;
|
||||
let num_pages: u8 = num_pages
|
||||
.try_into()
|
||||
.expect("`num_pages` should fit in `u8`");
|
||||
|
||||
// Create pages
|
||||
let mut pages = Vec::with_capacity(num_pages as usize);
|
||||
for flags in flags.chunks((flags_per_row * rows_per_page) as usize) {
|
||||
let mut page = Vec::with_capacity(rows_per_page as usize);
|
||||
for flags in flags.chunks(flags_per_row as usize) {
|
||||
page.push(flags);
|
||||
}
|
||||
pages.push(page);
|
||||
}
|
||||
|
||||
let print_flag_row = |row: &[[String; 4]]| {
|
||||
for i in 0..4 {
|
||||
let mut line = String::new();
|
||||
for flag in row {
|
||||
line.push_str(&flag[i]);
|
||||
line.push_str(" ");
|
||||
}
|
||||
printc(line, color_mode).expect("flag line should not contain invalid color codes");
|
||||
}
|
||||
println!();
|
||||
};
|
||||
|
||||
let print_flag_page = |page, page_num| {
|
||||
clear_screen(Some(&title), color_mode, debug_)
|
||||
.expect("title should not contain invalid color codes");
|
||||
print_title_prompt(option_counter, "Let's choose a flag!", color_mode);
|
||||
printc("Available flag presets:", color_mode)
|
||||
.expect("prompt should not contain invalid color codes");
|
||||
{
|
||||
let page_num = page_num + 1;
|
||||
println!("Page: {page_num} of {num_pages}");
|
||||
}
|
||||
println!();
|
||||
for &row in page {
|
||||
print_flag_row(row);
|
||||
}
|
||||
println!();
|
||||
};
|
||||
|
||||
let page: u8 = 0;
|
||||
loop {
|
||||
print_flag_page(&pages[page as usize], page);
|
||||
|
||||
todo!();
|
||||
}
|
||||
|
||||
todo!()
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -6,11 +6,11 @@ use aho_corasick::AhoCorasick;
|
|||
use ansi_colours::AsRGB;
|
||||
use anyhow::{anyhow, Context, Result};
|
||||
use deranged::RangedU8;
|
||||
use palette::Srgb;
|
||||
use palette::{IntoColorMut, LinSrgb, Okhsl, Srgb};
|
||||
use serde::{Deserialize, Serialize};
|
||||
use thiserror::Error;
|
||||
|
||||
use crate::types::AnsiMode;
|
||||
use crate::types::{AnsiMode, LightDark};
|
||||
|
||||
const MINECRAFT_COLORS: [(&str, &str); 30] = [
|
||||
// Minecraft formatting codes
|
||||
|
|
@ -53,10 +53,12 @@ const RGB_COLOR_PATTERNS: [&str; 2] = ["&gf(", "&gb("];
|
|||
static MINECRAFT_COLORS_AC: OnceLock<(AhoCorasick, Box<[&str; 30]>)> = OnceLock::new();
|
||||
static RGB_COLORS_AC: OnceLock<AhoCorasick> = OnceLock::new();
|
||||
|
||||
/// Represents the lightness component in HSL.
|
||||
/// Represents the lightness component in [`Okhsl`].
|
||||
///
|
||||
/// The range of valid values is
|
||||
/// `(`[`Lightness::MIN`]`..=`[`Lightness::MAX`]`)`.
|
||||
///
|
||||
/// [`Okhsl`]: palette::Okhsl
|
||||
#[derive(Copy, Clone, PartialEq, PartialOrd, Debug, Deserialize, Serialize)]
|
||||
pub struct Lightness(f32);
|
||||
|
||||
|
|
@ -110,9 +112,13 @@ pub trait ToAnsiString {
|
|||
-> String;
|
||||
}
|
||||
|
||||
pub trait Theme {
|
||||
fn theme(&self) -> LightDark;
|
||||
}
|
||||
|
||||
impl Lightness {
|
||||
const MAX: f32 = 1.0f32;
|
||||
const MIN: f32 = 0.0f32;
|
||||
pub const MAX: f32 = 1.0f32;
|
||||
pub const MIN: f32 = 0.0f32;
|
||||
|
||||
pub fn new(value: f32) -> Result<Self, LightnessError> {
|
||||
if !(Self::MIN..=Self::MAX).contains(&value) {
|
||||
|
|
@ -146,8 +152,8 @@ impl From<Lightness> for f32 {
|
|||
}
|
||||
|
||||
impl NeofetchAsciiIndexedColor {
|
||||
const MAX: u8 = 6;
|
||||
const MIN: u8 = 1;
|
||||
pub const MAX: u8 = 6;
|
||||
pub const MIN: u8 = 1;
|
||||
}
|
||||
|
||||
impl TryFrom<u8> for NeofetchAsciiIndexedColor {
|
||||
|
|
@ -212,6 +218,25 @@ impl ToAnsiString for Srgb<u8> {
|
|||
let indexed = rgb.to_ansi256();
|
||||
format!("\x1b[{c};5;{indexed}m")
|
||||
},
|
||||
AnsiMode::Ansi16 => {
|
||||
unimplemented!();
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Theme for Srgb<u8> {
|
||||
fn theme(&self) -> LightDark {
|
||||
let mut rgb_f32_color: LinSrgb = self.into_linear();
|
||||
|
||||
{
|
||||
let okhsl_f32_color: &mut Okhsl = &mut rgb_f32_color.into_color_mut();
|
||||
|
||||
if okhsl_f32_color.lightness > 0.5 {
|
||||
LightDark::Light
|
||||
} else {
|
||||
LightDark::Dark
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -311,3 +336,31 @@ where
|
|||
|
||||
Ok(dst)
|
||||
}
|
||||
|
||||
pub fn printc<S>(msg: S, mode: AnsiMode) -> Result<()>
|
||||
where
|
||||
S: AsRef<str>,
|
||||
{
|
||||
let msg = msg.as_ref();
|
||||
|
||||
println!(
|
||||
"{}",
|
||||
color(format!("{msg}&r"), mode).context("failed to color message")?
|
||||
);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn clear_screen(title: Option<&str>, mode: AnsiMode, debug: bool) -> Result<()> {
|
||||
if !debug {
|
||||
print!("\x1b[2J\x1b[H");
|
||||
}
|
||||
|
||||
if let Some(title) = title {
|
||||
println!();
|
||||
printc(title, mode).context("failed to color title")?;
|
||||
println!();
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,88 +2,158 @@ use std::iter;
|
|||
|
||||
use anyhow::{anyhow, Context, Result};
|
||||
use indexmap::IndexSet;
|
||||
use palette::encoding::{self, Linear};
|
||||
use palette::num::ClampAssign;
|
||||
use palette::{Hsl, IntoColorMut, LinSrgb, Srgb};
|
||||
use palette::{IntoColorMut, LinSrgb, Okhsl, Srgb};
|
||||
use serde::{Deserialize, Serialize};
|
||||
use strum::{EnumString, VariantNames};
|
||||
use strum::{EnumCount, EnumString, IntoStaticStr, VariantArray, VariantNames};
|
||||
use tracing::debug;
|
||||
use unicode_segmentation::UnicodeSegmentation;
|
||||
|
||||
use crate::color_util::{ForegroundBackground, Lightness, ToAnsiString};
|
||||
use crate::types::{AnsiMode, LightDark};
|
||||
|
||||
#[derive(Copy, Clone, Hash, Debug, Deserialize, EnumString, Serialize, VariantNames)]
|
||||
#[derive(
|
||||
Copy,
|
||||
Clone,
|
||||
Hash,
|
||||
Debug,
|
||||
Deserialize,
|
||||
EnumCount,
|
||||
EnumString,
|
||||
IntoStaticStr,
|
||||
Serialize,
|
||||
VariantArray,
|
||||
VariantNames,
|
||||
)]
|
||||
#[serde(rename_all = "kebab-case")]
|
||||
#[strum(serialize_all = "kebab-case")]
|
||||
pub enum Preset {
|
||||
Abrosexual,
|
||||
Rainbow,
|
||||
|
||||
Transgender,
|
||||
|
||||
Nonbinary,
|
||||
|
||||
Xenogender,
|
||||
|
||||
Agender,
|
||||
Akiosexual,
|
||||
Androsexual,
|
||||
Aroace1,
|
||||
Aroace2,
|
||||
Aroace3,
|
||||
Aromantic,
|
||||
Asexual,
|
||||
Autoromantic,
|
||||
Autosexual,
|
||||
/// Colors from Gilbert Baker's original 1978 flag design
|
||||
Baker,
|
||||
/// Meme flag
|
||||
Beiyang,
|
||||
Bigender,
|
||||
Biromantic1,
|
||||
Bisexual,
|
||||
Boyflux2,
|
||||
/// Meme flag
|
||||
Burger,
|
||||
Demiboy,
|
||||
Demifae,
|
||||
Demifaun,
|
||||
Demigender,
|
||||
Demigirl,
|
||||
Femboy,
|
||||
Finsexual,
|
||||
Fraysexual,
|
||||
GayMen,
|
||||
Genderfae,
|
||||
Genderfaun,
|
||||
|
||||
Queer,
|
||||
|
||||
Genderfluid,
|
||||
|
||||
Bisexual,
|
||||
|
||||
Pansexual,
|
||||
|
||||
Polysexual,
|
||||
|
||||
Omnisexual,
|
||||
|
||||
Omniromantic,
|
||||
|
||||
GayMen,
|
||||
|
||||
Lesbian,
|
||||
|
||||
Abrosexual,
|
||||
|
||||
Asexual,
|
||||
|
||||
Aromantic,
|
||||
|
||||
Aroace1,
|
||||
|
||||
Aroace2,
|
||||
|
||||
Aroace3,
|
||||
|
||||
Greysexual,
|
||||
|
||||
Autosexual,
|
||||
|
||||
Intergender,
|
||||
|
||||
Greygender,
|
||||
|
||||
Akiosexual,
|
||||
|
||||
Bigender,
|
||||
|
||||
Demigender,
|
||||
|
||||
Demiboy,
|
||||
|
||||
Demigirl,
|
||||
|
||||
Transmasculine,
|
||||
|
||||
Transfeminine,
|
||||
|
||||
Genderfaun,
|
||||
|
||||
Demifaun,
|
||||
|
||||
Genderfae,
|
||||
|
||||
Demifae,
|
||||
|
||||
Neutrois,
|
||||
|
||||
Biromantic1,
|
||||
|
||||
Autoromantic,
|
||||
|
||||
Boyflux2,
|
||||
|
||||
Girlflux,
|
||||
|
||||
Genderflux,
|
||||
|
||||
Finsexual,
|
||||
|
||||
Unlabeled1,
|
||||
|
||||
Unlabeled2,
|
||||
|
||||
Pangender,
|
||||
|
||||
#[serde(rename = "gendernonconforming1")]
|
||||
#[strum(serialize = "gendernonconforming1")]
|
||||
GenderNonconforming1,
|
||||
|
||||
#[serde(rename = "gendernonconforming2")]
|
||||
#[strum(serialize = "gendernonconforming2")]
|
||||
GenderNonconforming2,
|
||||
Gendervoid,
|
||||
Girlflux,
|
||||
Greygender,
|
||||
Greysexual,
|
||||
Gynesexual,
|
||||
Intergender,
|
||||
Lesbian,
|
||||
Neutrois,
|
||||
Nonbinary,
|
||||
NonhumanUnity,
|
||||
Omniromantic,
|
||||
Omnisexual,
|
||||
Pangender,
|
||||
Pansexual,
|
||||
Plural,
|
||||
Polysexual,
|
||||
Queer,
|
||||
Rainbow,
|
||||
|
||||
Femboy,
|
||||
|
||||
Tomboy,
|
||||
Transfeminine,
|
||||
Transgender,
|
||||
Transmasculine,
|
||||
Unlabeled1,
|
||||
Unlabeled2,
|
||||
Voidboy,
|
||||
|
||||
Gynesexual,
|
||||
|
||||
Androsexual,
|
||||
|
||||
Gendervoid,
|
||||
|
||||
Voidgirl,
|
||||
Xenogender,
|
||||
|
||||
Voidboy,
|
||||
|
||||
NonhumanUnity,
|
||||
|
||||
Plural,
|
||||
|
||||
Fraysexual,
|
||||
|
||||
/// Meme flag
|
||||
Beiyang,
|
||||
|
||||
/// Meme flag
|
||||
Burger,
|
||||
|
||||
/// Colors from Gilbert Baker's original 1978 flag design
|
||||
Baker,
|
||||
}
|
||||
|
||||
#[derive(Clone, Eq, PartialEq, Debug)]
|
||||
|
|
@ -101,25 +171,72 @@ pub enum AssignLightness {
|
|||
impl Preset {
|
||||
pub fn color_profile(&self) -> ColorProfile {
|
||||
(match self {
|
||||
// used colorpicker to source from https://fyeahaltpride.tumblr.com/post/151704251345/could-you-guys-possibly-make-an-abrosexual-pride
|
||||
Self::Abrosexual => ColorProfile::from_hex_colors(vec![
|
||||
"#46D294", "#A3E9CA", "#FFFFFF", "#F78BB3", "#EE1766",
|
||||
Self::Rainbow => ColorProfile::from_hex_colors(vec![
|
||||
"#E50000", "#FF8D00", "#FFEE00", "#028121", "#004CFF", "#770088",
|
||||
]),
|
||||
|
||||
Self::Transgender => ColorProfile::from_hex_colors(vec![
|
||||
"#55CDFD", "#F6AAB7", "#FFFFFF", "#F6AAB7", "#55CDFD",
|
||||
]),
|
||||
|
||||
Self::Nonbinary => {
|
||||
ColorProfile::from_hex_colors(vec!["#FCF431", "#FCFCFC", "#9D59D2", "#282828"])
|
||||
},
|
||||
|
||||
// sourced from https://commons.wikimedia.org/wiki/File:Xenogender_pride_flag.svg
|
||||
Self::Xenogender => ColorProfile::from_hex_colors(vec![
|
||||
"#FF6692", "#FF9A98", "#FFB883", "#FBFFA8", "#85BCFF", "#9D85FF", "#A510FF",
|
||||
]),
|
||||
|
||||
Self::Agender => ColorProfile::from_hex_colors(vec![
|
||||
"#000000", "#BABABA", "#FFFFFF", "#BAF484", "#FFFFFF", "#BABABA", "#000000",
|
||||
]),
|
||||
|
||||
// sourced from https://www.flagcolorcodes.com/akiosexual
|
||||
Self::Akiosexual => ColorProfile::from_hex_colors(vec![
|
||||
"#F9485E", "#FEA06A", "#FEF44C", "#FFFFFF", "#000000",
|
||||
Self::Queer => ColorProfile::from_hex_colors(vec!["#B57FDD", "#FFFFFF", "#49821E"]),
|
||||
|
||||
Self::Genderfluid => ColorProfile::from_hex_colors(vec![
|
||||
"#FE76A2", "#FFFFFF", "#BF12D7", "#000000", "#303CBE",
|
||||
]),
|
||||
|
||||
// sourced from https://lgbtqia.fandom.com/wiki/Androsexual
|
||||
Self::Androsexual => {
|
||||
ColorProfile::from_hex_colors(vec!["#01CCFF", "#603524", "#B799DE"])
|
||||
Self::Bisexual => ColorProfile::from_hex_colors(vec!["#D60270", "#9B4F96", "#0038A8"]),
|
||||
|
||||
Self::Pansexual => ColorProfile::from_hex_colors(vec!["#FF1C8D", "#FFD700", "#1AB3FF"]),
|
||||
|
||||
Self::Polysexual => {
|
||||
ColorProfile::from_hex_colors(vec!["#F714BA", "#01D66A", "#1594F6"])
|
||||
},
|
||||
|
||||
// sourced from https://www.flagcolorcodes.com/omnisexual
|
||||
Self::Omnisexual => ColorProfile::from_hex_colors(vec![
|
||||
"#FE9ACE", "#FF53BF", "#200044", "#6760FE", "#8EA6FF",
|
||||
]),
|
||||
|
||||
Self::Omniromantic => ColorProfile::from_hex_colors(vec![
|
||||
"#FEC8E4", "#FDA1DB", "#89739A", "#ABA7FE", "#BFCEFF",
|
||||
]),
|
||||
|
||||
// sourced from https://www.flagcolorcodes.com/gay-men
|
||||
Self::GayMen => ColorProfile::from_hex_colors(vec![
|
||||
"#078D70", "#98E8C1", "#FFFFFF", "#7BADE2", "#3D1A78",
|
||||
]),
|
||||
|
||||
Self::Lesbian => ColorProfile::from_hex_colors(vec![
|
||||
"#D62800", "#FF9B56", "#FFFFFF", "#D462A6", "#A40062",
|
||||
]),
|
||||
|
||||
// used colorpicker to source from https://fyeahaltpride.tumblr.com/post/151704251345/could-you-guys-possibly-make-an-abrosexual-pride
|
||||
Self::Abrosexual => ColorProfile::from_hex_colors(vec![
|
||||
"#46D294", "#A3E9CA", "#FFFFFF", "#F78BB3", "#EE1766",
|
||||
]),
|
||||
|
||||
Self::Asexual => {
|
||||
ColorProfile::from_hex_colors(vec!["#000000", "#A4A4A4", "#FFFFFF", "#810081"])
|
||||
},
|
||||
|
||||
Self::Aromantic => ColorProfile::from_hex_colors(vec![
|
||||
"#3BA740", "#A8D47A", "#FFFFFF", "#ABABAB", "#000000",
|
||||
]),
|
||||
|
||||
// sourced from https://flag.library.lgbt/flags/aroace/
|
||||
Self::Aroace1 => ColorProfile::from_hex_colors(vec![
|
||||
"#E28C00", "#ECCD00", "#FFFFFF", "#62AEDC", "#203856",
|
||||
|
|
@ -136,32 +253,29 @@ impl Preset {
|
|||
"#810081",
|
||||
]),
|
||||
|
||||
Self::Aromantic => ColorProfile::from_hex_colors(vec![
|
||||
"#3BA740", "#A8D47A", "#FFFFFF", "#ABABAB", "#000000",
|
||||
// sourced from https://www.flagcolorcodes.com/greysexual
|
||||
Self::Greysexual => ColorProfile::from_hex_colors(vec![
|
||||
"#740194", "#AEB1AA", "#FFFFFF", "#AEB1AA", "#740194",
|
||||
]),
|
||||
|
||||
Self::Asexual => {
|
||||
ColorProfile::from_hex_colors(vec!["#000000", "#A4A4A4", "#FFFFFF", "#810081"])
|
||||
},
|
||||
|
||||
// sourced from https://www.flagcolorcodes.com/autoromantic
|
||||
Self::Autoromantic => ColorProfile::from_hex_colors(
|
||||
// symbol interpreted
|
||||
vec!["#99D9EA", "#3DA542", "#7F7F7F"],
|
||||
)
|
||||
.and_then(|c| c.with_weights(vec![2, 1, 2])),
|
||||
|
||||
// sourced from https://www.flagcolorcodes.com/autosexual
|
||||
Self::Autosexual => ColorProfile::from_hex_colors(vec!["#99D9EA", "#7F7F7F"]),
|
||||
|
||||
// used https://gilbertbaker.com/rainbow-flag-color-meanings/ as source and colorpicked
|
||||
Self::Baker => ColorProfile::from_hex_colors(vec![
|
||||
"#F23D9E", "#F80A24", "#F78022", "#F9E81F", "#1E972E", "#1B86BC", "#243897",
|
||||
"#6F0A82",
|
||||
]),
|
||||
// sourced from https://www.flagcolorcodes.com/intergender
|
||||
Self::Intergender => {
|
||||
ColorProfile::from_hex_colors(vec!["#900DC2", "#FFE54F", "#900DC2"])
|
||||
.and_then(|c| c.with_weights(vec![2, 1, 2]))
|
||||
},
|
||||
|
||||
Self::Beiyang => ColorProfile::from_hex_colors(vec![
|
||||
"#DF1B12", "#FFC600", "#01639D", "#FFFFFF", "#000000",
|
||||
// sourced from https://www.flagcolorcodes.com/greygender
|
||||
Self::Greygender => ColorProfile::from_hex_colors(vec![
|
||||
"#B3B3B3", "#FFFFFF", "#062383", "#FFFFFF", "#535353",
|
||||
])
|
||||
.and_then(|c| c.with_weights(vec![2, 1, 2, 1, 2])),
|
||||
|
||||
// sourced from https://www.flagcolorcodes.com/akiosexual
|
||||
Self::Akiosexual => ColorProfile::from_hex_colors(vec![
|
||||
"#F9485E", "#FEA06A", "#FEF44C", "#FFFFFF", "#000000",
|
||||
]),
|
||||
|
||||
// sourced from https://www.flagcolorcodes.com/bigender
|
||||
|
|
@ -169,22 +283,10 @@ impl Preset {
|
|||
"#C479A2", "#EDA5CD", "#D6C7E8", "#FFFFFF", "#D6C7E8", "#9AC7E8", "#6D82D1",
|
||||
]),
|
||||
|
||||
// sourced from https://www.flagcolorcodes.com/biromantic-alternate-2
|
||||
Self::Biromantic1 => ColorProfile::from_hex_colors(vec![
|
||||
"#8869A5", "#D8A7D8", "#FFFFFF", "#FDB18D", "#151638",
|
||||
]),
|
||||
|
||||
Self::Bisexual => ColorProfile::from_hex_colors(vec!["#D60270", "#9B4F96", "#0038A8"]),
|
||||
|
||||
// sourced from https://www.flagcolorcodes.com/boyflux-alternate-2
|
||||
Self::Boyflux2 => ColorProfile::from_hex_colors(vec![
|
||||
"#E48AE4", "#9A81B4", "#55BFAB", "#FFFFFF", "#A8A8A8", "#81D5EF", "#69ABE5",
|
||||
"#5276D4",
|
||||
])
|
||||
.and_then(|c| c.with_weights(vec![1, 1, 1, 1, 1, 5, 5, 5])),
|
||||
|
||||
Self::Burger => ColorProfile::from_hex_colors(vec![
|
||||
"#F3A26A", "#498701", "#FD1C13", "#7D3829", "#F3A26A",
|
||||
// yellow sourced from https://lgbtqia.fandom.com/f/p/4400000000000041031
|
||||
// other colors sourced from demiboy and demigirl flags
|
||||
Self::Demigender => ColorProfile::from_hex_colors(vec![
|
||||
"#7F7F7F", "#C4C4C4", "#FBFF75", "#FFFFFF", "#FBFF75", "#C4C4C4", "#7F7F7F",
|
||||
]),
|
||||
|
||||
// sourced from https://www.flagcolorcodes.com/demiboy
|
||||
|
|
@ -192,6 +294,39 @@ impl Preset {
|
|||
"#7F7F7F", "#C4C4C4", "#9DD7EA", "#FFFFFF", "#9DD7EA", "#C4C4C4", "#7F7F7F",
|
||||
]),
|
||||
|
||||
// sourced from https://www.flagcolorcodes.com/demigirl
|
||||
Self::Demigirl => ColorProfile::from_hex_colors(vec![
|
||||
"#7F7F7F", "#C4C4C4", "#FDADC8", "#FFFFFF", "#FDADC8", "#C4C4C4", "#7F7F7F",
|
||||
]),
|
||||
|
||||
// sourced from https://www.flagcolorcodes.com/transmasculine
|
||||
Self::Transmasculine => ColorProfile::from_hex_colors(vec![
|
||||
"#FF8ABD", "#CDF5FE", "#9AEBFF", "#74DFFF", "#9AEBFF", "#CDF5FE", "#FF8ABD",
|
||||
]),
|
||||
|
||||
// used colorpicker to source from https://www.deviantart.com/pride-flags/art/Trans-Woman-Transfeminine-1-543925985
|
||||
// linked from https://gender.fandom.com/wiki/Transfeminine
|
||||
Self::Transfeminine => ColorProfile::from_hex_colors(vec![
|
||||
"#73DEFF", "#FFE2EE", "#FFB5D6", "#FF8DC0", "#FFB5D6", "#FFE2EE", "#73DEFF",
|
||||
]),
|
||||
|
||||
// sourced from https://www.flagcolorcodes.com/genderfaun
|
||||
Self::Genderfaun => ColorProfile::from_hex_colors(vec![
|
||||
"#FCD689", "#FFF09B", "#FAF9CD", "#FFFFFF", "#8EDED9", "#8CACDE", "#9782EC",
|
||||
]),
|
||||
|
||||
// sourced from https://www.flagcolorcodes.com/demifaun
|
||||
Self::Demifaun => ColorProfile::from_hex_colors(vec![
|
||||
"#7F7F7F", "#C6C6C6", "#FCC688", "#FFF19C", "#FFFFFF", "#8DE0D5", "#9682EC",
|
||||
"#C6C6C6", "#7F7F7F",
|
||||
])
|
||||
.and_then(|c| c.with_weights(vec![2, 2, 1, 1, 1, 1, 1, 2, 2])),
|
||||
|
||||
// sourced from https://www.flagcolorcodes.com/genderfae
|
||||
Self::Genderfae => ColorProfile::from_hex_colors(vec![
|
||||
"#97C3A5", "#C3DEAE", "#F9FACD", "#FFFFFF", "#FCA2C4", "#DB8AE4", "#A97EDD",
|
||||
]),
|
||||
|
||||
// used colorpicker to source form https://www.deviantart.com/pride-flags/art/Demifae-870194777
|
||||
Self::Demifae => ColorProfile::from_hex_colors(vec![
|
||||
"#7F7F7F", "#C5C5C5", "#97C3A4", "#C4DEAE", "#FFFFFF", "#FCA2C5", "#AB7EDF",
|
||||
|
|
@ -199,55 +334,31 @@ impl Preset {
|
|||
])
|
||||
.and_then(|c| c.with_weights(vec![2, 2, 1, 1, 1, 1, 1, 2, 2])),
|
||||
|
||||
// sourced from https://www.flagcolorcodes.com/demifaun
|
||||
Self::Demifaun => ColorProfile::from_hex_colors(vec![
|
||||
"#7F7F7F", "#C6C6C6", "#FCC688", "#FFF19C", "#FFFFFF", "#8DE0D5", "#9682EC",
|
||||
"#C6C6C6", "#7F7F7F",
|
||||
// sourced from https://www.flagcolorcodes.com/neutrois
|
||||
Self::Neutrois => ColorProfile::from_hex_colors(vec!["#FFFFFF", "#1F9F00", "#000000"]),
|
||||
|
||||
// sourced from https://www.flagcolorcodes.com/biromantic-alternate-2
|
||||
Self::Biromantic1 => ColorProfile::from_hex_colors(vec![
|
||||
"#8869A5", "#D8A7D8", "#FFFFFF", "#FDB18D", "#151638",
|
||||
]),
|
||||
|
||||
// sourced from https://www.flagcolorcodes.com/autoromantic
|
||||
Self::Autoromantic => ColorProfile::from_hex_colors(
|
||||
// symbol interpreted
|
||||
vec!["#99D9EA", "#3DA542", "#7F7F7F"],
|
||||
)
|
||||
.and_then(|c| c.with_weights(vec![2, 1, 2])),
|
||||
|
||||
// sourced from https://www.flagcolorcodes.com/boyflux-alternate-2
|
||||
Self::Boyflux2 => ColorProfile::from_hex_colors(vec![
|
||||
"#E48AE4", "#9A81B4", "#55BFAB", "#FFFFFF", "#A8A8A8", "#81D5EF", "#69ABE5",
|
||||
"#5276D4",
|
||||
])
|
||||
.and_then(|c| c.with_weights(vec![2, 2, 1, 1, 1, 1, 1, 2, 2])),
|
||||
.and_then(|c| c.with_weights(vec![1, 1, 1, 1, 1, 5, 5, 5])),
|
||||
|
||||
// yellow sourced from https://lgbtqia.fandom.com/f/p/4400000000000041031
|
||||
// other colors sourced from demiboy and demigirl flags
|
||||
Self::Demigender => ColorProfile::from_hex_colors(vec![
|
||||
"#7F7F7F", "#C4C4C4", "#FBFF75", "#FFFFFF", "#FBFF75", "#C4C4C4", "#7F7F7F",
|
||||
]),
|
||||
|
||||
// sourced from https://www.flagcolorcodes.com/demigirl
|
||||
Self::Demigirl => ColorProfile::from_hex_colors(vec![
|
||||
"#7F7F7F", "#C4C4C4", "#FDADC8", "#FFFFFF", "#FDADC8", "#C4C4C4", "#7F7F7F",
|
||||
]),
|
||||
|
||||
Self::Femboy => ColorProfile::from_hex_colors(vec![
|
||||
"#d260a5", "#e4afcd", "#fefefe", "#57cef8", "#fefefe", "#e4afcd", "#d260a5",
|
||||
]),
|
||||
|
||||
// sourced from https://lgbtqia.wiki/wiki/Finsexual
|
||||
Self::Finsexual => ColorProfile::from_hex_colors(vec![
|
||||
"#B18EDF", "#D7B1E2", "#F7CDE9", "#F39FCE", "#EA7BB3",
|
||||
]),
|
||||
|
||||
// sampled from https://es.m.wikipedia.org/wiki/Archivo:Fraysexual_flag.jpg
|
||||
Self::Fraysexual => {
|
||||
ColorProfile::from_hex_colors(vec!["#226CB5", "#94E7DD", "#FFFFFF", "#636363"])
|
||||
},
|
||||
|
||||
// sourced from https://www.flagcolorcodes.com/gay-men
|
||||
Self::GayMen => ColorProfile::from_hex_colors(vec![
|
||||
"#078D70", "#98E8C1", "#FFFFFF", "#7BADE2", "#3D1A78",
|
||||
]),
|
||||
|
||||
// sourced from https://www.flagcolorcodes.com/genderfae
|
||||
Self::Genderfae => ColorProfile::from_hex_colors(vec![
|
||||
"#97C3A5", "#C3DEAE", "#F9FACD", "#FFFFFF", "#FCA2C4", "#DB8AE4", "#A97EDD",
|
||||
]),
|
||||
|
||||
// sourced from https://www.flagcolorcodes.com/genderfaun
|
||||
Self::Genderfaun => ColorProfile::from_hex_colors(vec![
|
||||
"#FCD689", "#FFF09B", "#FAF9CD", "#FFFFFF", "#8EDED9", "#8CACDE", "#9782EC",
|
||||
]),
|
||||
|
||||
Self::Genderfluid => ColorProfile::from_hex_colors(vec![
|
||||
"#FE76A2", "#FFFFFF", "#BF12D7", "#000000", "#303CBE",
|
||||
// sourced from https://commons.wikimedia.org/wiki/File:Girlflux_Pride_Flag.jpg
|
||||
Self::Girlflux => ColorProfile::from_hex_colors(vec![
|
||||
"f9e6d7", "f2526c", "bf0311", "e9c587", "bf0311", "f2526c", "f9e6d7",
|
||||
]),
|
||||
|
||||
// sourced from https://www.deviantart.com/pride-flags/art/Genderflux-1-543925589
|
||||
|
|
@ -255,110 +366,9 @@ impl Preset {
|
|||
"f47694", "f2a2b9", "cecece", "7ce0f7", "3ecdf9", "fff48d",
|
||||
]),
|
||||
|
||||
Self::GenderNonconforming1 => ColorProfile::from_hex_colors(vec![
|
||||
"#50284d", "#96467b", "#5c96f7", "#ffe6f7", "#5c96f7", "#96467b", "#50284d",
|
||||
])
|
||||
.and_then(|c| c.with_weights(vec![4, 1, 1, 1, 1, 1, 4])),
|
||||
|
||||
Self::GenderNonconforming2 => ColorProfile::from_hex_colors(vec![
|
||||
"#50284d", "#96467b", "#5c96f7", "#ffe6f7", "#5c96f7", "#96467b", "#50284d",
|
||||
]),
|
||||
|
||||
// sourced from: https://gender.fandom.com/wiki/Gendervoid
|
||||
Self::Gendervoid => ColorProfile::from_hex_colors(vec![
|
||||
"#081149", "#4B484B", "#000000", "#4B484B", "#081149",
|
||||
]),
|
||||
|
||||
// sourced from https://commons.wikimedia.org/wiki/File:Girlflux_Pride_Flag.jpg
|
||||
Self::Girlflux => ColorProfile::from_hex_colors(vec![
|
||||
"f9e6d7", "f2526c", "bf0311", "e9c587", "bf0311", "f2526c", "f9e6d7",
|
||||
]),
|
||||
|
||||
// sourced from https://www.flagcolorcodes.com/greygender
|
||||
Self::Greygender => ColorProfile::from_hex_colors(vec![
|
||||
"#B3B3B3", "#FFFFFF", "#062383", "#FFFFFF", "#535353",
|
||||
])
|
||||
.and_then(|c| c.with_weights(vec![2, 1, 2, 1, 2])),
|
||||
|
||||
// sourced from https://www.flagcolorcodes.com/greysexual
|
||||
Self::Greysexual => ColorProfile::from_hex_colors(vec![
|
||||
"#740194", "#AEB1AA", "#FFFFFF", "#AEB1AA", "#740194",
|
||||
]),
|
||||
|
||||
// sourced from https://lgbtqia.fandom.com/wiki/Gynesexual
|
||||
Self::Gynesexual => {
|
||||
ColorProfile::from_hex_colors(vec!["#F4A9B7", "#903F2B", "#5B953B"])
|
||||
},
|
||||
|
||||
// sourced from https://www.flagcolorcodes.com/intergender
|
||||
Self::Intergender => {
|
||||
ColorProfile::from_hex_colors(vec!["#900DC2", "#FFE54F", "#900DC2"])
|
||||
.and_then(|c| c.with_weights(vec![2, 1, 2]))
|
||||
},
|
||||
|
||||
Self::Lesbian => ColorProfile::from_hex_colors(vec![
|
||||
"#D62800", "#FF9B56", "#FFFFFF", "#D462A6", "#A40062",
|
||||
]),
|
||||
|
||||
// sourced from https://www.flagcolorcodes.com/neutrois
|
||||
Self::Neutrois => ColorProfile::from_hex_colors(vec!["#FFFFFF", "#1F9F00", "#000000"]),
|
||||
|
||||
Self::Nonbinary => {
|
||||
ColorProfile::from_hex_colors(vec!["#FCF431", "#FCFCFC", "#9D59D2", "#282828"])
|
||||
},
|
||||
|
||||
// used https://twitter.com/foxbrained/status/1667621855518236674/photo/1 as source and colorpicked
|
||||
Self::NonhumanUnity => {
|
||||
ColorProfile::from_hex_colors(vec!["#177B49", "#FFFFFF", "#593C90"])
|
||||
},
|
||||
|
||||
Self::Omniromantic => ColorProfile::from_hex_colors(vec![
|
||||
"#FEC8E4", "#FDA1DB", "#89739A", "#ABA7FE", "#BFCEFF",
|
||||
]),
|
||||
|
||||
// sourced from https://www.flagcolorcodes.com/omnisexual
|
||||
Self::Omnisexual => ColorProfile::from_hex_colors(vec![
|
||||
"#FE9ACE", "#FF53BF", "#200044", "#6760FE", "#8EA6FF",
|
||||
]),
|
||||
|
||||
Self::Pangender => ColorProfile::from_hex_colors(vec![
|
||||
"#FFF798", "#FEDDCD", "#FFEBFB", "#FFFFFF", "#FFEBFB", "#FEDDCD", "#FFF798",
|
||||
]),
|
||||
|
||||
Self::Pansexual => ColorProfile::from_hex_colors(vec!["#FF1C8D", "#FFD700", "#1AB3FF"]),
|
||||
|
||||
// used https://pluralpedia.org/w/Plurality#/media/File:Plural-Flag-1.jpg as source and colorpicked
|
||||
Self::Plural => ColorProfile::from_hex_colors(vec![
|
||||
"#2D0625", "#543475", "#7675C3", "#89C7B0", "#F3EDBD",
|
||||
]),
|
||||
|
||||
Self::Polysexual => {
|
||||
ColorProfile::from_hex_colors(vec!["#F714BA", "#01D66A", "#1594F6"])
|
||||
},
|
||||
|
||||
Self::Queer => ColorProfile::from_hex_colors(vec!["#B57FDD", "#FFFFFF", "#49821E"]),
|
||||
|
||||
Self::Rainbow => ColorProfile::from_hex_colors(vec![
|
||||
"#E50000", "#FF8D00", "#FFEE00", "#028121", "#004CFF", "#770088",
|
||||
]),
|
||||
|
||||
Self::Tomboy => ColorProfile::from_hex_colors(vec![
|
||||
"#2f3fb9", "#613a03", "#fefefe", "#f1a9b7", "#fefefe", "#613a03", "#2f3fb9",
|
||||
]),
|
||||
|
||||
// used colorpicker to source from https://www.deviantart.com/pride-flags/art/Trans-Woman-Transfeminine-1-543925985
|
||||
// linked from https://gender.fandom.com/wiki/Transfeminine
|
||||
Self::Transfeminine => ColorProfile::from_hex_colors(vec![
|
||||
"#73DEFF", "#FFE2EE", "#FFB5D6", "#FF8DC0", "#FFB5D6", "#FFE2EE", "#73DEFF",
|
||||
]),
|
||||
|
||||
Self::Transgender => ColorProfile::from_hex_colors(vec![
|
||||
"#55CDFD", "#F6AAB7", "#FFFFFF", "#F6AAB7", "#55CDFD",
|
||||
]),
|
||||
|
||||
// sourced from https://www.flagcolorcodes.com/transmasculine
|
||||
Self::Transmasculine => ColorProfile::from_hex_colors(vec![
|
||||
"#FF8ABD", "#CDF5FE", "#9AEBFF", "#74DFFF", "#9AEBFF", "#CDF5FE", "#FF8ABD",
|
||||
// sourced from https://lgbtqia.wiki/wiki/Finsexual
|
||||
Self::Finsexual => ColorProfile::from_hex_colors(vec![
|
||||
"#B18EDF", "#D7B1E2", "#F7CDE9", "#F39FCE", "#EA7BB3",
|
||||
]),
|
||||
|
||||
// sourced from https://web.archive.org/web/20221002181913/https://unlabeledinfo.carrd.co/#flags
|
||||
|
|
@ -371,18 +381,79 @@ impl Preset {
|
|||
"#250548", "#FFFFFF", "#F7DCDA", "#EC9BEE", "#9541FA", "#7D2557",
|
||||
]),
|
||||
|
||||
Self::Pangender => ColorProfile::from_hex_colors(vec![
|
||||
"#FFF798", "#FEDDCD", "#FFEBFB", "#FFFFFF", "#FFEBFB", "#FEDDCD", "#FFF798",
|
||||
]),
|
||||
|
||||
Self::GenderNonconforming1 => ColorProfile::from_hex_colors(vec![
|
||||
"#50284d", "#96467b", "#5c96f7", "#ffe6f7", "#5c96f7", "#96467b", "#50284d",
|
||||
])
|
||||
.and_then(|c| c.with_weights(vec![4, 1, 1, 1, 1, 1, 4])),
|
||||
|
||||
Self::GenderNonconforming2 => ColorProfile::from_hex_colors(vec![
|
||||
"#50284d", "#96467b", "#5c96f7", "#ffe6f7", "#5c96f7", "#96467b", "#50284d",
|
||||
]),
|
||||
|
||||
Self::Femboy => ColorProfile::from_hex_colors(vec![
|
||||
"#d260a5", "#e4afcd", "#fefefe", "#57cef8", "#fefefe", "#e4afcd", "#d260a5",
|
||||
]),
|
||||
|
||||
Self::Tomboy => ColorProfile::from_hex_colors(vec![
|
||||
"#2f3fb9", "#613a03", "#fefefe", "#f1a9b7", "#fefefe", "#613a03", "#2f3fb9",
|
||||
]),
|
||||
|
||||
// sourced from https://lgbtqia.fandom.com/wiki/Gynesexual
|
||||
Self::Gynesexual => {
|
||||
ColorProfile::from_hex_colors(vec!["#F4A9B7", "#903F2B", "#5B953B"])
|
||||
},
|
||||
|
||||
// sourced from https://lgbtqia.fandom.com/wiki/Androsexual
|
||||
Self::Androsexual => {
|
||||
ColorProfile::from_hex_colors(vec!["#01CCFF", "#603524", "#B799DE"])
|
||||
},
|
||||
|
||||
// sourced from: https://gender.fandom.com/wiki/Gendervoid
|
||||
Self::Voidboy => ColorProfile::from_hex_colors(vec![
|
||||
"#0B130C", "#547655", "#66B969", "#547655", "#0B130C",
|
||||
Self::Gendervoid => ColorProfile::from_hex_colors(vec![
|
||||
"#081149", "#4B484B", "#000000", "#4B484B", "#081149",
|
||||
]),
|
||||
|
||||
// sourced from: https://gender.fandom.com/wiki/Gendervoid
|
||||
Self::Voidgirl => ColorProfile::from_hex_colors(vec![
|
||||
"#180827", "#7A5A8B", "#E09BED", "#7A5A8B", "#180827",
|
||||
]),
|
||||
// sourced from https://commons.wikimedia.org/wiki/File:Xenogender_pride_flag.svg
|
||||
Self::Xenogender => ColorProfile::from_hex_colors(vec![
|
||||
"#FF6692", "#FF9A98", "#FFB883", "#FBFFA8", "#85BCFF", "#9D85FF", "#A510FF",
|
||||
|
||||
// sourced from: https://gender.fandom.com/wiki/Gendervoid
|
||||
Self::Voidboy => ColorProfile::from_hex_colors(vec![
|
||||
"#0B130C", "#547655", "#66B969", "#547655", "#0B130C",
|
||||
]),
|
||||
|
||||
// used https://twitter.com/foxbrained/status/1667621855518236674/photo/1 as source and colorpicked
|
||||
Self::NonhumanUnity => {
|
||||
ColorProfile::from_hex_colors(vec!["#177B49", "#FFFFFF", "#593C90"])
|
||||
},
|
||||
|
||||
// used https://pluralpedia.org/w/Plurality#/media/File:Plural-Flag-1.jpg as source and colorpicked
|
||||
Self::Plural => ColorProfile::from_hex_colors(vec![
|
||||
"#2D0625", "#543475", "#7675C3", "#89C7B0", "#F3EDBD",
|
||||
]),
|
||||
|
||||
// sampled from https://es.m.wikipedia.org/wiki/Archivo:Fraysexual_flag.jpg
|
||||
Self::Fraysexual => {
|
||||
ColorProfile::from_hex_colors(vec!["#226CB5", "#94E7DD", "#FFFFFF", "#636363"])
|
||||
},
|
||||
|
||||
Self::Beiyang => ColorProfile::from_hex_colors(vec![
|
||||
"#DF1B12", "#FFC600", "#01639D", "#FFFFFF", "#000000",
|
||||
]),
|
||||
|
||||
Self::Burger => ColorProfile::from_hex_colors(vec![
|
||||
"#F3A26A", "#498701", "#FD1C13", "#7D3829", "#F3A26A",
|
||||
]),
|
||||
|
||||
// used https://gilbertbaker.com/rainbow-flag-color-meanings/ as source and colorpicked
|
||||
Self::Baker => ColorProfile::from_hex_colors(vec![
|
||||
"#F23D9E", "#F80A24", "#F78022", "#F9E81F", "#1E972E", "#1B86BC", "#243897",
|
||||
"#6F0A82",
|
||||
]),
|
||||
})
|
||||
.expect("preset color profiles should not be invalid")
|
||||
|
|
@ -516,11 +587,10 @@ impl ColorProfile {
|
|||
self.colors.iter().map(|c| c.into_linear()).collect();
|
||||
|
||||
{
|
||||
let hsl_f32_colors: &mut [Hsl<Linear<encoding::Srgb>>] =
|
||||
&mut rgb_f32_colors.into_color_mut();
|
||||
let okhsl_f32_colors: &mut [Okhsl] = &mut rgb_f32_colors.into_color_mut();
|
||||
|
||||
for hsl_f32_color in hsl_f32_colors {
|
||||
hsl_f32_color.lightness *= multiplier;
|
||||
for okhsl_f32_color in okhsl_f32_colors {
|
||||
okhsl_f32_color.lightness *= multiplier;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -534,25 +604,25 @@ impl ColorProfile {
|
|||
}
|
||||
}
|
||||
|
||||
/// Creates a new color profile, with the colors set to the specified HSL
|
||||
/// lightness value.
|
||||
/// Creates a new color profile, with the colors set to the specified
|
||||
/// [`Okhsl`] lightness value.
|
||||
pub fn with_lightness(&self, assign_lightness: AssignLightness) -> Self {
|
||||
let mut rgb_f32_colors: Vec<_> =
|
||||
self.colors.iter().map(|c| c.into_format::<f32>()).collect();
|
||||
|
||||
{
|
||||
let hsl_f32_colors: &mut [Hsl] = &mut rgb_f32_colors.into_color_mut();
|
||||
let okhsl_f32_colors: &mut [Okhsl] = &mut rgb_f32_colors.into_color_mut();
|
||||
|
||||
for hsl_f32_color in hsl_f32_colors {
|
||||
for okhsl_f32_color in okhsl_f32_colors {
|
||||
match assign_lightness {
|
||||
AssignLightness::Replace(lightness) => {
|
||||
hsl_f32_color.lightness = lightness.into();
|
||||
okhsl_f32_color.lightness = lightness.into();
|
||||
},
|
||||
AssignLightness::ClampMax(lightness) => {
|
||||
hsl_f32_color.lightness.clamp_max_assign(lightness.into());
|
||||
okhsl_f32_color.lightness.clamp_max_assign(lightness.into());
|
||||
},
|
||||
AssignLightness::ClampMin(lightness) => {
|
||||
hsl_f32_color.lightness.clamp_min_assign(lightness.into());
|
||||
okhsl_f32_color.lightness.clamp_min_assign(lightness.into());
|
||||
},
|
||||
}
|
||||
}
|
||||
|
|
@ -568,8 +638,8 @@ impl ColorProfile {
|
|||
}
|
||||
}
|
||||
|
||||
/// Creates a new color profile, with the colors set to the specified HSL
|
||||
/// lightness value, with respect to dark/light terminals.
|
||||
/// Creates a new color profile, with the colors set to the specified
|
||||
/// [`Okhsl`] lightness value, with respect to dark/light terminals.
|
||||
pub fn with_lightness_dl(
|
||||
&self,
|
||||
lightness: Lightness,
|
||||
|
|
|
|||
|
|
@ -1,20 +1,28 @@
|
|||
use serde::{Deserialize, Serialize};
|
||||
use strum::{EnumString, VariantNames};
|
||||
use strum::{EnumString, IntoStaticStr, VariantNames};
|
||||
|
||||
#[derive(
|
||||
Copy, Clone, Eq, PartialEq, Hash, Debug, Deserialize, EnumString, Serialize, VariantNames,
|
||||
Copy, Clone, Eq, PartialEq, Hash, Debug, Deserialize, EnumString, IntoStaticStr, Serialize,
|
||||
)]
|
||||
#[serde(rename_all = "lowercase")]
|
||||
#[strum(serialize_all = "lowercase")]
|
||||
pub enum AnsiMode {
|
||||
#[serde(rename = "ansi")]
|
||||
#[serde(skip)]
|
||||
#[strum(serialize = "ansi")]
|
||||
#[strum(disabled)]
|
||||
Ansi16,
|
||||
#[serde(rename = "8bit")]
|
||||
#[strum(serialize = "8bit")]
|
||||
Ansi256,
|
||||
Rgb,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Eq, PartialEq, Hash, Debug, Deserialize, Serialize)]
|
||||
#[derive(
|
||||
Copy, Clone, Eq, PartialEq, Hash, Debug, Deserialize, EnumString, IntoStaticStr, Serialize,
|
||||
)]
|
||||
#[serde(rename_all = "lowercase")]
|
||||
#[strum(serialize_all = "lowercase")]
|
||||
pub enum LightDark {
|
||||
Light,
|
||||
Dark,
|
||||
|
|
@ -31,3 +39,8 @@ pub enum Backend {
|
|||
Fastfetch,
|
||||
FastfetchOld,
|
||||
}
|
||||
|
||||
// See https://github.com/Peternator7/strum/issues/244
|
||||
impl VariantNames for AnsiMode {
|
||||
const VARIANTS: &'static [&'static str] = &["8bit", "rgb"];
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue