use crate::{
alignment::{HorizontalTextAlignment, VerticalTextAlignment},
rendering::cursor::Cursor,
style::vertical_overdraw::VerticalOverdraw,
StyledTextBox,
};
use core::ops::Range;
use embedded_graphics::prelude::*;
pub trait HeightMode: Copy {
fn apply<C, F, A, V, H>(text_box: &mut StyledTextBox<'_, C, F, A, V, H>)
where
C: PixelColor,
F: Font + Copy,
A: HorizontalTextAlignment,
V: VerticalTextAlignment,
H: HeightMode;
fn calculate_displayed_row_range<F: Font>(cursor: &Cursor<F>) -> Range<i32>;
}
#[derive(Copy, Clone, Debug)]
pub struct Exact<OV: VerticalOverdraw>(pub OV);
impl<OV> HeightMode for Exact<OV>
where
OV: VerticalOverdraw,
{
#[inline]
fn apply<C, F, A, V, H>(_text_box: &mut StyledTextBox<'_, C, F, A, V, H>)
where
C: PixelColor,
F: Font + Copy,
A: HorizontalTextAlignment,
V: VerticalTextAlignment,
H: HeightMode,
{
}
#[inline]
fn calculate_displayed_row_range<F: Font>(cursor: &Cursor<F>) -> Range<i32> {
OV::calculate_displayed_row_range(cursor)
}
}
#[derive(Copy, Clone, Debug)]
pub struct FitToText;
impl HeightMode for FitToText {
#[inline]
fn apply<C, F, A, V, H>(text_box: &mut StyledTextBox<'_, C, F, A, V, H>)
where
C: PixelColor,
F: Font + Copy,
A: HorizontalTextAlignment,
V: VerticalTextAlignment,
H: HeightMode,
{
text_box.fit_height();
}
#[inline]
fn calculate_displayed_row_range<F: Font>(_: &Cursor<F>) -> Range<i32> {
0..F::CHARACTER_SIZE.height as i32
}
}
#[derive(Copy, Clone, Debug)]
pub struct ShrinkToText<OV: VerticalOverdraw>(pub OV);
impl<OV> HeightMode for ShrinkToText<OV>
where
OV: VerticalOverdraw,
{
#[inline]
fn apply<C, F, A, V, H>(text_box: &mut StyledTextBox<'_, C, F, A, V, H>)
where
C: PixelColor,
F: Font + Copy,
A: HorizontalTextAlignment,
V: VerticalTextAlignment,
H: HeightMode,
{
text_box.fit_height_limited(text_box.size().height);
}
#[inline]
fn calculate_displayed_row_range<F: Font>(cursor: &Cursor<F>) -> Range<i32> {
OV::calculate_displayed_row_range(cursor)
}
}