use std::{fmt::Debug, sync::Arc};
use bevy::prelude::*;
use crate::color_support::ColorSupport;
#[derive(Component, Clone, Debug)]
pub enum RatatuiCameraStrategy {
HalfBlocks(HalfBlocksConfig),
Luminance(LuminanceConfig),
None,
}
impl Default for RatatuiCameraStrategy {
fn default() -> Self {
Self::halfblocks()
}
}
impl RatatuiCameraStrategy {
pub fn halfblocks() -> Self {
Self::HalfBlocks(HalfBlocksConfig::default())
}
pub fn luminance_with_characters(characters: &[char]) -> Self {
Self::Luminance(LuminanceConfig {
luminance_characters: characters.into(),
..default()
})
}
pub fn luminance_braille() -> Self {
Self::Luminance(LuminanceConfig {
luminance_characters: LuminanceConfig::LUMINANCE_CHARACTERS_BRAILLE.into(),
..default()
})
}
pub fn luminance_misc() -> Self {
Self::Luminance(LuminanceConfig {
luminance_characters: LuminanceConfig::LUMINANCE_CHARACTERS_MISC.into(),
..default()
})
}
pub fn luminance_shading() -> Self {
Self::Luminance(LuminanceConfig {
luminance_characters: LuminanceConfig::LUMINANCE_CHARACTERS_SHADING.into(),
..default()
})
}
pub fn luminance_blocks() -> Self {
Self::Luminance(LuminanceConfig {
luminance_characters: LuminanceConfig::LUMINANCE_CHARACTERS_BLOCKS.into(),
..default()
})
}
}
#[derive(Clone, Debug)]
pub struct HalfBlocksConfig {
pub transparent: bool,
pub color_support: ColorSupport,
}
impl Default for HalfBlocksConfig {
fn default() -> Self {
Self {
transparent: true,
color_support: ColorSupport::TrueColor,
}
}
}
#[derive(Clone, Debug)]
pub struct LuminanceConfig {
pub luminance_characters: Vec<char>,
pub luminance_scale: f32,
pub foreground_color: Option<ColorChoice>,
pub background_color: Option<ColorChoice>,
pub transparent: bool,
pub color_support: ColorSupport,
}
impl LuminanceConfig {
pub const LUMINANCE_CHARACTERS_BRAILLE: &'static [char] =
&[' ', '⠂', '⠒', '⠖', '⠶', '⠷', '⠿', '⡿', '⣿'];
pub const LUMINANCE_CHARACTERS_MISC: &'static [char] =
&[' ', '.', ':', '+', '=', '!', '*', '?', '#', '%', '&', '@'];
pub const LUMINANCE_CHARACTERS_SHADING: &'static [char] = &[' ', '░', '▒', '▓', '█'];
pub const LUMINANCE_CHARACTERS_BLOCKS: &'static [char] =
&[' ', '▁', '▂', '▃', '▄', '▅', '▆', '▇', '█'];
const LUMINANCE_SCALE_DEFAULT: f32 = 10.;
}
impl Default for LuminanceConfig {
fn default() -> Self {
Self {
luminance_characters: LuminanceConfig::LUMINANCE_CHARACTERS_BRAILLE.into(),
luminance_scale: LuminanceConfig::LUMINANCE_SCALE_DEFAULT,
foreground_color: None,
background_color: None,
transparent: true,
color_support: ColorSupport::TrueColor,
}
}
}
#[derive(Clone)]
pub enum ColorChoice {
Color(ratatui::style::Color),
Scale(f32),
Callback(
Arc<
dyn Fn(
Option<ratatui::style::Color>,
Option<ratatui::style::Color>,
) -> Option<ratatui::style::Color>
+ Send
+ Sync
+ 'static,
>,
),
}
impl Default for ColorChoice {
fn default() -> Self {
Self::Scale(0.5)
}
}
impl Debug for ColorChoice {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
ColorChoice::Color(color) => write!(f, "ColorChoice::Color({:?})", color),
ColorChoice::Scale(scale) => write!(f, "ColorChoice::Scale({})", scale),
ColorChoice::Callback(_) => write!(f, "ColorChoice::Callback(...)"),
}
}
}
impl ColorChoice {
pub fn from_callback<F>(callback: F) -> Self
where
F: Fn(
Option<ratatui::style::Color>,
Option<ratatui::style::Color>,
) -> Option<ratatui::style::Color>
+ Send
+ Sync
+ 'static,
{
Self::Callback(Arc::new(callback))
}
}