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),
Depth(DepthConfig),
None,
}
impl RatatuiCameraStrategy {
pub const CHARACTERS_BRAILLE: &'static [char] = &[' ', '⠂', '⠒', '⠖', '⠶', '⠷', '⠿', '⡿', '⣿'];
pub const CHARACTERS_MISC: &'static [char] =
&[' ', '.', ':', '+', '=', '!', '*', '?', '#', '%', '&', '@'];
pub const CHARACTERS_SHADING: &'static [char] = &[' ', '░', '▒', '▓', '█'];
pub const CHARACTERS_BLOCKS: &'static [char] = &[' ', '▁', '▂', '▃', '▄', '▅', '▆', '▇', '█'];
}
impl Default for RatatuiCameraStrategy {
fn default() -> Self {
Self::halfblocks()
}
}
impl RatatuiCameraStrategy {
pub fn halfblocks() -> Self {
Self::HalfBlocks(HalfBlocksConfig::default())
}
pub fn depth_with_characters(characters: &[char]) -> Self {
Self::Depth(DepthConfig {
characters: CharactersConfig {
list: characters.into(),
scale: DepthConfig::SCALE_DEFAULT,
},
..default()
})
}
pub fn depth_braille() -> Self {
Self::Depth(DepthConfig {
characters: CharactersConfig {
list: Self::CHARACTERS_BRAILLE.into(),
scale: DepthConfig::SCALE_DEFAULT,
},
..default()
})
}
pub fn depth_misc() -> Self {
Self::Depth(DepthConfig {
characters: CharactersConfig {
list: Self::CHARACTERS_MISC.into(),
scale: DepthConfig::SCALE_DEFAULT,
},
..default()
})
}
pub fn depth_shading() -> Self {
Self::Depth(DepthConfig {
characters: CharactersConfig {
list: Self::CHARACTERS_SHADING.into(),
scale: DepthConfig::SCALE_DEFAULT,
},
..default()
})
}
pub fn depth_blocks() -> Self {
Self::Depth(DepthConfig {
characters: CharactersConfig {
list: Self::CHARACTERS_BLOCKS.into(),
scale: DepthConfig::SCALE_DEFAULT,
},
..default()
})
}
pub fn luminance_with_characters(characters: &[char]) -> Self {
Self::Luminance(LuminanceConfig {
characters: CharactersConfig {
list: characters.into(),
scale: LuminanceConfig::SCALE_DEFAULT,
},
..default()
})
}
pub fn luminance_braille() -> Self {
Self::Luminance(LuminanceConfig {
characters: CharactersConfig {
list: Self::CHARACTERS_BRAILLE.into(),
scale: LuminanceConfig::SCALE_DEFAULT,
},
..default()
})
}
pub fn luminance_misc() -> Self {
Self::Luminance(LuminanceConfig {
characters: CharactersConfig {
list: Self::CHARACTERS_MISC.into(),
scale: LuminanceConfig::SCALE_DEFAULT,
},
..default()
})
}
pub fn luminance_shading() -> Self {
Self::Luminance(LuminanceConfig {
characters: CharactersConfig {
list: Self::CHARACTERS_SHADING.into(),
scale: LuminanceConfig::SCALE_DEFAULT,
},
..default()
})
}
pub fn luminance_blocks() -> Self {
Self::Luminance(LuminanceConfig {
characters: CharactersConfig {
list: Self::CHARACTERS_BLOCKS.into(),
scale: LuminanceConfig::SCALE_DEFAULT,
},
..default()
})
}
}
#[derive(Clone, Debug, Default)]
pub struct HalfBlocksConfig {
pub common: CommonConfig,
pub colors: ColorsConfig,
}
#[derive(Clone, Debug)]
pub struct DepthConfig {
pub common: CommonConfig,
pub characters: CharactersConfig,
pub colors: ColorsConfig,
}
impl DepthConfig {
pub const SCALE_DEFAULT: f32 = 30.;
}
impl Default for DepthConfig {
fn default() -> Self {
Self {
common: CommonConfig::default(),
characters: CharactersConfig {
list: RatatuiCameraStrategy::CHARACTERS_MISC.into(),
scale: DepthConfig::SCALE_DEFAULT,
},
colors: ColorsConfig::default(),
}
}
}
#[derive(Clone, Debug)]
pub struct LuminanceConfig {
pub common: CommonConfig,
pub characters: CharactersConfig,
pub colors: ColorsConfig,
}
impl LuminanceConfig {
pub const SCALE_DEFAULT: f32 = 10.;
}
impl Default for LuminanceConfig {
fn default() -> Self {
Self {
common: CommonConfig::default(),
characters: CharactersConfig {
list: RatatuiCameraStrategy::CHARACTERS_MISC.into(),
scale: LuminanceConfig::SCALE_DEFAULT,
},
colors: ColorsConfig::default(),
}
}
}
#[derive(Clone, Debug)]
pub struct CommonConfig {
pub transparent: bool,
}
impl Default for CommonConfig {
fn default() -> Self {
Self { transparent: true }
}
}
#[derive(Clone, Debug)]
pub struct CharactersConfig {
pub list: Vec<char>,
pub scale: f32,
}
#[derive(Clone, Debug, Default)]
pub struct ColorsConfig {
pub foreground: Option<ColorChoice>,
pub background: Option<ColorChoice>,
pub support: ColorSupport,
}
#[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))
}
}