Add component trait and vsplit

Ilya 2022-04-15 23:45:35 +02:00
parent 5562b57ea5
commit 4d33d5f23e
4 changed files with 125 additions and 4 deletions

View File

@ -14,6 +14,8 @@ use embedded_graphics::{
use embedded_layout::prelude::*;
use num_traits::cast::FromPrimitive;
use crate::Component;
fn font(height: u32) -> MonoFont<'static> {
if height < 8 {
return FONT_4X6;
@ -315,7 +317,30 @@ pub struct ScrollingCalendar<C> {
pub size: Size,
pub style: ComponentStyle<C>,
pub day: chrono::NaiveDate,
pub weeks: u32,
pub prev_weeks: u32,
pub next_weeks: u32,
}
impl<C> ScrollingCalendar<C> {
pub fn new(style: ComponentStyle<C>, prev_weeks: u32, next_weeks: u32) -> Self {
Self {
top_left: Point::new(0, 0),
size: Size::new(0, 0),
style,
day: chrono::Local::now().naive_local().date(),
prev_weeks,
next_weeks,
}
}
}
impl<C> Component for ScrollingCalendar<C> {
fn set_size(&mut self, size: Size) {
self.size = size;
}
fn set_top_left(&mut self, top_left: Point) {
self.top_left = top_left;
}
}
impl<C> Drawable for ScrollingCalendar<C>
@ -329,15 +354,16 @@ where
where
D: DrawTarget<Color = C>,
{
let height = self.size.height / (1 + self.weeks * 2);
let total_weeks = self.prev_weeks + 1 + self.next_weeks;
let height = self.size.height / total_weeks;
let mut week = ScrollingWeek::from_date(
self
.day
.checked_sub_signed(chrono::Duration::days(self.weeks as i64 * 7))
.checked_sub_signed(chrono::Duration::days(self.prev_weeks as i64 * 7))
.unwrap(),
);
for i in 0..(1 + self.weeks * 2) {
for i in 0..total_weeks {
week = week.succ();
let calendar_week = CalendarWeek {

82
src/frame.rs Normal file
View File

@ -0,0 +1,82 @@
use embedded_graphics::{pixelcolor::BinaryColor, prelude::*};
use embedded_layout::View;
pub trait Component {
fn set_top_left(&mut self, top_left: Point);
fn set_size(&mut self, size: Size);
}
pub struct Frame {
//drawable: Component,
pub weight: f32,
}
pub struct VSplit<T, U> {
pub top_left: Point,
pub size: Size,
pub left: T,
pub right: U,
pub ratio: f32,
}
impl<T, U> VSplit<T, U> {
pub fn new(left: T, right: U) -> Self {
VSplit {
top_left: Point::new(0, 0),
size: Size::new(0, 0),
left,
right,
ratio: 0.5,
}
}
}
impl<C, T, U> Component for VSplit<T, U>
where
C: PixelColor + From<BinaryColor>,
T: Drawable<Color = C>,
U: Drawable<Color = C>,
{
fn set_top_left(&mut self, top_left: Point) {
self.top_left = top_left;
}
fn set_size(&mut self, size: Size) {
self.size = size;
}
}
impl<C, T, U> Drawable for VSplit<T, U>
where
C: PixelColor + From<BinaryColor>,
T: Drawable<Color = C> + Component + Clone,
U: Drawable<Color = C> + Component + Clone,
{
type Color = C;
type Output = ();
fn draw<D>(&self, target: &mut D) -> Result<Self::Output, D::Error>
where
D: DrawTarget<Color = C>,
{
let left_width = (self.size.width as f32 * self.ratio) as u32;
let mut left = self.left.clone();
left.set_top_left(self.top_left);
left.set_size(Size::new(self.size.height, left_width));
let mut right = self.right.clone();
right.set_top_left(Point::new(left_width as i32, 0));
right.set_size(Size::new(self.size.height, self.size.width - left_width));
left.draw(target)?;
right.draw(target)?;
Ok(())
}
}
pub struct HSplit<T> {
pub top_left: Point,
pub size: Size,
pub top: T,
pub bottom: T,
}

View File

@ -1,11 +1,13 @@
mod bullet_counter;
mod calendar;
mod frame;
mod gauge;
mod list_item;
mod style;
pub use bullet_counter::BulletCounter;
pub use calendar::{Calendar, ScrollingCalendar};
pub use frame::{Component, HSplit, VSplit};
pub use gauge::Gauge;
pub use list_item::{List, ListItem, ListItemData};
pub use style::ComponentStyle;

View File

@ -11,6 +11,8 @@ use embedded_graphics::{
};
use embedded_layout::prelude::*;
use crate::Component;
pub struct ListItemData {
pub text: String,
pub icon: String,
@ -39,6 +41,15 @@ pub struct List<C> {
pub list_items: Vec<ListItemData>,
}
impl<C> Component for List<C> {
fn set_size(&mut self, size: Size) {
self.size = size;
}
fn set_top_left(&mut self, top_left: Point) {
self.top_left = top_left;
}
}
impl<C> Drawable for List<C>
where
C: PixelColor + From<BinaryColor>,