use embedded_graphics::prelude::*;
#[derive(Debug, Clone)]
pub struct LegendStyle<C: PixelColor> {
pub text: TextStyle<C>,
pub symbol: SymbolStyle<C>,
pub background: BackgroundStyle<C>,
pub spacing: SpacingStyle,
}
#[derive(Debug, Clone)]
pub struct TextStyle<C: PixelColor> {
pub color: C,
pub font_size: u32,
pub line_height: u32,
pub char_width: u32,
pub max_text_width: u32,
pub alignment: TextAlignment,
}
#[derive(Debug, Clone)]
pub struct SymbolStyle<C: PixelColor> {
pub size: u32,
pub border_width: u32,
pub default_color: C,
pub quality: SymbolQuality,
}
#[derive(Debug, Clone)]
pub struct BackgroundStyle<C: PixelColor> {
pub color: Option<C>,
pub border_color: Option<C>,
pub border_width: u32,
pub corner_radius: u32,
pub opacity: u8,
}
#[derive(Debug, Clone)]
pub struct SpacingStyle {
pub symbol_width: u32,
pub symbol_text_gap: u32,
pub entry_spacing: u32,
pub padding: Padding,
pub margins: Margins,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TextAlignment {
Left,
Center,
Right,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SymbolQuality {
Fast,
Standard,
High,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Padding {
pub top: u32,
pub right: u32,
pub bottom: u32,
pub left: u32,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Margins {
pub top: u32,
pub right: u32,
pub bottom: u32,
pub left: u32,
}
impl<C: PixelColor> LegendStyle<C> {
pub fn new() -> Self
where
C: From<embedded_graphics::pixelcolor::Rgb565>,
{
Self {
text: TextStyle::new(),
symbol: SymbolStyle::new(),
background: BackgroundStyle::new(),
spacing: SpacingStyle::new(),
}
}
pub fn minimal() -> Self
where
C: From<embedded_graphics::pixelcolor::Rgb565>,
{
Self {
text: TextStyle::minimal(),
symbol: SymbolStyle::minimal(),
background: BackgroundStyle::minimal(),
spacing: SpacingStyle::minimal(),
}
}
pub fn professional() -> Self
where
C: From<embedded_graphics::pixelcolor::Rgb565>,
{
Self {
text: TextStyle::professional(),
symbol: SymbolStyle::professional(),
background: BackgroundStyle::professional(),
spacing: SpacingStyle::professional(),
}
}
pub fn compact() -> Self
where
C: From<embedded_graphics::pixelcolor::Rgb565>,
{
Self {
text: TextStyle::compact(),
symbol: SymbolStyle::compact(),
background: BackgroundStyle::compact(),
spacing: SpacingStyle::compact(),
}
}
}
impl<C: PixelColor> TextStyle<C> {
pub fn new() -> Self
where
C: From<embedded_graphics::pixelcolor::Rgb565>,
{
Self {
color: C::from(embedded_graphics::pixelcolor::Rgb565::BLACK),
font_size: 12,
line_height: 16,
char_width: 6,
max_text_width: 120,
alignment: TextAlignment::Left,
}
}
pub fn minimal() -> Self
where
C: From<embedded_graphics::pixelcolor::Rgb565>,
{
Self {
color: C::from(embedded_graphics::pixelcolor::Rgb565::BLACK),
font_size: 8,
line_height: 10,
char_width: 4,
max_text_width: 60,
alignment: TextAlignment::Left,
}
}
pub fn professional() -> Self
where
C: From<embedded_graphics::pixelcolor::Rgb565>,
{
Self {
color: C::from(embedded_graphics::pixelcolor::Rgb565::new(8, 16, 8)), font_size: 14,
line_height: 18,
char_width: 7,
max_text_width: 150,
alignment: TextAlignment::Left,
}
}
pub fn compact() -> Self
where
C: From<embedded_graphics::pixelcolor::Rgb565>,
{
Self {
color: C::from(embedded_graphics::pixelcolor::Rgb565::BLACK),
font_size: 10,
line_height: 12,
char_width: 5,
max_text_width: 80,
alignment: TextAlignment::Left,
}
}
}
impl<C: PixelColor> SymbolStyle<C> {
pub fn new() -> Self
where
C: From<embedded_graphics::pixelcolor::Rgb565>,
{
Self {
size: 16,
border_width: 1,
default_color: C::from(embedded_graphics::pixelcolor::Rgb565::BLUE),
quality: SymbolQuality::Standard,
}
}
pub fn minimal() -> Self
where
C: From<embedded_graphics::pixelcolor::Rgb565>,
{
Self {
size: 8,
border_width: 0,
default_color: C::from(embedded_graphics::pixelcolor::Rgb565::BLUE),
quality: SymbolQuality::Fast,
}
}
pub fn professional() -> Self
where
C: From<embedded_graphics::pixelcolor::Rgb565>,
{
Self {
size: 20,
border_width: 2,
default_color: C::from(embedded_graphics::pixelcolor::Rgb565::new(14, 28, 14)), quality: SymbolQuality::High,
}
}
pub fn compact() -> Self
where
C: From<embedded_graphics::pixelcolor::Rgb565>,
{
Self {
size: 12,
border_width: 1,
default_color: C::from(embedded_graphics::pixelcolor::Rgb565::BLUE),
quality: SymbolQuality::Standard,
}
}
}
impl<C: PixelColor> BackgroundStyle<C> {
pub fn new() -> Self {
Self {
color: None, border_color: None,
border_width: 0,
corner_radius: 0,
opacity: 255,
}
}
pub fn minimal() -> Self {
Self {
color: None,
border_color: None,
border_width: 0,
corner_radius: 0,
opacity: 255,
}
}
pub fn professional() -> Self
where
C: From<embedded_graphics::pixelcolor::Rgb565>,
{
Self {
color: Some(C::from(embedded_graphics::pixelcolor::Rgb565::new(
31, 63, 31,
))), border_color: Some(C::from(embedded_graphics::pixelcolor::Rgb565::new(
16, 32, 16,
))), border_width: 1,
corner_radius: 4,
opacity: 240,
}
}
pub fn compact() -> Self {
Self {
color: None,
border_color: None,
border_width: 0,
corner_radius: 0,
opacity: 255,
}
}
}
impl SpacingStyle {
pub fn new() -> Self {
Self {
symbol_width: 20,
symbol_text_gap: 8,
entry_spacing: 4,
padding: Padding::all(8),
margins: Margins::all(4),
}
}
pub fn minimal() -> Self {
Self {
symbol_width: 12,
symbol_text_gap: 4,
entry_spacing: 2,
padding: Padding::all(2),
margins: Margins::all(1),
}
}
pub fn professional() -> Self {
Self {
symbol_width: 24,
symbol_text_gap: 12,
entry_spacing: 8,
padding: Padding::all(12),
margins: Margins::all(8),
}
}
pub fn compact() -> Self {
Self {
symbol_width: 16,
symbol_text_gap: 6,
entry_spacing: 3,
padding: Padding::all(4),
margins: Margins::all(2),
}
}
}
impl Padding {
pub const fn all(value: u32) -> Self {
Self {
top: value,
right: value,
bottom: value,
left: value,
}
}
pub const fn symmetric(horizontal: u32, vertical: u32) -> Self {
Self {
top: vertical,
right: horizontal,
bottom: vertical,
left: horizontal,
}
}
pub const fn new(top: u32, right: u32, bottom: u32, left: u32) -> Self {
Self {
top,
right,
bottom,
left,
}
}
pub const fn horizontal(&self) -> u32 {
self.left + self.right
}
pub const fn vertical(&self) -> u32 {
self.top + self.bottom
}
}
impl Margins {
pub const fn all(value: u32) -> Self {
Self {
top: value,
right: value,
bottom: value,
left: value,
}
}
pub const fn symmetric(horizontal: u32, vertical: u32) -> Self {
Self {
top: vertical,
right: horizontal,
bottom: vertical,
left: horizontal,
}
}
pub const fn new(top: u32, right: u32, bottom: u32, left: u32) -> Self {
Self {
top,
right,
bottom,
left,
}
}
pub const fn horizontal(&self) -> u32 {
self.left + self.right
}
pub const fn vertical(&self) -> u32 {
self.top + self.bottom
}
}
impl<C: PixelColor> Default for LegendStyle<C>
where
C: From<embedded_graphics::pixelcolor::Rgb565>,
{
fn default() -> Self {
Self::new()
}
}
impl<C: PixelColor> Default for TextStyle<C>
where
C: From<embedded_graphics::pixelcolor::Rgb565>,
{
fn default() -> Self {
Self::new()
}
}
impl<C: PixelColor> Default for SymbolStyle<C>
where
C: From<embedded_graphics::pixelcolor::Rgb565>,
{
fn default() -> Self {
Self::new()
}
}
impl<C: PixelColor> Default for BackgroundStyle<C> {
fn default() -> Self {
Self::new()
}
}
impl Default for SpacingStyle {
fn default() -> Self {
Self::new()
}
}
impl Default for TextAlignment {
fn default() -> Self {
Self::Left
}
}
impl Default for SymbolQuality {
fn default() -> Self {
Self::Standard
}
}
impl Default for Padding {
fn default() -> Self {
Self::all(4)
}
}
impl Default for Margins {
fn default() -> Self {
Self::all(2)
}
}