aboutsummaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs165
1 files changed, 15 insertions, 150 deletions
diff --git a/src/main.rs b/src/main.rs
index 557f8ee..9dbed82 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,32 +1,29 @@
+mod app;
mod model;
-use gtk4 as gtk;
-
-use chrono::{Datelike, NaiveDate, NaiveTime, Weekday};
-use gtk::gdk::Display;
-use gtk::prelude::*;
+use chrono::{NaiveDate, NaiveTime};
use crate::model::event::{Event, Time};
-static DAYS: [&str; 7] = ["LUN", "MAR", "MER", "JEU", "VEN", "SAM", "DIM"];
-static MONTHES: [&str; 12] = [
- "Jan", "Fév", "Mar", "Avr", "Mai", "Juin", "Juil", "Aoû", "Sep", "Oct", "Nov", "Déc",
-];
-
fn main() {
- let mut events = [
+ let events = test_events();
+ app::run(events)
+}
+
+fn test_events() -> Vec<Event> {
+ [
Event {
- date: NaiveDate::from_ymd(2021, 11, 22),
+ date: NaiveDate::from_ymd(2021, 11, 29),
time: Time::AllDay,
name: "Début de la semaine".to_string(),
},
Event {
- date: NaiveDate::from_ymd(2021, 11, 26),
+ date: NaiveDate::from_ymd(2021, 12, 4),
time: Time::AllDay,
name: "Fin de la semaine".to_string(),
},
Event {
- date: NaiveDate::from_ymd(2021, 11, 26),
+ date: NaiveDate::from_ymd(2021, 12, 4),
time: Time::Time {
start: NaiveTime::from_hms(15, 0, 0),
end: Some(NaiveTime::from_hms(15, 30, 0)),
@@ -34,7 +31,7 @@ fn main() {
name: "Appel".to_string(),
},
Event {
- date: NaiveDate::from_ymd(2021, 11, 26),
+ date: NaiveDate::from_ymd(2021, 12, 4),
time: Time::Time {
start: NaiveTime::from_hms(12, 0, 0),
end: Some(NaiveTime::from_hms(14, 0, 0)),
@@ -42,7 +39,7 @@ fn main() {
name: "Repas".to_string(),
},
Event {
- date: NaiveDate::from_ymd(2021, 11, 26),
+ date: NaiveDate::from_ymd(2021, 12, 4),
time: Time::Time {
start: NaiveTime::from_hms(8, 0, 0),
end: None,
@@ -50,7 +47,7 @@ fn main() {
name: "Promener le chien".to_string(),
},
Event {
- date: NaiveDate::from_ymd(2021, 11, 26),
+ date: NaiveDate::from_ymd(2021, 12, 4),
time: Time::Time {
start: NaiveTime::from_hms(9, 0, 0),
end: None,
@@ -58,137 +55,5 @@ fn main() {
name: "Thé".to_string(),
},
]
- .to_vec();
- events.sort_by_key(|e| e.time);
- let application = gtk::Application::new(Some("me.guyonvarch.calendar"), Default::default());
- application.connect_startup(move |app| build_ui(app, &events));
- application.run();
-}
-
-fn build_ui(app: &gtk::Application, events: &Vec<Event>) {
- let window = gtk::ApplicationWindow::new(app);
- window.set_title(Some("Calendar"));
- window.set_default_size(800, 600);
-
- load_style();
-
- let grid = gtk::Grid::builder().build();
-
- window.set_child(Some(&grid));
-
- for col in 0..7 {
- grid.attach(&day_title(col), col, 0, 1, 1);
- }
-
- let today = chrono::offset::Local::today().naive_utc();
- let last_monday = NaiveDate::from_isoywd(today.year(), today.iso_week().week(), Weekday::Mon);
-
- let mut d = last_monday;
- for row in 1..5 {
- for col in 0..7 {
- grid.attach(&day_entry(&d, &today, &events), col, row, 1, 1);
- d = d.succ();
- }
- }
-
- window.show();
-}
-
-fn load_style() {
- let provider = gtk::CssProvider::new();
- provider.load_from_data(include_bytes!("style.css"));
- gtk::StyleContext::add_provider_for_display(
- &Display::default().expect("Error initializing gtk css provider."),
- &provider,
- gtk::STYLE_PROVIDER_PRIORITY_APPLICATION,
- );
-}
-
-fn day_title(col: i32) -> gtk::Box {
- let vbox = gtk::Box::builder()
- .orientation(gtk::Orientation::Vertical)
- .build();
-
- vbox.add_css_class("g-Calendar__DayTitle");
-
- let label = gtk::Label::builder().label(DAYS[col as usize]).build();
-
- vbox.append(&label);
-
- vbox
-}
-
-fn day_entry(date: &NaiveDate, today: &NaiveDate, events: &Vec<Event>) -> gtk::ScrolledWindow {
- let vbox = gtk::Box::builder()
- .orientation(gtk::Orientation::Vertical)
- .build();
-
- vbox.add_css_class("g-Calendar__Day");
-
- if date == today {
- vbox.add_css_class("g-Calendar__Day--Today");
- }
-
- vbox.append(&day_label(date));
-
- let events = events
- .iter()
- .filter(|e| e.date == *date)
- .collect::<Vec<&Event>>();
-
- if !events.is_empty() {
- vbox.append(&day_events(events));
- }
-
- let scrolled_window = gtk::ScrolledWindow::builder()
- .hscrollbar_policy(gtk::PolicyType::Never)
- .hexpand(true)
- .vexpand(true)
- .child(&vbox)
- .build();
-
- scrolled_window
-}
-
-fn day_label(date: &NaiveDate) -> gtk::Label {
- let label = gtk::Label::builder()
- .label(&format!(
- "{} {}",
- date.day(),
- MONTHES[date.month0() as usize]
- ))
- .halign(gtk::Align::Start)
- .build();
-
- label.add_css_class("g-Calendar__DayNumber");
-
- label
-}
-
-fn day_events(events: Vec<&Event>) -> gtk::Box {
- let vbox = gtk::Box::builder()
- .orientation(gtk::Orientation::Vertical)
- .build();
-
- for event in events {
- let hbox = gtk::Box::builder()
- .orientation(gtk::Orientation::Horizontal)
- .hexpand(true)
- .build();
-
- hbox.add_css_class("g-Calendar__DayEvent");
-
- let event_txt = &event.pprint();
- let label = gtk::Label::builder()
- .label(&event_txt)
- .ellipsize(pango::EllipsizeMode::End)
- .tooltip_text(&event_txt)
- .halign(gtk::Align::Start)
- .build();
-
- hbox.append(&label);
- vbox.append(&hbox);
- }
-
- vbox
+ .to_vec()
}