use tiny_led_matrix::Render;
use crate::graphics::font;
use crate::graphics::image::BitImage;
use crate::graphics::scrolling::{Animate, ScrollingState, Scrollable};
#[derive(Default)]
#[derive(Copy, Clone)]
pub struct ScrollingStaticText {
message: &'static [u8],
state: ScrollingState,
}
impl ScrollingStaticText {
pub fn set_message(&mut self, message: &'static [u8]) {
self.message = message;
self.reset();
}
}
impl Scrollable for ScrollingStaticText {
type Subimage = BitImage;
fn length(&self) -> usize {
self.message.len()
}
fn state(&self) -> &ScrollingState {
&self.state
}
fn state_mut(&mut self) -> &mut ScrollingState {
&mut self.state
}
fn subimage(&self, index: usize) -> &BitImage {
font::character(self.message[index])
}
}
impl Render for ScrollingStaticText {
fn brightness_at(&self, x: usize, y: usize) -> u8 {
self.current_brightness_at(x, y)
}
}
#[derive(Copy, Clone)]
pub struct ScrollingBufferedText {
length: usize,
message: [u8; 128],
state: ScrollingState,
}
impl ScrollingBufferedText {
pub fn set_message(&mut self, message: &[u8]) {
assert!(message.len() <= 128, "message too long");
self.length = message.len();
self.message[..self.length].copy_from_slice(message);
self.reset();
}
}
impl Default for ScrollingBufferedText {
fn default() -> ScrollingBufferedText {
ScrollingBufferedText {
length: 0,
message: [0; 128],
state: Default::default(),
}
}
}
impl Scrollable for ScrollingBufferedText {
type Subimage = BitImage;
fn length(&self) -> usize {
self.length
}
fn state(&self) -> &ScrollingState {
&self.state
}
fn state_mut(&mut self) -> &mut ScrollingState {
&mut self.state
}
fn subimage(&self, index: usize) -> &BitImage {
font::character(self.message[index])
}
}
impl Render for ScrollingBufferedText {
fn brightness_at(&self, x: usize, y: usize) -> u8 {
self.current_brightness_at(x, y)
}
}