Start adding support for events
Signed-off-by: Fabrizio Iannetti <fabrizio.iannetti@gmail.com>
This commit is contained in:
parent
966752614a
commit
7085a2eed8
|
@ -1,6 +1,9 @@
|
||||||
//! Simple calendar applications.
|
//! Simple calendar applications.
|
||||||
mod ui;
|
mod ui;
|
||||||
|
mod model;
|
||||||
|
|
||||||
use ui::calendar;
|
use ui::calendar;
|
||||||
|
use model::events::EventsCollection;
|
||||||
|
|
||||||
use chrono::{Datelike, NaiveDate, Months, Utc};
|
use chrono::{Datelike, NaiveDate, Months, Utc};
|
||||||
use calendar::{CalendarMonthView, CalendarYearView, CalendarParams };
|
use calendar::{CalendarMonthView, CalendarYearView, CalendarParams };
|
||||||
|
@ -27,6 +30,7 @@ pub fn main() -> iced::Result {
|
||||||
struct CalendarApp {
|
struct CalendarApp {
|
||||||
month: NaiveDate,
|
month: NaiveDate,
|
||||||
controls: Controls,
|
controls: Controls,
|
||||||
|
events: EventsCollection,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy)]
|
#[derive(Debug, Clone, Copy)]
|
||||||
|
@ -119,6 +123,7 @@ impl Application for CalendarApp {
|
||||||
let month = Utc::today().naive_local();
|
let month = Utc::today().naive_local();
|
||||||
(CalendarApp {
|
(CalendarApp {
|
||||||
month,
|
month,
|
||||||
|
events: EventsCollection::new(),
|
||||||
..CalendarApp::default()
|
..CalendarApp::default()
|
||||||
}, Command::none())
|
}, Command::none())
|
||||||
}
|
}
|
||||||
|
@ -163,7 +168,7 @@ impl Application for CalendarApp {
|
||||||
;
|
;
|
||||||
|
|
||||||
match self.controls.mode {
|
match self.controls.mode {
|
||||||
Some(ViewMode::Year) => content = content.push(CalendarYearView::new(&CalendarParams::new(), self.month)),
|
Some(ViewMode::Year) => content = content.push(CalendarYearView::new(&CalendarParams::new(), self.month, &self.events)),
|
||||||
Some(ViewMode::Month) | None => content = content.push(CalendarMonthView::new(&CalendarParams::new(), self.month)),
|
Some(ViewMode::Month) | None => content = content.push(CalendarMonthView::new(&CalendarParams::new(), self.month)),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
pub mod events;
|
|
@ -0,0 +1,51 @@
|
||||||
|
use chrono::NaiveDate;
|
||||||
|
use std::vec::Vec;
|
||||||
|
use std::default::Default;
|
||||||
|
|
||||||
|
pub struct Event {
|
||||||
|
begin: NaiveDate,
|
||||||
|
end: NaiveDate,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Event {
|
||||||
|
fn is_in_day(&self, day: NaiveDate) -> bool {
|
||||||
|
day >= self.begin && day <= self.end
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct EventsCollection {
|
||||||
|
events: Vec<Event>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl EventsCollection {
|
||||||
|
pub fn new() -> Self {
|
||||||
|
EventsCollection {
|
||||||
|
// TODO: hard-coded events
|
||||||
|
events: vec![
|
||||||
|
Event {
|
||||||
|
begin: NaiveDate::from_ymd_opt(2023, 01, 15).unwrap(),
|
||||||
|
end: NaiveDate::from_ymd_opt(2023, 01, 16).unwrap(),
|
||||||
|
},
|
||||||
|
Event {
|
||||||
|
begin: NaiveDate::from_ymd_opt(2023, 01, 16).unwrap(),
|
||||||
|
end: NaiveDate::from_ymd_opt(2023, 01, 17).unwrap(),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn is_any_in_day(&self, day: NaiveDate) -> bool {
|
||||||
|
for ev_day in &self.events {
|
||||||
|
if ev_day.is_in_day(day) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for EventsCollection {
|
||||||
|
fn default() -> EventsCollection {
|
||||||
|
EventsCollection::new()
|
||||||
|
}
|
||||||
|
}
|
|
@ -16,6 +16,7 @@ use iced_native::alignment;
|
||||||
use iced_native::widget::Tree;
|
use iced_native::widget::Tree;
|
||||||
use chrono::{NaiveDate, Datelike, Duration, Local};
|
use chrono::{NaiveDate, Datelike, Duration, Local};
|
||||||
use super::basics::CellGrid;
|
use super::basics::CellGrid;
|
||||||
|
use crate::model::events::{Event, EventsCollection};
|
||||||
|
|
||||||
const MONTH_NAMES: [&str;12] = [
|
const MONTH_NAMES: [&str;12] = [
|
||||||
"gen",
|
"gen",
|
||||||
|
@ -46,6 +47,8 @@ pub struct CalendarParams {
|
||||||
day_weekend_bg: Color,
|
day_weekend_bg: Color,
|
||||||
day_today_bg: Color,
|
day_today_bg: Color,
|
||||||
day_text_margin: f32,
|
day_text_margin: f32,
|
||||||
|
|
||||||
|
ev_bg: Color,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CalendarParams {
|
impl CalendarParams {
|
||||||
|
@ -59,6 +62,7 @@ impl CalendarParams {
|
||||||
day_other_month_fg: Color::from_rgb8(220, 220, 220),
|
day_other_month_fg: Color::from_rgb8(220, 220, 220),
|
||||||
day_weekend_bg: Color::from_rgb8(245, 245, 245),
|
day_weekend_bg: Color::from_rgb8(245, 245, 245),
|
||||||
day_text_margin: 5.0,
|
day_text_margin: 5.0,
|
||||||
|
ev_bg: Color::from_rgb8(100, 100, 245)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -350,16 +354,17 @@ where
|
||||||
|
|
||||||
//-------------------------------------------------------------------------
|
//-------------------------------------------------------------------------
|
||||||
|
|
||||||
pub struct CalendarYearView {
|
pub struct CalendarYearView<'a> {
|
||||||
first_day: NaiveDate,
|
first_day: NaiveDate,
|
||||||
first_day_in_view: NaiveDate,
|
first_day_in_view: NaiveDate,
|
||||||
params: CalendarParams,
|
params: CalendarParams,
|
||||||
month_column_font_size: f32,
|
month_column_font_size: f32,
|
||||||
margin: f32,
|
margin: f32,
|
||||||
|
events: &'a EventsCollection,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CalendarYearView {
|
impl<'a> CalendarYearView<'a> {
|
||||||
pub fn new(params: &CalendarParams, day: NaiveDate) -> Self {
|
pub fn new(params: &CalendarParams, day: NaiveDate, events: &'a EventsCollection) -> Self {
|
||||||
// first day of the year
|
// first day of the year
|
||||||
let first_day = NaiveDate::from_ymd(day.year(), 1, 1);
|
let first_day = NaiveDate::from_ymd(day.year(), 1, 1);
|
||||||
|
|
||||||
|
@ -374,7 +379,8 @@ impl CalendarYearView {
|
||||||
first_day_in_view,
|
first_day_in_view,
|
||||||
params: params.clone(),
|
params: params.clone(),
|
||||||
month_column_font_size: 24.0,
|
month_column_font_size: 24.0,
|
||||||
margin: 10.0
|
margin: 10.0,
|
||||||
|
events
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -537,6 +543,8 @@ impl CalendarYearView {
|
||||||
self.params.day_today_bg
|
self.params.day_today_bg
|
||||||
} else if weekday > 4 {
|
} else if weekday > 4 {
|
||||||
self.params.day_weekend_bg
|
self.params.day_weekend_bg
|
||||||
|
} else if self.events.is_any_in_day(current_day) {
|
||||||
|
self.params.ev_bg
|
||||||
} else {
|
} else {
|
||||||
Color::TRANSPARENT
|
Color::TRANSPARENT
|
||||||
};
|
};
|
||||||
|
@ -580,7 +588,7 @@ impl CalendarYearView {
|
||||||
|
|
||||||
} // CalendarYearView
|
} // CalendarYearView
|
||||||
|
|
||||||
impl<Message, Renderer> Widget<Message, Renderer> for CalendarYearView
|
impl<Message, Renderer> Widget<Message, Renderer> for CalendarYearView<'_>
|
||||||
where
|
where
|
||||||
Renderer: text::Renderer,
|
Renderer: text::Renderer,
|
||||||
{
|
{
|
||||||
|
@ -646,11 +654,11 @@ where
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, Message, Renderer> From<CalendarYearView> for Element<'a, Message, Renderer>
|
impl<'a, Message, Renderer> From<CalendarYearView<'a>> for Element<'a, Message, Renderer>
|
||||||
where
|
where
|
||||||
Renderer: text::Renderer,
|
Renderer: text::Renderer,
|
||||||
{
|
{
|
||||||
fn from(year_view: CalendarYearView) -> Self {
|
fn from(year_view: CalendarYearView<'a>) -> Self {
|
||||||
Self::new(year_view)
|
Self::new(year_view)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue