embedded_menu/selection_indicator/style/
border.rsuse embedded_graphics::{
prelude::{DrawTarget, Size},
primitives::{Primitive, PrimitiveStyle, Rectangle},
Drawable,
};
use crate::{
interaction::InputState,
selection_indicator::{
style::{interpolate, IndicatorStyle},
Insets,
},
theme::Theme,
};
#[derive(Clone, Copy)]
pub struct Border;
impl IndicatorStyle for Border {
type Shape = Rectangle;
type State = ();
fn padding(&self, _state: &Self::State, _height: i32) -> Insets {
Insets {
left: 2,
top: 1,
right: 1,
bottom: 1,
}
}
fn shape(&self, _state: &Self::State, bounds: Rectangle, _fill_width: u32) -> Self::Shape {
bounds
}
fn draw<T, D>(
&self,
_state: &Self::State,
input_state: InputState,
theme: &T,
display: &mut D,
) -> Result<Self::Shape, D::Error>
where
T: Theme,
D: DrawTarget<Color = T::Color>,
{
let display_area = display.bounding_box();
let fill_width = if let InputState::InProgress(progress) = input_state {
interpolate(progress as u32, 0, 255, 0, display_area.size.width)
} else {
0
};
display_area
.into_styled(PrimitiveStyle::with_stroke(theme.selection_color(), 1))
.draw(display)?;
Rectangle::new(
display_area.top_left,
Size::new(fill_width, display_area.size.height),
)
.into_styled(PrimitiveStyle::with_fill(theme.selection_color()))
.draw(display)?;
Ok(Rectangle::new(
display_area.top_left,
Size::new(fill_width, display_area.size.height),
))
}
}